如何在页面加载前使用 Selenium ChromeDriver C# 导航页面?

4
我正在为客户的网站测试数据流。该网站有广告,其加载时间明显长于我想要用Selenium命令测试的每个页面的数据元素。
我无法控制广告,也无法将其静音。我希望在完整页面加载之前通过点击来浏览每个页面。我知道这是可能的,因为我可以手动使用鼠标进行操作。然而,尽管我尝试了很多次,但顽固的chromeDriver仍不会开始自动化,直到整个页面加载完成。
我使用的是C# .Net 4.6.1、chrome32_55.0.2883.75和Selenium版本3.0.1.0。此外,我正在使用推荐的Selenium页面对象模型。我像这样实现了WaitForLoad():
    public override void WaitForLoad()
    {
        _isLoaded = Wait.Until(d =>
        {
            lock (d)
            {
                SwitchToSelf();

                return PageRegex.IsMatch(Session.Driver.PageSource);                    
            }
        });
    } 

上面的PageRegex可以起作用,但只有在完整页面加载后才能使用。这很令人沮丧,因为我可以看到屏幕上设计要解析的文本字符串。这让我相信在其他地方有一个设置,或者可能当我配置ChromeDriver时,会使我能够在完全加载之前解析Session.Driver.PageSource。
这是我实例化ChromeDriver的方式:
            var options = new ChromeOptions();

            options.AddArguments("test-type");


            options.AddArgument("incognito"); // works
            options.AddArgument("--disable-bundled-ppapi-flash"); // works! this turns off shockwave
            options.AddArgument("--disable-extensions"); // works
            options.AddArguments("--start-fullscreen");

            string workFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) +
                                                 "\\SHARED";

            options.BinaryLocation = workFolder + @"\Chrome32\chrome32_55.0.2883.75\chrome.exe";
            var driver = new ChromeDriver(options);
            driver.Manage().Cookies.DeleteAllCookies();
            return driver;
3个回答

7

要在页面加载完成之前与其交互,您可以降低超时时间并捕获异常:

IWebDriver driver = new ChromeDriver();
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));

driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromMilliseconds(500));

try {
    driver.Navigate().GoToUrl("http://www.deelay.me/5000/http://www.deelay.me/");
} catch (OpenQA.Selenium.WebDriverTimeoutException) { }

// waits for an element 
var body = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("body")));

或者您可以通过将页面加载策略设置为none来禁用等待:

var options = new ChromeOptions();
options.AddAdditionalCapability("pageLoadStrategy", "none", true);

IWebDriver driver = new ChromeDriver(options);
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));

driver.Navigate().GoToUrl("http://www.deelay.me/5000/http://www.deelay.me/");

// waits for an element 
var body = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("body")));

1
您尝试过ExpectedConditions类的ElementToBeClickable或VisibilityOfElementLocated方法吗?我认为它应该适用于您提到的场景。
WebDriverWait wdw = new WebDriverWait(driver, TimeSpan.FromSeconds(120));
            wdw.Until(ExpectedConditions.ElementToBeClickable(By.Id("ElementId")));

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接