显示进度条时如何暂停 Selenium 执行

How to pause Selenium execution when progress bar is shown

我有一个 Angular SPA 应用程序,我想将其自动化。当显示此进度条时:

<div _ngcontent-cln-c1="" class="ngx-loading-text center-center" style="top: calc(50% + 60px + 5px); color: white;">Loading...</div>

我想全局暂停 Java 代码的执行。如果此 div 可见,是否可以以某种方式暂停 Selenium?

你可以使用 webdriver 等等:

WebDriverWait wait = new WebDriverWait(driver,30);


wait.until(ExpectedConditions.stalenessOf(loadingelement)));

WebDriverWait wait = new WebDriverWait(driver,30);


wait.until(ExpectedConditions.invisibilityOf​(loadingelement)));

以上将等到加载元素不可见或陈旧(意味着修改或删除)

您还可以使用:

List<WebElement> elementName = driver.findElements(By.xpath("//div[@class=\"ngx-loading-text center-center\"]"));

while(elementlist.size()){
  Thread.sleep(1000)
  elementName = driver.findElements(By.xpath("//div[@class=\"ngx-loading-text center-center\"]"));
}

以上代码将检查 findelements 列表是否为空,否则等待 1 秒,然后再次尝试查找,循环继续直到大小为 0

invisibilityOf()

invisibilityOf(WebElement element) 定义为:

public static ExpectedCondition<java.lang.Boolean> invisibilityOf(WebElement element)

An expectation for checking the element to be invisible

这里的期望是,元素必须 present 以及 visible 作为前提条件,方法将等待使元素不可见。在这一点上值得一提的是,由于参数是 WebElement 类型,因此 findElement(By by) 必须成功定位元素作为前提。因此 NoSuchElementException 不能被 忽略 .


invisibilityOfElementLocated()

invisibilityOfElementLocated(By locator) 定义为:

public static ExpectedCondition<java.lang.Boolean> invisibilityOfElementLocated(By locator)

An expectation for checking that an element is either invisible or not present on the DOM.

这里的预期显然是元素已经 不可见不存在 HTML DOM 中。在这种情况下,主要任务是元素的缺失,甚至可能在 ExpectedCondition 被调用之前或在 时间跨度期间发生ExpectedCondition 处于活动状态。所以这里我们需要忽略NoSuchElementException作为强制措施。


这个用例

要暂停程序的执行,您需要引入 and you can use either of the following :

  • 使用invisibilityOf():

    new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOf(driver.findElement(By.xpath("//div[@class='ngx-loading-text center-center' and starts-with(., 'Loading')]"))));
    
  • 使用invisibilityOfElementLocated():

    new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@class='ngx-loading-text center-center' and starts-with(., 'Loading')]")));