我的功能文件中有一个场景,它只是打开一个给定的页面,搜索一个员工并检查所述员工是否存在。但是,我无法弄清楚一个陈旧的元素引用,它一直在嘲弄我。
我已经整合了一些通用的等待方法来检查可见性并验证元素的存在,但无济于事。
这是我的BasePage类的片段:
public void waitForElementToBeClickable(WebElement element) {
wait.ignoring(NoSuchElementException.class, StaleElementReferenceException.class)
.pollingEvery(2, TimeUnit.SECONDS)
.until(ExpectedConditions.elementToBeClickable(element));
}
public void waitForElementToBeVisible(WebElement element) {
wait.ignoring(NoSuchElementException.class, StaleElementReferenceException.class)
.pollingEvery(2, TimeUnit.SECONDS)
.until(ExpectedConditions.visibilityOf(element));
}
public void verifyPresenceOfElement(WebElement element) {
boolean presence = false;
int attempts = 0;
while (attempts < 5) {
try {
if (element.isDisplayed()) {
presence = true;
break;
}
} catch (Exception e) {
e.printStackTrace();
}
attempts++;
}
}
前两种方法只是Selenium的WebDriverWait类的包装器。第三个重试以检查元素是否显示。
在我的页面对象类中,我有一个循环遍历web元素列表的方法,并检查文本是否包含与参数匹配的字符串。像这样:
public boolean listOfEmployeeCards(String employee) {
for (WebElement items : employees) {
if (items.getText().contains(employee)) {
verifyPresenceOfElement(items);
return true;
}
}
return false;
}
在我的步骤类中,我在实际测试步骤中执行断言。
在我的页面对象类的第63行抛出异常,它是listOfEmployeeCards中的if语句(如上所述)。我在想我错误地使用了方法verifyPresenceOfElement(),或者整个方法都错了。
我有一个类似的场景,它基本上使用搜索功能在同一页面上过滤员工(通过点击按钮),并且工作得很好。这个场景也使用方法listOfEmployeeCards(),我添加了一个快速打印来检查是否实际上是触发了verifyPresenceOfElement()。它似乎确实被触发了,至少在那种情况下。
快速注意,页面上有一个底层的ReactJS应用程序执行所有操作(搜索,过滤)。
有什么想法吗?哦,如果我不清楚,我很高兴详细说明。
答案 0 :(得分:0)
我遵循了@RafałLaskowski's指针,最后在我的页面对象类中使用了以下工作代码:
public void searchForEmployee(String text) {
WebElement results = getDriver().findElement(By.className("fn"));
if (inputFieldIsEmpty(search)) {
search.sendKeys(text);
}
wait.until(ExpectedConditions.stalenessOf(results));
}
public boolean listOfEmployeeCards(String employee) {
List<String> employeeList = elementToStringList(employees);
return elementListContainsString(employeeList, employee);
}