我正在使用Java和WebDriver。我必须在两个帧之间切换。我在Selenium IDE中记录了测试用例,在其中我得到的值为selectFrame relative=top select Frame=middle Frame。
但是有一个问题,它不能识别relative=top和middleFrame。我应该如何在Java的Selenium WebDriver中解决这个问题?
我正在使用Java和WebDriver。我必须在两个帧之间切换。我在Selenium IDE中记录了测试用例,在其中我得到的值为selectFrame relative=top select Frame=middle Frame。
但是有一个问题,它不能识别relative=top和middleFrame。我应该如何在Java的Selenium WebDriver中解决这个问题?
WebDriver的driver.switchTo().frame()
方法有三个可能的参数:
通过帧的索引(从零开始)选择一个帧。也就是说,如果一个页面有三个帧,第一个帧的索引为
0
,第二个帧为1
,第三个帧为2
。一旦选择了帧,所有后续对WebDriver接口的调用都将针对该帧进行。
根据名称或ID选择一个帧。通过匹配名称属性定位的帧始终优先于通过匹配ID定位的帧。
使用先前定位的WebElement选择一个帧。
driver.findElement()
来定位它,这样你就可以了。切换到一个框架:
driver.switchTo.frame("Frame_ID");
切换回默认选项。
driver.switchTo().defaultContent();
首先,您需要找到框架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();
driver.switch_to.frame(0)
第一个 iframe 的索引是 (0)
。
要切换回默认内容:
driver.switch_to.default_content()
需要确保一旦进入框架,就需要切换回默认内容以便在另一个框架中访问web元素。因为Webdriver倾向于在当前框架内查找新框架。
driver.switchTo().defaultContent()
还有一种可能性是使用带有ExpectedConditions的WebDriverWait(以确保Frame可用)。
With string as parameter
(new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame-name"));
With locator as a parameter
(new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frame-id")));
更多信息可以在这里找到。
这段代码是用Groovy编写的,所以很可能需要进行一些重构。第一个参数是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;
}
<frameset>
元素。如果你测试过,请分享你的结果 :)。 - Petr Janečekframeset
元素。 - aurbanoSwitchToFrame()
。更多信息可以在这里找到(https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/remote/server/handler/SwitchToFrame.html)。如果有人能够更新这个答案就好了。我自己是用JS的,但我不喜欢链接失效。 - Carolus