gpt4 book ai didi

java - 何时在 Selenium Webdriver 中使用显式等待与隐式等待?

转载 作者:IT老高 更新时间:2023-10-28 20:39:33 24 4
gpt4 key购买 nike

我正在使用:

driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);

但是对于下面的元素它仍然连续失败

    driver.findElement(By.id("name")).clear();
driver.findElement(By.id("name")).sendKeys("Create_title_01");

我添加了等待码:

for (int second = 0;; second++) {
if (second >= 120) fail("timeout");
try { if (isElementPresent(By.id("name"))) break; } catch (Exception e) {}
Thread.sleep(1000);
}

不应该隐式等待处理等待直到找到一个元素吗?如果我使用显式等待而不是我添加的具有 Thread.sleep() 的代码也会更好吗?

最佳答案

TL;DR:始终使用显式等待。忘记存在隐式等待。


以下是显式等待和隐式等待之间区别的简要说明:

显式等待:

  • 记录和定义的行为。
  • 在 selenium 的本地部分运行(以您的代码语言)。
  • 适用于您能想到的任何条件。
  • 返回成功或超时错误。
  • 可以将元素的缺失定义为成功条件。
  • 可以自定义重试和忽略异常之间的延迟。

隐式等待:

  • 未记录且实际上未定义的行为。
  • 在 selenium 的远程部分(控制浏览器的部分)中运行。
  • 仅适用于查找元素方法。
  • 返回找到的元素或(超时后)未找到的元素。
  • 如果检查是否存在元素必须始终等到超时。
  • 除了全局超时之外,无法自定义。

带有解释的代码示例。第一个隐式等待:

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));

现在显式等待:

WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement myDynamicElement = wait.until(
ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

两个代码示例都做同样的事情。找到某个元素,如果 10 秒后没有找到则放弃。隐式等待只能做到这一点。它只能尝试找到一个超时的元素。显式等待的优势在于它可以等待各种条件。还可以自定义超时并忽略某些异常。

可能条件示例:elementToBeClickablenumberOfElementsToBeMoreThaninvisibilityOf。以下是内置预期条件的列表:https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html

更多解释:

隐式等待超时仅对 findElement* 方法有效。如果设置,则所有 findElement* 将在声明找不到元素之前“等待”设置的时间。

未定义 findElement* 将如何等待。它取决于浏览器或操作系统或 Selenium 的版本。可能的实现有:

  • 反复尝试查找元素,直到超时。找到元素后立即返回。
  • 尝试查找元素。等到超时。再试一次。
  • 等到超时。尝试查找元素。

此列表是通过观察和阅读错误报告以及粗略阅读 selenium 源代码而收集的。


我的结论:隐式等待是不好的。能力是有限的。该行为未记录并依赖于实现。

显式等待可以做所有隐式等待可以做的事情,甚至更多。显式等待的唯一缺点是代码更冗长。但是这种冗长使代码变得明确。显式优于隐式。对吧?


进一步阅读:

关于java - 何时在 Selenium Webdriver 中使用显式等待与隐式等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10404160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com