Selenium - 如何检查 "Load More" 按钮是否为 clickable/disabled?

Selenium - How to check if a "Load More" button is clickable/disabled?

我必须向下滚动博客中的文章列表,直到找到特定文章。为此,有一个“加载更多”按钮,它会为您提供越来越多的文章,直到没有更多文章可加载为止,因此该按钮消失,被禁用(至少我是这么想的)。

我的想法是有一个“while”循环,直到按钮被禁用,同时它会检查请求的文章是否出现:

public void scrollIntoArticle(String title){
        while(loadMoreBtn.isEnabled()){
            for(WebElement article : articlesList){
                if(article.getText().equals(title)){
                    scrollInto(article);
                    hoverAndClick(article);
                    break;
                } else{
                    scrollInto(lastArticle());
                    hoverAndClick(loadMoreBtn);
                }
            }
        }
    } 

但是,它不断出现错误:“等待元素的可见性”。尝试使用“isDisplayed”我遇到了同样的问题。

显然按钮永远不会被“禁用”。元素唯一发生的事情是在 HTML 上获得一个新属性:style="display: none;"。对于 Selenium,“isEnabled”始终为真,因此循环继续,“等待元素的可见性”。

我被卡住了,无法弄清楚在不检查“加载更多”按钮的情况下我可以使用什么条件来检查是否所有文章都已加载。有什么建议么?感谢您的帮助!

您可以等待元素的属性更改,只需使用 ExpectedCondition class 例如:

    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
wait.until(ExpectedConditions.attributeToBe(buttonWebElement, "style", "display: none;")

或等待显示属性的元素,例如:

wait.visibilityOf(driver.findElement(By.xpath("//button[@style='display: none;']")))

最后,我使用 try/catch 作为“加载更多”按钮。所以当它不能更“可点击”时,它会抛出异常。

其他人提到的“isDisplayed”、“isEnabled”、ExpectedConditions.attributeToBe 无效。

代码如下:

public void goToArticle(String title){
        int count = 0;
        while(true){
            for(WebElement article:articlesLink){
                if(article.getText().equals(title)){
                    scrollIntoCenter(article);
                    clickArticle(article);
                    break;
                } else {
                    scrollIntoCenter(lastArticle());
                }
            }
            try {
                hoverAndClick(loadMoreBtn);
            } catch (Exception e) {
                System.out.println("No more load button");
                count++;
                if (count > 1){
                    System.out.println("No article found");
                    break;
                }
            }
        }

    }