提问者:小点点

frameToBe可用性AndSwitchToIt()无法帮助切换到帧


我是基于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,但这不是一个案例。我想从页面的默认内容切换到框架。对不起,把错误的信息放在首位。


共2个答案

匿名用户

您需要从前一帧切换回来才能移动到另一帧

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驱动程序中找到相关讨论

    您可以在以下链接中找到相关的详细讨论:

    • 在iframe下处理#文档的方法