如何等待 WebElement 出现在 DOM 中?

目前我正在寻找一种解决方案来等待特定的 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) {


    }

}


慕虎7371278
浏览 120回答 4
4回答

qq_遁去的一_1

几个问题:存在意味着它存在于 DOM 中,但不一定是可见的、可点击的等。如果您希望元素可见,则等待可见。您正在使用*Elements*which 是复数,它将等待定位器找到的所有元素,而不仅仅是您专门寻找的元素。如果您没有唯一的定位器,这可能会导致混乱的失败等。如果你只想要单数,我会避免使用复数。您应该仔细阅读文档。有一种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.    }}

慕尼黑8549860

在public static ExpectedCondition visibilityOf(WebElement element): 检查已知存在于页面 DOM 上的元素是否可见之前,您是非常正确的。可见性意味着元素不仅被显示,而且具有大于 0 的高度和宽度。上述现有方法检查元素是否可见并且存在于 DOM 中,但不仅存在于 DOM 中。为简单起见,我将重新表述这个 ExpectedCondition,因为期望检查已知存在于页面 DOM 中的元素是可见的。粗略的两种期望presenceOfElementLocated(),visibilityOf()它们之间有很多差异。回到您的主要问题,使用 WebElement作为参数来等待特定的 WebElement 出现是不可能的。原因很简单,WebElement在 DOM 中还没有被识别,只有在期望或成功后才会被识别。presenceOfElementLocatedfindElement()JavaDocs中与元素的存在相关的ExpectedCondition列表突然支持了这个概念,如下所示:presenceOfAllElementsLocatedBy(By locator)presenceOfElementLocated(By locator)presenceOfNestedElementLocatedBy(By locator, By childLocator)presenceOfNestedElementLocatedBy(WebElement element, By childLocator)presenceOfNestedElementsLocatedBy(By parent, By childLocator)总而言之,您不能将WebElement作为参数作为期望传递,presenceOfElementLocated()因为WebElement尚未被识别。但是一旦元素被识别,findElement()或者presenceOfElementLocated()这个WebElement可以被传递一个参数。总结一下:presenceOfElementLocated(By locator):这个期望是为了检查一个元素是否存在于页面的 DOM 中。这并不一定意味着元素是可见的。visibilityOf(WebElement element): 这个期望是为了检查一个已知存在于页面 DOM 上的元素是否可见。可见性意味着元素不仅被显示,而且具有大于0的高度和宽度。

天涯尽头无女友

此方法“visibilityOfElementLocated”使用方式:示例://等待元素可见WebDriverWait wait = new WebDriverWait(driver, 15); wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='text3']")));

人到中年有点甜

如何使用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;    }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java