Java Selenium WebDriver可以';即使切换到iframe,也不能在iframe中定位元素

Java Selenium WebDriver可以';即使切换到iframe,也不能在iframe中定位元素,java,iframe,selenium,webdriver,selenium-chromedriver,Java,Iframe,Selenium,Webdriver,Selenium Chromedriver,为了解决我的问题,我搜索了很多论坛顶级论坛,但没有发现任何类似的问题。 我正在使用Java编写SeleniumWebDriver测试 我正在测试的网站使用iframe,用户的所有可见内容都将加载到其中。它看起来像这样: <html> <head> (...) </head> <body> <iframe id="portalIframe"> <html> &l

为了解决我的问题,我搜索了很多论坛顶级论坛,但没有发现任何类似的问题。 我正在使用Java编写SeleniumWebDriver测试

我正在测试的网站使用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>
然后我可以找到一个h2元素:

 driver.findElement(By.xpath("//h2[contains(text(),'Some text')]"));
我不明白的是,有时候selenium无法在网页上找到元素。例如,我刚刚设法找到h2元素,然后单击菜单链接加载另一个页面,但当我再次尝试在新页面上查找

元素时,会出现“element not found error”,如果我尝试在此之前添加switchIframe(),selenium说它找不到iframe

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

编辑 很抱歉,我无法粘贴html内容,因为这是一个内部网站,我无法在此处共享。 我试图定位的h2元素的一个示例 代理电子交易

另外,我的问题与此问题非常相似: 这个问题不仅出现在h2元素上,还出现在我想点击的“a”元素上


谢谢

在查找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;
}

您可以在iframe中共享您试图与之交互的相关代码吗?h2元素如下:

Etat des agents

此外,id属性可能不会用作可靠的定位器,因为它在每次重新加载页面时都会更改。我根据您的反馈编辑了您的问题。这是正确的吗?你想选择这个h2吗?是的,它是正确的,谢谢,尽管我试图找到的h2元素包含在几个div块的层次结构中,但这并不重要
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;
}