我是基于AJAX的应用程序,上面有一些框架,想切换到它,因此我使用了frameToBe可用性AndSwitchToIt()
方法。
假设现在我在页面的默认上下文中(即不在任何框架中)并想使用以下代码切换到testFrame
-
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(testFrame));
JavascriptExecutor jsExecutor = (JavascriptExecutor)driver;
String currentFrameName = (String) jsExecutor.executeScript("return self.name");
System.out.println("***************** Current frame using self.name " + currentFrameName);
这将返回空字符串作为当前FrameName
的值,这表明我们尚未切换到testFrame
,即使显式等待调用已成功。
此问题间歇性地重现,导致测试不稳定。您能建议如何使其稳定吗?
编辑
我在前面提到的地方编辑了我的问题——我在frameA
中,然后想切换到frameB
,但这不是一个案例。我想从页面的默认内容切换到框架。对不起,把错误的信息放在首位。
您需要从前一帧切换回来才能移动到另一帧
driver.switchTo().defaultContent();
现在它应该看起来像。
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameA));
//Do somenthing.
driver.switchTo().defaultContent();
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameB));
希望这有帮助。
如果您在帧A内并且想要切换到帧B,将取决于帧A和帧B的对齐方式。
>
如果frameB是frameA的子帧,那么在frameA中时,您必须再次switch chTo()
子帧frameB,如下所示:
new WebDriverWait(driver, 30).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameA));
new WebDriverWait(driver, 30).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameB));
您可以在无法通过Selenium找到父iframe内的子iframe元素中找到相关讨论Java
>
如果frameA和frameB都是顶层浏览上下文的直接子项,那么在frameA中,您必须先switch_to()
defaultContent()(它选择页面上的第一个框架,或者当页面包含iframe时选择主文档。)然后到frame frameB,如下所示:
new WebDriverWait(driver, 30).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameA));
driver.switchTo().defaultContent(); #incase frameA and frameB are immediate child of the Top Level Content
new WebDriverWait(driver, 30).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameB));
您可以在多个iframe标签Selenium web驱动程序中找到相关讨论
您可以在以下链接中找到相关的详细讨论: