我需要检查Java Selenium页面中是否存在元素。不幸的是,所有关于搜索的解释都是使用FindElements(By)来完成的,但是我有一种将WebElement直接传递给方法的结构,因为我的元素已经由PageFactory发送了。
所以我的结构如下:
public static void verifyElementPresentStatus(WebElement targetElement, String elementName) {
Boolean elementPresent = MISSING PART
StepLogger.subVerification(elementName + " should be present");
Assert.assertTrue(
elementPresent,
ValidationHelper.getPresentValidation(elementName)
);
}
并调用类似方法
ExpectationHelper.verifyElementPresentStatus(
Pages.HomePage().homeHeader,
Pages.HomePageConstants().pageHeaderText
);
有人知道这样做吗?
答案 0 :(得分:1)
您不能编写接受WebElement作为参数并检查在所有情况下是否存在的方法。这是因为唯一可以引用一个不存在的WebElement对象的情况是,如果该对象先前存在,然后又从DOM中删除(“陈旧元素”)。为了确定元素是否首次存在,只能通过接受By参数代替WebElement来实现。这样,您可以使用findElements并检查count> 0。
答案 1 :(得分:0)
根据WebElement接口的documentation,其所有方法调用
将进行新鲜度检查以确保该元素 参考仍然有效。这实质上决定了是否 元素仍附加到DOM。如果此测试失败,则 抛出StaleElementReferenceException,并且以后对此的所有调用 实例将失败。
由于您收到的WebElement未经任何验证,因此请考虑执行中性方法调用(无任何副作用)来检查元素StaleElementReferenceException
。例如,您可以调用getSize()
方法。您的方法逻辑应该看起来像这样。
public static void verifyElementPresentStatus(WebElement targetElement, String elementName) {
Boolean elementPresent = true;
try {
elementPresent = targetElement.getSize();
} catch (StaleElementReferenceException e) {
elementPresent = false;
}
StepLogger.subVerification(elementName + " should be present");
Assert.assertTrue(elementPresent, ValidationHelper.getPresentValidation(elementName));
}