Java Selenium WebDriver可以';即使切换到iframe,也不能在iframe中定位元素
为了解决我的问题,我搜索了很多论坛顶级论坛,但没有发现任何类似的问题。 我正在使用Java编写SeleniumWebDriver测试 我正在测试的网站使用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
<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;
}