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