【问题标题】:Selenium Chromedriver not waiting and throwing ElementNotFound when using WebDriverWait until findelementSelenium Chromedriver 在使用 WebDriverWait 直到 findelement 时不等待并抛出 ElementNotFound
【发布时间】:2020-10-30 07:14:57
【问题描述】:
    async Task RunWorker(ConcurrentQueue<string> idList)
    {
        var driver = new ChromeDriver();
        while (idList.TryDequeue( out var nextId ))
        {
            var url = GetNextUrl( nextId );
            driver.Navigate().GoToUrl( url );
            var waiter = new WebDriverWait( driver, TimeSpan.FromSeconds(10)  );                  
            waiter.Until( driver => driver.FindElement( By.XPath( "//div[@id='DocumentdetailsDiv']" ) ) );
        }
        driver.Quit();    
    }

waiter.Until 立即抛出 ElementNotFound 异常,无需显式等待 10 秒。奇怪的是,如果我调试程序,并等待 1 秒钟直到我运行直到,那么它会按预期等待。不确定我做错了什么,因为我看到的所有示例代码都使用相同的方法。

【问题讨论】:

  • 不知道为什么会这样,但您可能不需要在这里等待。导航到 URL 时,Selenium 已经等待页面就绪状态。
  • 检查您的 xpath 是否匹配多个元素?如果是,则 find 元素将仅使用第一个匹配元素,因此请确保它是第一个匹配元素,如果不是,则更改 xpath。

标签: c# selenium selenium-chromedriver


【解决方案1】:

Selenium WEB Driver 有两种等待类型

  1. 隐式等待
  2. 显式等待

在您的情况下,您使用了“隐式等待”并使用了隐式等待超时条件不支持的“FindElement”方法。

请使用“显式等待”和“流畅等待” 语法:

Wait wait = new FluentWait(WebDriver reference)

.withTimeout(超时,秒) .pollingEvery(超时,秒) .ignoring(Exception.class);

应用 Explicit FluentWait 后,您的代码将如下所示

async Task RunWorker(ConcurrentQueue<string> idList)
{
    var driver = new ChromeDriver();
    while (idList.TryDequeue( out var nextId ))
    {
        var url = GetNextUrl( nextId );
        driver.Navigate().GoToUrl( url );
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)                            
        .withTimeout(30, TimeUnit.SECONDS)          
        .pollingEvery(5, TimeUnit.SECONDS)          
        .ignoring(NoSuchElementException.class);

        WebElement clickseleniumlink = wait.until(new Function<WebDriver, WebElement>(){

        public WebElement apply(WebDriver driver ) {
            return driver.findElement(By.xpath("//div[@id='DocumentdetailsDiv']"));
           }
       });

    //click on the selenium link
    clickseleniumlink.click();
    }
    driver.Quit();    
}

请更新上面的代码以匹配您的对象名称,我只应用了序列。

您可以在此处找到更多详细信息,参考:https://www.guru99.com/implicit-explicit-waits-selenium.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2022-01-16
    • 2019-12-02
    相关资源
    最近更新 更多