4 回答
TA贡献1725条经验 获得超7个赞
几个问题:
存在意味着它存在于 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.
}
}
TA贡献1818条经验 获得超11个赞
在public static ExpectedCondition visibilityOf(WebElement element): 检查已知存在于页面 DOM 上的元素是否可见之前,您是非常正确的。可见性意味着元素不仅被显示,而且具有大于 0 的高度和宽度。上述现有方法检查元素是否可见并且存在于 DOM 中,但不仅存在于 DOM 中。
为简单起见,我将重新表述这个 ExpectedCondition,因为期望检查已知存在于页面 DOM 中的元素是可见的。
粗略的两种期望presenceOfElementLocated()
,visibilityOf()
它们之间有很多差异。
回到您的主要问题,使用 WebElement作为参数来等待特定的 WebElement 出现是不可能的。原因很简单,WebElement在 DOM 中还没有被识别,只有在期望或成功后才会被识别。presenceOfElementLocated
findElement()
JavaDocs中与元素的存在相关的ExpectedCondition列表突然支持了这个概念,如下所示:
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的高度和宽度。
TA贡献1831条经验 获得超9个赞
此方法“visibilityOfElementLocated”使用方式:
示例://等待元素可见
WebDriverWait wait = new WebDriverWait(driver, 15); wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='text3']")));
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;
}
添加回答
举报