如何使用Java在SeleniumWebDriver中切换帧

如何使用Java在SeleniumWebDriver中切换帧,java,selenium-webdriver,Java,Selenium Webdriver,我正在使用java和WebDriver。我必须在两个框架之间切换。我已经在selenium IDE中记录了测试用例,其中我得到的值是selectFrame relative=top select Frame=middle Frame 但有一个问题,它无法识别相对=顶部和中间框架。如何在使用Java的Selenium WebDriver中解决此问题?WebDriver的方法采用以下三种可能的参数之一: 通过其(基于零的)索引选择帧。也就是说,如果一个页面有三个 帧,第一帧将位于索引0,第二帧位

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

但有一个问题,它无法识别相对=顶部和中间框架。如何在使用Java的Selenium WebDriver中解决此问题?

WebDriver的方法采用以下三种可能的参数之一:

  • 通过其(基于零的)索引选择帧。也就是说,如果一个页面有三个 帧,第一帧将位于索引
    0
    ,第二帧位于索引
    1
    第三个位于索引
    2
    。选定帧后,所有 WebDriver接口上的后续调用将对该帧进行

  • 按名称或ID选择帧。按匹配名称定位帧 属性总是优先于ID匹配的属性

  • 使用先前定位的WebElement选择框架


根据帧的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;
}

需要确保切换到一个框架后,需要切换回默认内容以访问另一个框架中的webelements。因为Webdriver倾向于在当前帧中找到新帧

driver.switchTo().defaultContent()
要切换到帧,请执行以下操作:

driver.switchTo.frame("Frame_ID");
再次切换到默认值

driver.switchTo().defaultContent();
您还可以使用:

driver.switch_to.frame(0)
(0)
是html上的第一个iframe

要切换回默认内容,请执行以下操作:

driver.switch_to.default_content()

首先,您必须找到框架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();

还可以在预期条件下使用WebDriverWait(以确保该框架可用)

  • 以字符串作为参数

    (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame-name"));
    
    (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frame-id")));
    
  • 使用定位器作为参数

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

  • 可以找到更多信息

    switchTo()框架(0)如何处理iframe与框架集中的框架?“frameset”标记是否已计数?@djangofan问得好。我不知道,我从来没有用过数字参数。我猜它不包括
    元素。如果您曾经测试过它,请分享您的结果:)。即使这是旧的,我也会为其他人发布,根据我的经验,它不包括
    frameset
    元素。@aurbano-只想让您知道,3年后,您的评论解决了我遇到的问题!谢谢你@弗里曼哈哈哈很高兴这有帮助:)这很棘手。切换到默认内容是我所知道的SeleniumsAPI中最糟糕的方法之一。因为如果您选择driver.switchTo().defaultContent()并再次发出driver.switchTo().defaultContent(),则无法保证您的最终结果。Java文档状态:选择页面上的第一个框架,或者当页面包含iframe时选择主文档。因此,如果你已经在根框架中,那么你将在第一个框架中结束,这将带来所有的混乱。因此,请始终测试您是否已经在根框架中(javascript->return self.location===top.location;)您保存了我的一天。谢谢你,小伙子,我能帮忙!