不能在显示元素后退出for循环



我试图查看是否显示特定元素,然后执行搜索n次,否则中断循环,并继续在Selenium中的其他操作。

一旦row元素可见,脚本就会停止,而不是继续循环外的代码。

Boolean row = driver.findElement(By.xpath("//*[contains(text(),'mytext')]")).isDisplayed();

if (row){
for (int i = 0; i < 50; i++){
Thread.sleep(1000);
action.sendKeys(Keys.TAB).build().perform();
Search.click();
if (row == false){
break;
}
}       
}
driver.findElement(By.xpath(something)).click();

一旦行元素是可见的,脚本停止而不是继续在循环外的代码。

基本上问题是,你正在使用.isDisplayed();,如果找到web元素,它会很好地工作。它将返回yes。如果web元素没有显示,大多数情况下你不会得到这样的元素异常。

不幸的是,.isDisplayed();不能有效地处理这个异常。

作为一种变通方法,我建议使用findElements,如果找到,它将返回一个web元素列表,否则返回一个空列表。

List<WebElement> rows = driver.findElements(By.xpath("//*[contains(text(),'mytext')]"));
if (rows.size() > 0){
System.out.println("row is visible");
for (int i = 0; i < 50; i++){
Thread.sleep(1000);
action.sendKeys(Keys.TAB).build().perform();
Search.click();
List<WebElement> rowsStatus = driver.findElements(By.xpath("//*[contains(text(),'mytext')]"));
if (rowsStatus.size() > 0 ) {
continue;
}
else {
System.out.println(" exiting the loop if rows is found in for loop early");
break;
}
}
}
else {
System.out.println("Row is not visible, do something here to make it visible.");
}
driver.findElement(By.xpath(something)).click();

您也应该在for循环中添加此显示功能。只有这样循环才会被打破。

// list of options which has more money
for (int i = 0; i < 50; i++){
Thread.sleep(1000);
action.sendKeys(Keys.TAB).build().perform();
Search.click();
row = driver.findElement(By.xpath("//*[contains(text(),'mytext')]")).isDisplayed();
if (row == false){
break;
}
}

最新更新