等待div显示

Pet*_*zov 3 java selenium selenium-webdriver

我有 Angular SPA 应用程序,它显示登录通知消息。我在 Java 中使用 Selenium Web 驱动程序:

   Thread.sleep(1500);
    
   WebElement element = failedLoginWebElement.findElement(By.xpath("//*[@id='toast-container']/div/div"));
Run Code Online (Sandbox Code Playgroud)

由于消息延迟,代码有时会失败。我如何实现一个侦听器,它会等待消息出现(例如 10 秒)?

小智 6

WaitsSelenium 中的测试用例是执行测试用例的基本代码片段之一。它运行在称为脚本的特定命令上,这些命令使页面加载。

Selenium 等待命令有两个部分

  • 隐式等待
  • 显式等待

Selenium 中的隐式等待

隐式等待是 Selenium 中的无条件等待命令。由于它是无条件的,因此它适用于网页上的所有 Web 元素。

这可以通过三个函数应用隐式等待:

  • 隐式等待()
  • 页面加载超时()
  • 设置脚本超时()

下面将重点介绍implicitlyWaits()

顾名思义,pageLoadTimeout()命令等待页面完全加载指定的秒数。该setScriptTimeout()命令等待网页的异步部分完成加载指定的秒数。

隐式等待()命令

在 中implicitlyWait(),WebDriver 将在尝试查找任何元素时轮询 DOM 以获取某些指定的时间单位。如果较早找到该元素,则测试将在该点执行,否则 WebDriver 将等待指定的持续时间。

前任:

import java.util.concurrent.TimeUnit;
Run Code Online (Sandbox Code Playgroud)
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
driver.get("https://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"))
Run Code Online (Sandbox Code Playgroud)

Selenium 中的显式等待

显式等待是 Selenium 中的一种条件等待策略,换句话说,您将一直等到指定的条件变为真或持续时间已过。

显式等待提供了以下使用条件:

  • 警报存在()
  • elementSelectionStateToBe()
  • elementToBeClickable()
  • 要选择的元素()
  • frameToBeAvaliableAndSwitchToIt()
  • invisibilityOfTheElementLocated()
  • invisibilityOfElementWithText()
  • 存在所有元素定位者()
  • 存在元素定位()
  • textToBePresentInElement()
  • textToBePresentInElementLocated()
  • textToBePresentInElementValue()
  • 标题Is()
  • 标题包含()
  • 可见性()
  • 所有元素的可见性()
  • VisibilityOfAllElementsLocatedBy()
  • 元素位置可见性()

两种类型的显式等待命令:

  • WebDriver等待
  • 流利等待

WebDriver等待

WebDriverWait指定WebDriver需要等待的条件和时间。实际上,WebDriverWait 和显式等待是同义词,因为它们的定义和用法完美匹配。

前任:

WebElement firstResult = new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.elementToBeClickable(By.xpath("//a/h3")));
Run Code Online (Sandbox Code Playgroud)

Selenium 中的流畅等待

流畅等待类似于 Selenium 中的显式等待,但多了一个频率参数(也称为轮询时间)。频率数字告诉 WebDriver 定期检查元素并等待“Duration.ofSeconds”的最大值。

前任:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
  .withTimeout(Duration.ofSeconds(30))
  .pollingEvery(Duration.ofSeconds(5))
  .ignoring(NoSuchElementException.class);
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,允许的最大等待时间指定为 30 秒 (Duration.ofSeconds(30)),轮询时间为 5 秒 (pollingEvery(Duration.ofSeconds(5)))。通过这种安排,WebDriver 将每 5 秒检查一次元素,最长检查时间为 30 秒。

对于上述问题,您可以使用隐式、显式等待命令。