在Selenium webdriver.switchto()中,“relative = top”会产生错误吗?

时间:2011-12-15 21:57:19

标签: selenium selenium-webdriver webdriver

我正在使用Selenium WebDriver(v2.2)“切换”到“顶部”框架,如下所示:

webdriver.SwitchTo().Frame("relative=top");

这会生成错误消息:

Unable to locate frame: relative=top

这可能是因为我正在使用的页面没有框架吗?

修改

不幸的是,涉及窗口切换的两种解决方案都失败了:

webdriver.SwitchTo().Window(winHandle);
webdriver.SwitchTo().DefaultContent();

严格地说,实际上,他们并没有失败。但是,这就是问题所在:假设我在一帧内获取一个IWebElement。这是代码大致的样子:

descend-into-the-frame
grab-the-element
ascend-out-of-the-frame-to-the-top
use-the-element

当我使用-the-element时,我得到一个“缓存中不存在元素”异常。这是因为从框架上升到顶部会切换窗口,从而清除缓存。真烦人不过我找到了一个解决方法:

ascend-out-of-the-frame-to-the-top
descend-into-the-frame
grab-the-element
use-the-element

这仍然意味着我必须注意元素不在缓存的情况。但至少只要我在获取元素后立即使用它,我就可以了。

感谢大家的帮助!

3 个答案:

答案 0 :(得分:11)

要从其他框架切换顶部框架,您可以使用:

driver.switchTo().defaultContent();

答案 1 :(得分:3)

是。当帧存在时,你应该只有SwitchTo()。Frame()。

您可以通过以下方式解决这个问题:

try
{
    webdriver.SwitchTo().Frame("relative=top");
}
catch (WebDriverException ex) 
{
    // do something, perhaps log that there is no frame
}

答案 2 :(得分:3)

我假设当您从一个帧切换到另一个帧时,Selenium IDE会为您提供该代码。我所做的是存储父窗口的窗口句柄,以便稍后切换回它。

String _whandle = driver.getWindowHandle();
...
driver.switchTo().window(whandle);
driver.switchTo().frame("frameA");
driver.findElement(By.id("buttonA")).click();
driver.switchTo().window(whandle);
driver.switchTo().frame("frameB");
driver.findElement(By.id("buttonB")).click();