对于毕业设计,我正在使用 Selenium Webdriver 和 Java 测试在线商店。我被困在测试的这一部分,我必须检查所有搜索结果(产品)是否包含特定词。
我的搜索返回几页产品。页面底部有分页,但我不知道也无法查看具体页数,所以我只是在可用时单击[下一页]按钮。
所以问题是,当我点击页面底部的[下一页]按钮时,页面向上滚动,之前的产品停留约1秒,然后被下一页的新产品替换。页面本身不会重新加载,只是之前的产品被页面上相应块中的下一个产品替换。块和产品是元素。
如果我使用 Thread.sleep 它会起作用,但这被认为是一个错误的决定。我不知道是否有任何方法可以像我的其他测试一样使用显式等待(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 秒的窗口显示上一个产品保留在页面上。
单击“下一页”后立即开始检查
visibilityOfElementLocated() = false
在previous product上。
如果你的 CPU 速度不够快,无法在 1 秒窗口内捕捉到前一个产品,那么想法 #1 可能会失败。在这种情况下,请尝试在单击“下一页”之前派生一个新的工作线程来检查之前的产品。然后,点击“下一页”后,主线程会等待工作线程确认之前的产品已经消失了
您需要将 WebdriverWait 与 ExpectedConditions 配对
new WebDriverWait(driver1, timeout).until(ExpectedConditions.visibilityOf(element));
我推荐这个关于如何将 WebDriverWait 与 ExpectedConditions 结合使用的解释:https://www.browserstack.com/guide/expectedconditions-in-selenium
像这样使用...
webdeivewait wait =new webdeivewait (driver,some seconds here);
wait.until (ExpectedConditions.Visibilityofelementlocated(By.xpath("xpath of webelement you want to wait")).click();