目前,我正在寻找一种解决方案,以等待网站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) {
}
}
答案 0 :(得分:1)
一些问题:
*Elements*
,它是复数形式,将等待定位器找到的 ALL 元素,而不仅仅是您专门寻找的元素。如果您没有唯一的定位器,则可能导致混乱的故障等。如果您只想单数,我会避免使用复数。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中标识,只有在期望presenceOfElementLocated
或findElement()
成功之后才能标识。
与元素的存在相关的 JavaDocs 中的ExpectedCondition列表突然支持了这一概念,如下所示:>
presenceOfAllElementsLocatedBy(By locator)
presenceOfElementLocated(By locator)
presenceOfNestedElementLocatedBy(By locator, By childLocator)
presenceOfNestedElementLocatedBy(WebElement element, By childLocator)
presenceOfNestedElementsLocatedBy(By parent, By childLocator)
最后,由于尚未确定 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()