当前位置: 首页 > 面试题库 >

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

曾飞雨
2023-03-14
问题内容

我在用:

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

隐式等待是否应该等到找到一个元素后再进行处理?如果我使用Explicit wait而不是我添加的代码,还会更好Thread.sleep()吗?


问题答案:

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

以下是显式等待与隐式等待之间的区别的简要概述:

显式等待:

  • 记录和定义的行为。
  • 在硒的本地部分运行(以你的代码语言显示)。
  • 可以在你能想到的任何条件下工作。
  • 返回成功或超时错误。
  • 可以将不存在元素定义为成功条件。
  • 可以自定义重试和异常之间的延迟以忽略。

隐式等待:

  • 没有记录和几乎不确定的行为。
  • 在硒的远程部分(控制浏览器的部分)中运行。
  • 仅适用于find元素方法。
  • 返回找到的元素或(在超时后)找不到的元素。
  • 如果检查是否缺少元素,则必须始终等到超时。
  • 除全局超时外,无法自定义。
  • 带有说明的代码示例。第一次隐式等待:
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*未定义如何等待。它取决于浏览器或操作系统或硒的版本。可能的实现方式是:

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

该列表是从观察和读取错误报告以及粗略读取硒源代码中收集的。

我的结论是:隐式等待是不好的。功能是有限的。该行为是未记录的,并且取决于实现。

显式等待可以做所有隐式等待可以做的一切。显式等待的唯一缺点是冗长的代码。但是这种冗长的表达使代码变得清晰。显式比隐式更好。对?



 类似资料:
  • 创建驱动程序时,我已将隐式等待设置为10秒。当我希望使用显式等待时,是否必须将隐式等待设置为0? 以下是一个示例: 我必须做webDriver.manage()。超时()。秒);还是没有必要?

  • 我如何用一个显式的替换这个隐式的等待呢? driver=新ChromeDriver(功能); driver.manage().DeleteAllCookies();

  • 驱动程序级别的隐式和显式等待之间有什么区别。哪一个是驱动级等待。如果我们在代码中提供隐式和显式等待。哪一个优先。

  • 问题内容: 当隐式等待少于显式等待时,就会发生误解: 总时间:8.613秒。隐式设置等待第二个较低:3000,结果为6.865秒。它是如何工作的?预先感谢! 问题答案: 那是个好问题。许多优秀的QA自动化专家为此大吃一惊。 隐式等待 每个上都有特殊的隐藏自动等待。如果在页面DOM结构中找不到元素,则原始Web驱动程序(js,python,java)会引发NoSuchElementException

  • 问题内容: 我是初学者。我了解基本等待的内容,但是我对互联网上的不同教程如何放置并进行解释感到困惑。例如,在下面的代码中,将其放置在加载URL之前。因此,是否只是等待URL加载或查找元素或两者兼而有之?的确,如果我在try块中使用一次隐式等待,它是否适用于我在代码中执行的每个元素搜索? 问题答案: 隐式等待 ImplicitWait按照该Java文档是指定的时间量 webdriver的 情况下,即

  • 我是初学者。我了解Wait的基本功能,但我对互联网上不同的教程如何放置和解释它感到困惑。例如,在下面的代码中,它是在加载URL之前放置的。那么,是只等待加载URL,还是等待查找元素,或者两者都是?如果我在try块中使用隐式等待一次,它将适用于我在代码中执行的每个元素搜索,这是真的吗?