我正在使用带WebDriver的java。我必须在两帧之间切换。我已经在selenium IDE中记录了测试用例,并且我得到的值为selectFrame relative = top select Frame = middle Frame
但是有一个问题是它无法识别relative = top和middleFrame。如何使用Java在Selenium WebDriver中解决此问题?
答案 0 :(得分:48)
WebDriver的driver.switchTo().frame()
方法采用三种可能的参数之一:
按其(从零开始)索引选择一个帧。也就是说,如果页面有三个 帧,第一帧将在索引
0
,第二帧在索引1
和第三个在索引2
。一旦选择了框架,全部 对WebDriver接口的后续调用将在该帧上进行。
按名称或ID选择框架。通过匹配名称定位的框架 属性始终优先于ID匹配的属性。
A previously found WebElement
.
使用之前定位的WebElement选择一个框架。
通过它的ID /名称获取框架或通过driver.findElement()
找到它并且你会很好。
答案 1 :(得分:14)
切换到一个框架:
driver.switchTo.frame("Frame_ID");
再次切换到默认值。
driver.switchTo().defaultContent();
答案 2 :(得分:5)
首先,您必须找到帧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();
答案 3 :(得分:1)
此代码处于常规状态,因此您很可能需要进行一些返工。第一个参数是一个网址,第二个是限制尝试的计数器。
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;
}
答案 4 :(得分:1)
需要确保一旦切换到一个帧,需要切换回默认内容以访问另一帧中的webelements。因为Webdriver倾向于在当前帧内找到新帧。
driver.switchTo().defaultContent()
答案 5 :(得分:1)
您也可以使用:
driver.switch_to.frame(0)
(0)
是html上的第一个iframe。
切换回默认内容:
driver.switch_to.default_content()
答案 6 :(得分:1)
还可以将WebDriverWait与ExpectedConditions一起使用(以确保Frame可用)。
使用字符串作为参数
(new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame-name"));
将定位器作为参数
(new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frame-id")));
可以找到更多信息here