如何让Selenium等待页面上的元素被替换(java)

2guxujil  于 2023-03-23  发布在  Java
关注(0)|答案(1)|浏览(176)

在一个毕业设计中,我正在使用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?

63lcw9qa

63lcw9qa1#

两个想法...

思路一

就在你点击“下一页”之后,你提到有一个1秒钟的窗口,上一个产品仍然在页面上。
单击“下一页”后,立即开始检查上一个产品上的visibilityOfElementLocated() = false

思路二

如果您的CPU速度不够快,无法在1秒的窗口内捕捉到上一个产品,则想法#1可能会失败。在这种情况下,请尝试在单击“下一页”之前派生一个新的工作线程来检查上一个产品。然后,在单击“下一页”之后,主线程将等待工作线程确认上一个产品已经消失。

相关问题