1、循环切入iframe,知道在当前iframe中再也找不到满足条件的子iframe时返回
public void switchIframe(){
Boolean flag = true;
driver.switchTo().defaultContent();
while (flag) {
ArrayList<WebElement> frames = (ArrayList<WebElement>) driver.findElements(By.cssSelector("iframe"));
//过滤不需要跳转的iframe
frames = (ArrayList<WebElement>) frames.stream().filter(e -> e.isDisplayed()
&& e.getAttribute("src").contains("http")
&& !StringUtils.equals(e.getAttribute("id"),"pdfFrame")
&& !StringUtils.equals(e.getAttribute("src"),"XXXXXXXXX")
).collect(Collectors.toList());
if (frames.size() == 0){
break;
}
for (WebElement frame : frames) {
try {
String src = frame.getAttribute("src");
driver.switchTo().frame(frame);
log.info("进入iframe: " + src);
} catch (Exception ex) {
flag=false;
}
}
}
}
2、配合上面循环切换iframe的方法指定次数、时间间隔查找元素。
/**
* 多次尝试寻找元素
* @param retries 尝试次数
* @param interval 尝试间隔,单位是毫秒
* @param by 元素定位
* @return
* @throws InterruptedException
*/
public WebElement find(Integer retries,int interval,By by) throws InterruptedException {
for (int i=0 ; i<retries ; i++){
int n = i + 1;
log.info("第"+ n +"次尝试定位元素");
this.switchIframe();
WebElement e;
try {
e = driver.findElement(by);
return e;
} catch (Exception ex) {
log.info(ex.getMessage());
}
if (i==retries - 1){
String s = retries.toString();
log.error( s + "次尝试定位失败!");
}
TimeUnit.MILLISECONDS.sleep(interval);
}
return null;
}
这种查找元素的方式适合查找那种会消失的弹窗。