我希望通过分页导航每个页面来验证表中行中的元素。我能够导航到每个页面并断言元素但是问题是在最后一页,循环仍然继续,即使下一个链接显示为灰色。
禁用下一个链接时
<span>
<a class="next_btn inactive">NEXT ></a>
</span>
启用下一个链接时
<span>
<a class="next_btn" href="home.do?action=Next&start=10&end=20&sort=&
type=00&status=&fromDate=04/02/2017&toDate=05/02/2017&school=&
district=0009">NEXT ></a>
</span>
实际代码
public void submissionType() throws Exception {
driver.findElement(By.linkText("NEXT >"));
while(true) {
processPage();
if (pagination.isDisplayed() && pagination.isEnabled()){
pagination.click();
Thread.sleep(100L);
} else
break;
}
}
private void processPage() {
String statusColumn="//td[@class='gridDetail'][2]";
List<WebElement> list = table.findElements(By.xpath(statusColumn));
for (WebElement checkbox : list) {
String columnName=checkbox.getText();
Asserts.assertThat(columnName,"File");
}
}
答案 0 :(得分:0)
不要使用By.linkText("NEXT >")
标识元素,而是尝试使用By.cssSelector("a.next_btn")
识别它。
当你使用这种方法时,当对象被禁用时,它的类名会改变,因此你的对象将不再被识别,你的循环就会中断。
编辑:添加try block和Catch NoSuchElement异常以避免异常。
答案 1 :(得分:0)
我知道你已经接受了答案,但其中一个陈述是不正确的。定位器By.cssSelector("a.next_btn")
将同时找到启用和禁用按钮,因此不会导致循环中断。
查看您的代码,我会提供一些建议/更正。
.isEnabled()
只适用于INPUT标签,因此对此进行测试并不能真正完成任何事情。
使用Thread.sleep()
不是一个好习惯。你可以谷歌一些解释但基本上问题是它是一个不灵活的等待。如果您要等待的元素在15ms内可用,您仍然需要等待10秒或任何睡眠设置。使用显式等待(WebDriverWait
)是最佳做法。
我会清理你的功能并将它们写成
public void submissionType()
{
WebDriverWait wait = new WebDriverWait(driver, 10);
By nextButtonLocator = By.cssSelector("a.next_btn:not(.inactive)");
List<WebElement> nextButton = driver.findElements(nextButtonLocator);
while (!nextButton.isEmpty())
{
processPage();
nextButton.get(0).click();
wait.until(ExpectedConditions.stalenessOf(nextButton.get(0))); // wait until the page transitions
nextButton = driver.findElements(nextButtonLocator);
}
}
private void processPage()
{
for (WebElement checkbox : table.findElements(By.xpath("//td[@class='gridDetail'][2]")))
{
Asserts.assertThat(checkbox.getText(), "File");
}
}