需要访问模态iframe中的元素。
对于FireFox驱动程序,下面的代码非常适用于Chrome -
String frameId = null;
List<WebElement> frameSet = driver.findElements(By.tagName("iframe"));
for (WebElement frameName : frameSet){
if(!(frameName.getAttribute("id").isEmpty()) && (frameName.getAttribute("id").contains("DlgFrame"))){
frameId = frameName.getAttribute("id");
}
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Logger.info("Switch to Frame - "+frameId);
driver.switchTo().frame(driver.findElement(By.id(frameId)));
Chrome驱动程序是否支持switchTo.frame(&lt;'frameId'&gt;)?
使用Chrome驱动程序时出错 -
org.openqa.selenium.WebDriverException:未知命令。选项:ActivateTab,CaptureEntirePage,CloseTab,DeleteCookie,...
命令持续时间或超时:220毫秒 构建信息:版本:'2.25.0',修订版:'17482',时间:'2012-07-18 22:18:01' 系统信息:os.name:'Windows 7',os.arch:'amd64',os.version:'6.1',java.version:'1.7.0_05' 驱动程序信息:driver.version:RemoteWebDriver 会话ID:cbde65cb0394ee0434b3bb528918ce40 在org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:188) 在org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145) 在org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:498) 在org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:244) 在org.openqa.selenium.remote.RemoteWebElement.sendKeys(RemoteWebElement.java:87) 在com.shn.services.Office365.sharePointUploadFile(Office365.java:173) 在com.shn.test.RunOffice365Test.testSharePointUploadAndDeleteFile(RunOffice365Test.java:55) 在org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:74) 在org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:92) 在org.apache.maven.surefire.Surefire.run(Surefire.java:180) 在org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350) 在org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)
答案 0 :(得分:5)
ChromeDriver支持switchTo,因为它实现了WebDriver接口。 它对我来说很好。
你必须这样做:
driver.switchTo().frame(driver.findElement(By.id("frameId")));
//do your stuff
driver.switchTo().defaultContent();
答案 1 :(得分:4)
问题既不是chromeDriver也不是selenium。两者都运行在最新版本上。
chromeDriver - 23.0.1240.0
硒 - 2.25.0
问题出在Chrome浏览器上。
我的浏览器正在运行。 12.0.742.112。 由于 -
,自动更新失败更新服务器不可用(错误:7)
我不得不卸载&amp;安装回浏览器以使其达到最新版本。 21.0.1180.89 m。
现在问题已经解决了。我可以在帧之间切换。
答案 2 :(得分:1)
看起来问题不在iframe中。错误列表包括org.openqa.selenium.remote.RemoteWebElement.sendKeys(RemoteWebElement.java:87) at
。
所以我假设您的代码的另一部分导致应用程序。失败。
答案 3 :(得分:1)
这是我为所有浏览器切换到框架的实现,因为通过ID或名称切换到框架不适用于Chrome(使用最新版本)
/**
* This switch to frame method improves standard way to switching to frame
* ( driver.switchTo().{@linkplain org.openqa.selenium.WebDriver.TargetLocator#frame(String) frame(String nameOrId)} )
* because Chrome browser has problem with this method. <br/>
*
* Bug: http://code.google.com/p/chromedriver/issues/detail?id=107
* @param frameIdOrName the id or name of the <frame> or <iframe> element
* @return This driver focused on the given frame.
*/
public WebDriver switchToFrameByIdOrName(String frameNameOrId) {
if (driver instanceof ChromeDriver) {
String frameElementXpath = String.format("//frame[@name='%1$s' or @id='%1$s']", frameNameOrId);
WebElement f = driver.findElement(By.xpath(frameElementXpath));
return driver.switchTo().frame(f);
}
return driver.switchTo().frame(frameNameOrId);
}
或
public WebDriver switchToFrameByIdOrName(String frameIdOrName) {
if (!(driver instanceof ChromeDriver)) {
return driver.switchTo().frame(frameIdOrName);
}
WebElement frame = null;
try {
frame = driver.findElement(By.cssSelector("frame[id='" + frameIdOrName + "']"));
} catch (NoSuchElementException e) { /* It's ok for the moment */ }
if (frame == null) {
try {
frame = driver.findElement(By.cssSelector("frame[name='" + frameIdOrName + "']"));
} catch (NoSuchElementException e) {
log.severe(String.format("CORE > switchToFrameByIdOrName() error: Frame with name or id '%s' not found.", frameIdOrName));
}
}
return driver.switchTo().frame(element);
}
我正在使用:
Selenium 2.37.1
Session info: chrome=31.0.1650.57)
Driver info: chromedriver=2.7.236900,platform=Windows NT 6.1 SP1 x86_64
答案 4 :(得分:1)
我不知道这是否对任何人都有帮助,但是我在轮询框架时遇到了类似的问题,这就是解决方案对我来说的解决方法。
切换到DefaultContent():
_driver.SwitchTo().DefaultContent();
获取框架:
IWebElement iFrames = _driver.FindElements(By.XPath("//iframe"));
轮询框架,但只有在“ Displayed”为true时才切换到框架:
foreach (var frame in iFrames)
{
if (!frame.Displayed)
continue;
_driver.SwitchTo().Frame(frame);
}