java - 用于定位 ifram 的循环并切换到它不起作用
问题描述
我使用 java 代码为 iframe 定位器创建了一个循环,但它不起作用。任何人都可以看到问题吗?
调用类:
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
WebElement searchButton = IFrameLocator.switchToIFrameWithElement(driver,driver.findElement(By.cssSelector("[href*='Search.mvc'][class*='magnify']")));
and use this after:
searchButton.click();
public class IFrameLocator {
public static WebElement switchToIFrameWithElement(WebDriver driver, WebElement element) {
try {
driver.switchTo().defaultContent();
element.isDisplayed();
} catch (Exception continueFlow) {
WebDriverWait wait = new WebDriverWait(driver, 20);
List<WebElement> frames = driver.findElements(By.cssSelector("iframe"));
for (WebElement frame : frames) {
driver.switchTo().defaultContent();
try {
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frame));
if (element.isDisplayed()) {
break;
}
} catch (NoSuchElementException | StaleElementReferenceException | ElementNotInteractableException ignored) {
}
}
} return element;
}
}
解决方案
因为我通过 cssSelector 传递了整个 Webelement,所以它甚至没有进入循环。所以我像这样传递元素:
WebElement searchButton = IFrameLocator.switchToIFrameWithElement(driver, By.cssSelector("[href*='Search.mvc'][class*='magnify']"));
所以我更改了代码并在 2 个位置删除了 By.cssSelector,现在一切正常:
公共类 IFrameLocator {
public static WebElement switchToIFrameWithElement(WebDriver driver, By element) {
driver.switchTo().defaultContent();
try {
if (driver.findElement(element).isDisplayed()) ;
{
System.out.println("Element is displayed on main page");
}
} catch (Exception continueFlow) {
List<WebElement> frames = driver.findElements(By.cssSelector("iframe"));
for (WebElement frame : frames) {
driver.switchTo().defaultContent();
System.out.println("going back to main page");
try {
driver.switchTo().frame(frame);
System.out.println("switched to next frame: " + frame);
if (driver.findElement(element).isDisplayed()) {
System.out.println("element is found in frame: " + frame);
break;
}
} catch (NoSuchElementException | StaleElementReferenceException | ElementNotInteractableException ignored) {
}
}
} System.out.println("returned element succesfully");
return driver.findElement(element);
}
}
推荐阅读
- javascript - 向 twitter api 发出 Oauth2 请求
- android - 在recyclerview中单击项目时如何获取项目名称?
- wordpress - 在 WordPress 中为当前登录用户设置临时变量
- asp.net-mvc - 移除的区域仍然作为区域路由
- swift - ZOHO CRM 未获得刷新令牌作为响应
- android - 为什么我的 ImageUri 没有显示在 setView 的 AlertDialogBox 中?
- c++ - std::string 添加到 char*
- sql - sql 中这种 case 表达式的一种更简洁的方法
- laravel - Laravel 5.5 和 DB::raw 无法执行查询
- c# - 是否有一个属性可以为每个函数添加正确的响应类型属性