繁体   English   中英

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

[英]Selenium ChromeDriver C# how to navigate page before it loads?

我正在测试客户网站的数据流。 它的广告加载时间比我希望用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只能在加载完整页面后才能工作。 这令人沮丧,因为我可以直观地看到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;

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

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")));

您是否尝试过使用ExpectedConditions类的ElementToBeClickable或VisibilityOfElementLocated方法。 我认为它应该适用于你提到的场景。

WebDriverWait wdw = new WebDriverWait(driver, TimeSpan.FromSeconds(120));
            wdw.Until(ExpectedConditions.ElementToBeClickable(By.Id("ElementId")));

我想在整个页面加载之前通过点击导航每个页面

在页面仍在加载时,您是否理解您想要点击某些链接? 如果您知道要单击哪些元素,也许您可​​以执行与此问题相同的操作如何在页面完全加载之前单击元素我卡住了,加载完成需要太多时间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM