如何等待WebElement出现在DOM中?

时间:2019-02-18 15:11:27

标签: java selenium selenium-webdriver webdriver webdriverwait

目前,我正在寻找一种解决方案,以等待网站DOM中出现特定的WebElement。

当前,我已经设置了以下使用“按”定位符的方法,但是我想使用WebElement代替,有什么想法吗?

根据JavaDocs:

公共静态ExpectedCondition可视性Of(WebElement元素):期望检查一个已知在页面DOM上存在的元素是否可见。可见性意味着不仅显示元素,而且其高度和宽度都大于0。

上面的现有方法将检查元素是否可见并且是否在DOM中存在,不仅在DOM中存在。

使用By代替WebElement的当前方法: 从阅读硒文档可以看出,您可以等待元素的存在在DOM中可见。

一个例子:

public static void waitForElementToAppearInDOM(By by, int timer) {
    try {
        WebDriver driver = getDriver();
        WebDriverWait exists = new WebDriverWait(driver, timer);
        exists.until(ExpectedConditions.presenceOfAllElementsLocatedBy(by));
    } catch(Exception e) {

    }
}

6 个答案:

答案 0 :(得分:1)

一些问题:

  1. 存在表示存在于DOM中,但不一定可见,可单击等。如果您希望元素可见,请等待可见。
  2. 您正在使用*Elements*,它是复数形式,将等待定位器找到的 ALL 元素,而不仅仅是您专门寻找的元素。如果您没有唯一的定位器,则可能导致混乱的故障等。如果您只想单数,我会避免使用复数。
  3. 您应该仔细阅读the docs。存在一种ExpectedConditions方法可以完全满足您的需求。
  

公共静态ExpectedCondition可视性Of(WebElement元素)

您的代码应该看起来更像

public static void waitForElementToAppearInDOM(WebElement element, int timer) {
    try {
        new WebDriverWait(getDriver(), timer).until(ExpectedConditions.visibilityOf(element));
    } catch(Exception e) {
        // don't leave an empty catch, do something with it or don't catch it.
    }
}

答案 1 :(得分:0)

此方法“ visibilityOfElementLocated”的使用方式:

示例: //等待元素可见

WebDriverWait wait = new WebDriverWait(driver, 15);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='text3']")));

答案 2 :(得分:0)

如何使用WebElement作为参数检查状态。

    public boolean isElementPresent(WebElement element) {
        if (element != null) {
            try {
//this line checks the visibility but it's not returned. 
//It's to perform any operation on the WebElement
                element.isDisplayed(); 
                return true;
            } catch (NoSuchElementException e) {
                return false;
            } 
        } else return false;
    }

答案 3 :(得分:-1)

您是非常正确的,直到 public static ExpectedCondition visibleOf(WebElement element):期望检查一个已知在页面DOM上存在的元素是否可见。可见性意味着该元素不仅会显示,而且其高度和宽度大于0。上面的现有方法将检查该元素是否可见并且是否在DOM中存在,而不仅在DOM中存在

为简单起见,我将这个ExpectedCondition改写为可以看到一个检查页面DOM中已知元素的期望

粗略的两个期望presenceOfElementLocated()visibilityOf()之间有很多差异。


回到您的主要问题,使用 WebElement 作为参数来等待特定WebElement出现不可能。原因很简单,因为 WebElement 尚未在DOM中标识,只有在期望presenceOfElementLocatedfindElement()成功之后才能标识。

与元素的存在相关的 JavaDocs 中的ExpectedCondition列表突然支持了这一概念,如下所示:


最后,由于尚未确定 WebElement ,因此不能将 WebElement 作为参数传递给presenceOfElementLocated()作为期望。但是一旦通过findElement()presenceOfElementLocated()标识了元素,就可以向该 WebElement 传递参数。

总结:

  • presenceOfElementLocated(By locator):这种期望是为了检查元素是否在页面的DOM中存在。这并不一定意味着该元素可见

  • visibilityOf(WebElement element):这种期望是为了检查已知在页面DOM上存在的元素是否可见。可见性意味着该元素不仅显示,而且具有高度宽度,其大于0

答案 4 :(得分:-3)

也许您可以尝试这样:

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));

答案 5 :(得分:-3)

在代码中,您应将“ ID”或“ xpath”作为定位符。 查看ExpectedConditions上的文档 第5行如下所示:

getScale() <= getMediumScale()

另外,请看这个presence of element not same as visibility