如何在使用Java的Selenium WebDriver中切换帧
我正在使用java与WebDriver.I必须在两个帧之间切换。 我已经在selenium IDE中logging了这个testing用例,并且我得到了这个值selectFrame relative = top select Frame = middle Frame
但有一个问题是无法识别相对= top和middleFrame。 我怎样才能解决这个问题在Selenium WebDriver与Java?
WebDriver的driver.switchTo().frame()
方法有三个可能的参数之一:
-
一个号码。
从其(从零开始)索引select一个帧。 也就是说,如果一个页面有三个帧,第一帧将在索引
0
,第二个在索引1
,第三个在索引2
。 一旦框架被选中,WebDriver接口上的所有后续调用都将被设置为该框架。 -
名称或ID。
通过名称或IDselect一个框架。 通过匹配名称属性定位的框架总是优先于通过ID匹配的框架。
-
以前find的
WebElement
。使用之前定位的WebElementselect一个框架。
通过它的id /名称获取框架或通过driver.findElement()
find它,你会很好。
切换到一个帧:
driver.switchTo.frame("Frame_ID");
再次切换到默认值。
driver.switchTo().defaultContent();
首先,您必须find框架ID并在WebElement
定义
例如: – WebElement fr = driver.findElementById("id");
然后使用以下代码切换到帧: – driver.switchTo().frame("Frame_ID");
示例脚本: –
WebElement fr = driver.findElementById("theIframe"); driver.switchTo().frame(fr); Then to move out of frame use:- driver.switchTo().defaultContent();
这个代码是常规的,所以很可能你需要做一些返工。 第一个参数是一个URL,第二个是限制尝试的计数器。
public boolean selectWindow(window, maxTries) { def handles int tries = 0 while (true) { try { handles = driver.getWindowHandles().toArray() for (int a = handles.size() - 1; a >= 0 ; a--) { // Backwards is faster with FF since it requires two windows try { Log.logger.info("Attempting to select window: " + window) driver.switchTo().window(handles[a]); if (driver.getCurrentUrl().equals(window)) return true; else { Thread.sleep(2000) tries++ } if (tries > maxTries) { Log.logger.warn("Cannot select page") return false } } catch (Exception ex) { Thread.sleep(2000) tries++ } } } catch (Exception ex2) { Thread.sleep(2000) tries++ } } return false; }
需要确定一次切换到一个框架,需要切换回默认内容访问另一个框架中的webelements。 由于Webdriver倾向于在当前框架内find新框架。
driver.switchTo().defaultContent()
你也可以使用:
driver.switch_to.frame(0)
(0)
是html上的第一个iframe。
切换回默认内容:
driver.switch_to.default_content()
也可以使用WebDriverWait和ExpectedConditions(以确保Frame可用)。
-
以string作为参数
(new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame-name"));
-
以locator作为参数
(new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frame-id")));
更多信息可以在这里find