等待直到元素可单击不会正确超时

时间:2019-07-17 08:14:45

标签: selenium selenium-webdriver webdriver webdriverwait pageloadtimeout

我在处理超时方面遇到一些问题,因为它似乎并非在每种情况下都有效。我将超时定义如下:

 wait = new FluentWait<WebDriver>(driver)
    .withTimeout(Duration.ofSeconds(60))
    .pollingEvery(Duration.ofSeconds(1))
    .ignoring(NoSuchElementException.class);

现在,当我想等到页面上出现一个元素时,我就使用这段代码:

wait.until(ExpectedConditions.presenceOfElementLocated(locator));

它在大多数情况下都可以工作(等待元素,并在60秒后超时),但是最近我们遇到了一些卡住加载页面的麻烦(底部有一条消息正在等待...页面左侧)。发生这种情况时,我意识到这段代码无法正常工作。它不会在60秒后超时,但会在10分钟后超时。

编辑:实际上,为了进一步研究我的问题,我意识到它确实来自另一行也包含等待的代码:

wait.until(ExpectedConditions.elementToBeClickable(locator));

基本上,我单击一个重定向到另一个页面的链接,等待一个按钮出现,等待该按钮可单击,然后单击该按钮。因此,它会检测到该按钮存在,但是会等待它被单击,并且在60秒后不会超时。

因此,当我定义驱动程序时,我添加了以下行:

driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);

在控制台中,我看到以下行:     超时从渲染器接收消息:60.000

但是如何捕获此异常?我试图用try / catch包围我的等待,但这没用。

try {
wait.until(ExpectedConditions.elementToBeClickable(locator));
} catch (Exception e) {
logger.info("TEST");
throw new TimeoutException("element " + locator.toString() + " not found on the page");
}

我该怎么办?谢谢。

1 个答案:

答案 0 :(得分:0)

您需要注意以下几点:

  • 如果您的用例要获取任何属性,例如,等待直到页面上出现某个元素,这对您没有多大帮助。元素的 classname innerHTML 等,或在元素上调用click()
  • 根据您的用例,您需要使用visibilityOfElementLocated()elementToBeClickable()
  • 您可以在以下位置找到一些详细的讨论:
  • 代码行wait.until(ExpectedConditions.presenceOfElementLocated(locator)) 60秒后没有超时,但在 10分钟后仍未超时的原因可能是由于使用WebDriverWait,您还配置了Implicit Wait,并且根据documentation混合使用Implicit WaitExplicit Wait可能会导致unpredictable wait times
  • 要配置pageLoadTimeout,可以使用以下代码块:

    • 代码块:

      System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
      WebDriver driver = new ChromeDriver();
      
      driver.manage().timeouts().pageLoadTimeout(2, TimeUnit.SECONDS);
      try{
        driver.get("https://www.booking.com/hotel/in/the-taj-mahal-palace-tower.html?label=gen173nr-1FCAEoggJCAlhYSDNiBW5vcmVmaGyIAQGYATG4AQbIAQzYAQHoAQH4AQKSAgF5qAID;sid=338ad58d8e83c71e6aa78c67a2996616;dest_id=-2092174;dest_type=city;dist=0;group_adults=2;hip_dst=1;hpos=1;room1=A%2CA;sb_price_type=total;srfid=ccd41231d2f37b82d695970f081412152a59586aX1;srpvid=c71751e539ea01ce;type=total;ucfs=1&#hotelTmpl");
      }catch(WebDriverException e){
        System.out.println("WebDriverException occured");
        }
      driver.quit();
      
    • 控制台输出:

      INFO: Detected dialect: W3C
      [1563377008.449][SEVERE]: Timed out receiving message from renderer: 1.999
      [1563377008.450][SEVERE]: Timed out receiving message from renderer: -0.001
      [1563377008.461][SEVERE]: Timed out receiving message from renderer: -0.012
      [1563377010.466][SEVERE]: Timed out receiving message from renderer: 1.998
      [1563377010.467][SEVERE]: Timed out receiving message from renderer: -0.001
      [1563377010.476][SEVERE]: Timed out receiving message from renderer: -0.010
      WebDriverException occured
      
  • 您可以在pageLoadTimeout in Selenium not working

  • 中找到相关的详细讨论