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

问题描述 投票:0回答:3

对于毕业设计,我正在使用 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?

java selenium-webdriver testing webdriverwait web-testing
3个回答
0
投票

两个想法...


想法#1

在您点击“下一页”后,您提到有一个 1 秒的窗口显示上一个产品保留在页面上。

单击“下一页”后立即开始检查

visibilityOfElementLocated() = false
previous product上。


想法#2

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


0
投票

您需要将 WebdriverWait 与 ExpectedConditions 配对

new WebDriverWait(driver1, timeout).until(ExpectedConditions.visibilityOf(element));

我推荐这个关于如何将 WebDriverWait 与 ExpectedConditions 结合使用的解释:https://www.browserstack.com/guide/expectedconditions-in-selenium


0
投票

像这样使用...

webdeivewait wait =new webdeivewait (driver,some seconds here);

wait.until (ExpectedConditions.Visibilityofelementlocated(By.xpath("xpath of webelement you want to wait")).click();

© www.soinside.com 2019 - 2024. All rights reserved.