9

需要访问模态 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(<'frameId'>)?

使用 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 at 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) at com.shn.test.RunOffice365Test.testSharePointUploadAndDeleteFile(RunOffice365Test.java:55) at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:74) at 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)在 org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350) 在 org.apache.maven.surefire.Surefire.run(Surefire.java:180) 在 org 执行(TestNGXmlTestSuite.java:92) .apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)在 org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350) 在 org.apache.maven.surefire.Surefire.run(Surefire.java:180) 在 org 执行(TestNGXmlTestSuite.java:92) .apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)

4

5 回答 5

8

ChromeDriver 支持 switchTo,因为它实现了 WebDriver 接口。这对我来说可以。

你必须这样做:

driver.switchTo().frame(driver.findElement(By.id("frameId")));
//do your stuff
driver.switchTo().defaultContent();
于 2012-09-18T06:59:05.610 回答
5

问题既不是 chromeDriver 也不是 selenium。两者都在最新版本上运行。

chromeDriver - 23.0.1240.0

硒 - 2.25.0

问题出在 Chrome 浏览器上。

我的浏览器在版本上运行。12.0.742.112。自动更新失败的原因是 -

更新服务器不可用(错误:7)

我必须卸载并重新安装浏览器才能将其更新到最新版本。21.0.1180.89 米。

现在问题已解决,我可以在帧之间切换。

于 2012-09-19T16:13:07.927 回答
2

我不知道这是否会帮助任何人,但我在轮询框架时遇到了类似的问题,这就是我的解决方案。

切换到 DefaultContent():

_driver.SwitchTo().DefaultContent();

获取帧:

IWebElement iFrames = _driver.FindElements(By.XPath("//iframe"));

轮询帧,但只有在“Displayed”为真时才切换到它:

foreach (var frame in iFrames)
{
    if (!frame.Displayed)
        continue;

    _driver.SwitchTo().Frame(frame);
}
于 2018-10-18T18:53:36.933 回答
1

看起来问题不在 iframe 中。错误列表包括org.openqa.selenium.remote.RemoteWebElement.sendKeys(RemoteWebElement.java:87) at. 所以我假设你的代码的另一部分导致 app. 失败。

于 2013-10-21T08:27:00.260 回答
1

这是我为所有浏览器切换到框架的实现,因为按 Id 或名称切换到框架不适用于 Chrome(最新版本)

  • 使用 Xpath(更优雅/可读的代码):
/**
 * 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 &lt;frame&gt; or &lt;iframe&gt; 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);
}

或者

  • 使用 CSS 选择器(因为 CSS 选择器应该是查找元素的更快方法。有关更多信息,请参阅选择 WebDriver 定位器
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
于 2013-12-04T12:10:35.933 回答