为了账号安全,请及时绑定邮箱和手机立即绑定

如何等待 WebElement 出现在 DOM 中?

如何等待 WebElement 出现在 DOM 中?

慕虎7371278 2022-06-23 20:52:14
目前我正在寻找一种解决方案来等待特定的 WebElement 出现在网站 DOM 中。目前我已经设置了以下使用 By 定位器的方法,但是我希望使用 WebElement 来代替,有什么想法吗?根据 JavaDocs:public static ExpectedCondition visibilityOf(WebElement element):用于检查已知存在于页面DOM上的元素是否可见的期望。可见性意味着元素不仅被显示,而且其高度和宽度都大于 0。上面的这个现有方法检查元素是否可见并且是否存在于 DOM 中,但不仅存在于 DOM 中。当前使用 By 而不是 WebElement 的方法:我可以从阅读 selenium 文档中看到,您可以等待元素的存在在 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) {    }}
查看完整描述

4 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

几个问题:

  1. 存在意味着它存在于 DOM 中,但不一定是可见的、可点击的等。如果您希望元素可见,则等待可见。

  2. 您正在使用*Elements*which 是复数,它将等待定位器找到的所有元素,而不仅仅是您专门寻找的元素。如果您没有唯一的定位器,这可能会导致混乱的失败等。如果你只想要单数,我会避免使用复数。

  3. 您应该仔细阅读文档。有一种ExpectedConditions方法可以完全满足您的需求。

公共静态 ExpectedCondition visibilityOf(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.

    }

}


查看完整回答
反对 回复 2022-06-23
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

在public static ExpectedCondition visibilityOf(WebElement element): 检查已知存在于页面 DOM 上的元素是否可见之前,您是非常正确的。可见性意味着元素不仅被显示,而且具有大于 0 的高度和宽度。上述现有方法检查元素是否可见并且存在于 DOM 中,但不仅存在于 DOM 中

为简单起见,我将重新表述这个 ExpectedCondition,因为期望检查已知存在于页面 DOM 中的元素是可见的

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


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

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


总而言之,您不能将WebElement作为参数作为期望传递,presenceOfElementLocated()因为WebElement尚未被识别。但是一旦元素被识别,findElement()或者presenceOfElementLocated()这个WebElement可以被传递一个参数。

总结一下:

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

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


查看完整回答
反对 回复 2022-06-23
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

此方法“visibilityOfElementLocated”使用方式:

示例://等待元素可见

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


查看完整回答
反对 回复 2022-06-23
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

如何使用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;

    }


查看完整回答
反对 回复 2022-06-23
  • 4 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信