【问题标题】:frameToBeAvailableAndSwitchToIt() is not helping to switch to frameframeToBeAvailableAndSwitchToIt() 没有帮助切换到框架
【发布时间】:2020-01-13 11:29:55
【问题描述】:

我是基于 AJAX 的应用程序,上面有一些框架,想切换到它,因此我使用了frameToBeAvailableAndSwitchToIt() 方法。

假设现在我在一个页面的默认上下文中(即不在任何框架中)并且想使用以下代码切换到 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);

这将返回空字符串作为 currentFrameName 的值,这表明我们尚未切换到 testFrame,即使显式等待调用已成功。

此问题间歇性重现,导致测试不稳定。您能否建议如何使其稳定?

编辑

我在前面提到的地方编辑了我的问题 - 我在 frameA,然后想切换到 frameB,但事实并非如此。我想从页面的默认内容切换到框架。很抱歉将错误信息放在首位。

【问题讨论】:

  • 你可以试试 --> String frame = (String) jsExecutor.executeScript("return self.location.toString()");
  • @Muzzamil,它返回给我一个网址。
  • 我想你已经切换了。切换后试试这个 --> WebElement testFrame= driver.findElement(By.tagName("iframe"));WebElement el = (WebElement) ((JavascriptExecutor) driver).executeScript("return window.frameElement");断言 testFrame.equals(el)

标签: selenium selenium-webdriver


【解决方案1】:

您需要从上一帧切换回来才能移动到另一帧。使用

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));

希望这会有所帮助。

【讨论】:

  • 抱歉放错了细节。我现在更正了我的问题。
  • @TDHM : 你能发布两个框架的 HTML 来看看这个结构如何。两个框架是其他框架的子框架还是嵌套框架??
  • 我现在只有一帧,请查看已编辑的问题。
【解决方案2】:

如果你在frameA内想要切换到frameB将取决于frameAframeB的对齐方式>.

  • 如果 frameBframeA 的子框架,那么在 frameA 中你必须 switchTo() 子框架 frameB 再次如下:

    new WebDriverWait(driver, 30).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameA));
    new WebDriverWait(driver, 30).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameB));
    

您可以在Unable to locate the child iframe element which is within the parent iframe through Selenium in Java找到相关讨论

  • 如果 frameAframeB 都是 Top Level Browsing Context 的直接子级,那么在 frameA 你必须先switch_to()defaultContent()(选择页面上的第一个框架,或者当页面包含 iframe 时选择主文档。)然后到框架 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));
    

您可以在Multiple iframe tags Selenium webdriver找到相关讨论


tl;博士

您可以在以下位置找到相关的详细讨论:

【讨论】:

  • 抱歉放错了细节。我现在更正了我的问题。
  • 不幸的是,您的解决方案没有帮助。我的代码没有问题,它按预期工作,这表明代码是正确的,唯一的问题是它会导致测试间歇性失败。因此,我的问题是如何使其稳定,以便每次都能通过。
猜你喜欢
  • 2011-08-17
  • 1970-01-01
  • 2011-10-12
  • 2013-09-22
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
相关资源
最近更新 更多