37

我正在使用带有 WebDriver 的 java。我必须在两个帧之间切换。我已经在 selenium IDE 中记录了测试用例,并且我得到的值是 selectFrame relative=top select Frame=middle Frame

但是有一个问题是它无法识别 relative=top 和 middleFrame。如何使用 Java 在 Selenium WebDriver 中解决这个问题?

4

7 回答 7

57

WebDriver 的driver.switchTo().frame()方法采用三个可能的参数之一:

  • 一个号码。

    按其(从零开始的)索引选择一个框架。也就是说,如果一个页面有三帧,第一帧在 index 0,第二帧在 index ,1 第三帧在 index 2。一旦选择了框架,WebDriver 接口上的所有后续调用都将针对该框架进行。

  • 名称或 ID。

    按名称或 ID 选择框架。通过匹配名称属性定位的帧总是优先于那些通过 ID 匹配的帧。

  • 以前发现的一个WebElement

    使用之前定位的 WebElement 选择一个框架。

通过它的 id/name 获取框架或通过它找到它driver.findElement(),你会很好的。

于 2012-06-04T19:23:29.523 回答
17

切换到框架:

driver.switchTo.frame("Frame_ID");

再次切换到默认值。

driver.switchTo().defaultContent();
于 2014-02-16T05:32:00.063 回答
6

首先,您必须找到框架 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();
于 2015-12-09T07:15:02.647 回答
2

需要确保一旦切换到一个框架,需要切换回默认内容以访问另一个框架中的 web 元素。由于 Webdriver 倾向于在当前框架内找到新框架。

driver.switchTo().defaultContent()
于 2013-01-26T19:40:35.467 回答
2

您还可以使用:

driver.switch_to.frame(0)

(0)是 html 上的第一个 iframe。

切换回默认内容:

driver.switch_to.default_content()
于 2015-03-26T08:50:49.097 回答
2

也可以将 WebDriverWait 与 ExpectedConditions 一起使用(以确保 Frame 可用)。

  1. 以字符串为参数

    (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame-name"));
    
  2. 以定位器为参数

    (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frame-id")));
    

更多信息可以在这里找到

于 2017-02-10T15:21:45.450 回答
1

这段代码是 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;
}
于 2012-06-04T22:53:04.640 回答