在一个毕业设计中,我正在使用Selenium Webdriver和Java测试一个在线商店。我被困在测试的这一部分,我必须检查所有搜索结果(产品)是否包含特定的单词。
我的搜索返回了几页产品。页面底部有一个分页,但我不知道也无法检查确切的页数,所以我只是在可用时单击[Next page]按钮。
所以问题是当我点击页面底部的【下一页】按钮时,页面向上滚动,之前的产品停留了大约1秒,然后被下一页的新产品替换,页面本身并没有重新加载,只是之前的产品被页面上对应区块的下一个产品替换,区块和产品是元素。
如果我使用Thread.sleep,它可以工作,但这被认为是一个错误的决定。我不知道是否有任何方法可以像在其他测试中一样使用显式wait(textToBePresentInElement,elementToBeClickable,visibilityOfElementLocated,presenceOfElementLocated不适合)。
List<WebElement> products = driver.findElements(By.className(SearchPage.LABEL_PRODUCT_NAME));
for (WebElement product : products) {
Assertions.assertTrue(product.getText().toLowerCase().contains(SearchPage.textForSearchWithResults),
"Error. No " + SearchPage.textForSearchWithResults + " found.");
}
WebElement pagination = driver.findElement(By.xpath(SearchPage.BUTTON_PAGINATION_NEXT));
while (driver.findElements(By.xpath(SearchPage.BUTTON_PAGINATION_NEXT)).size() > 0) {
pagination.click();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
List<WebElement> productsOnTheNextPage = driver.findElements(By.className(SearchPage.LABEL_PRODUCT_NAME));
for (WebElement product : productsOnTheNextPage) {
System.out.println(product.getText());
Assertions.assertTrue(product.getText().toLowerCase().
contains(SearchPage.textForSearchWithResults.toLowerCase()),
"Error. No " + SearchPage.textForSearchWithResults + " found.");
}
}
我怎么能代替这个Thread.sleep?
1条答案
按热度按时间63lcw9qa1#
两个想法...
思路一
就在你点击“下一页”之后,你提到有一个1秒钟的窗口,上一个产品仍然在页面上。
单击“下一页”后,立即开始检查上一个产品上的
visibilityOfElementLocated() = false
。思路二
如果您的CPU速度不够快,无法在1秒的窗口内捕捉到上一个产品,则想法#1可能会失败。在这种情况下,请尝试在单击“下一页”之前派生一个新的工作线程来检查上一个产品。然后,在单击“下一页”之后,主线程将等待工作线程确认上一个产品已经消失。