【问题标题】:Selenium WebDriver can't locate element in iframe even when switching to it即使切换到 iframe,Selenium WebDriver 也无法在 iframe 中找到元素
【发布时间】:2014-06-20 14:33:51
【问题描述】:

我已经搜索了很多论坛主题来解决我的问题,但我没有发现任何类似的问题。 我正在使用 Java 编写 Selenium WebDriver 测试。

我正在测试的网站使用 iframe,其中将加载用户的所有可见内容。它看起来像这样:

<html>
  <head>
     (...)  
  </head>
  <body>
    <iframe id="portalIframe">  
      <html>
        <body>
          <h2 id="aui_3_2_0_1594">Etat des agents</h2>
          ...
        </body>
      </html>       
    </iframe>       
  </body>
</html>

我的问题如下:在 iframe 中查找元素并不总是有效。当我想定位这样一个元素时,我首先运行一个方法来切换到 iframe:

protected void switchIframe() {
    WebDriverWait wait = new WebDriverWait(driver, 10);
    By by = By.id("portalIframe");
    try {
    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(by));
} catch (TimeoutException e) {
    e.printStackTrace();
    }
}

然后我可以例如找到一个 h2 元素:

 driver.findElement(By.xpath("//h2[contains(text(),'Some text')]"));

我无法理解的是,有时 selenium 无法在网页上找到元素。例如,我刚刚设法找到 h2 元素,然后单击菜单链接以加载另一个页面,但是当我尝试在新页面上再次找到 元素时,出现“找不到元素错误”,如果我尝试在此之前添加 switchIframe(),selenium 说它找不到 iframe。

这似乎是“随机”发生的,所以我真的不知道该怎么做才能解决这个问题。 ChromeDriver 和 FirefoxDriver 上的问题是相同的。我不使用其他驱动程序,因为这个私人网站只会使用 Firefox 和 Chrome。

编辑 很抱歉我不能粘贴html内容,因为它是一个内网网站,我不能在这里分享。 我尝试定位的 h2 元素示例 代理机构

我的问题也与这个问题非常相似: Selenium WebDriver not able to find elements which are not present in the Page Source but present in HTML when seen through Developer Tools 该问题不仅出现在 h2 元素上,而且还出现在我想要单击的“a”元素上。

谢谢

【问题讨论】:

  • 您可以分享您尝试与之交互的 iframe 中的相关代码吗?
  • 这样的 h2 元素:Etat des agent 此外,id 属性可能不能用作可靠的定位器,因为它在每次页面重新加载时都会更改.
  • 我根据您的反馈编辑了您的问题。它是否正确?你想选择这个h2吗?
  • 是的,谢谢,虽然我试图找到的 h2 元素包含在几个 div 块的层次结构中,但这没关系

标签: java iframe selenium webdriver selenium-chromedriver


【解决方案1】:

在寻找 html 元素时,我似乎没有等待足够的时间。我只是增加了显式等待方法的超时。我不是在谈论switchIframe(),而是指另一种用于等待元素出现的方法:

所以,我将超时时间从 3 秒增加到 6 秒,现在看起来效果很好。

protected WebElement waitForElementVisible(By by) {
    WebDriverWait wait = new WebDriverWait(driver,6);
    WebElement element = null;

    try {
        element = wait.until(ExpectedConditions.visibilityOfElementLocated(by));
    } catch (TimeoutException e) {
        //method logging an error
        error("Timeout : element " + by.toString() + " is not visible");
    }
    return element;
}

【讨论】:

    猜你喜欢
    • 2017-05-06
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2018-12-31
    • 2012-08-05
    相关资源
    最近更新 更多