ChromeDriver没有正确切换帧

时间:2015-01-07 16:57:01

标签: java selenium selenium-chromedriver

我有问题要正确切换到框架。

该项目是使用此pom.xml

的maven项目
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>betlista</groupId>
    <artifactId>bugs.chromedriver</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>

        <dependency>
            <groupId>com.github.detro</groupId>
            <artifactId>phantomjsdriver</artifactId>
            <version>1.2.0</version>
        </dependency>

    </dependencies>

</project>

我的测试课程是:

package bugs.chromedriver;

import org.openqa.selenium.chrome.ChromeDriver;

public class Test {

    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "c:/betlista/progs/chromedriver_2.13_win32/chromedriver.exe");
        ChromeDriver driver = new ChromeDriver();
        driver.get("http://localhost:8080/frames/chrome_test.html");
        driver.switchTo().frame(0); // outer
        try {
            driver.switchTo().frame(1); // menu - ERROR
        } catch (Exception e) {
            e.printStackTrace();
        }
        driver.quit();
    }

}

我用于测试的页面是

<html>
    <head>
        <title>Chome frames test</title>
    </head>

    <frameset rows="100%, *">
        <frame src="./outer.html">
    </frameset>
</html>   

外框:

<html>
    <head>
        <title>Chome frames test - outer</title>
    </head>

    <frameset rows="55, *">
        <frame src="top.html">
        <frameset cols="190,*">
            <frame src="menu.html" name="menu">
            <frame src="content.html"name="content">
        </frameset>
    </frameset>
</html>   

顶部框架:

<html>
    <head>
        <title>Chome frames test - top frame</title>
    </head>

    <body>
        top
    </body>
</html>   

菜单框:

<html>
    <head>
        <title>Chome frames test - menu frame</title>
    </head>

    <body>
        <div>menu</div>
    </body>
</html>   

内容框架:

<html>
    <head>
        <title>Chome frames test - content frame</title>
    </head>

    <body>
        content
    </body>
</html>   

当我运行代码时发生异常:

Starting ChromeDriver 2.13.307647 (5a7d0541ebc58e69994a6fb2ed930f45261f3c29) on port 25190
Only local connections are allowed.
org.openqa.selenium.NoSuchFrameException: no such frame
  (Session info: chrome=39.0.2171.95)
  (Driver info: chromedriver=2.13.307647 (5a7d0541ebc58e69994a6fb2ed930f45261f3c29),platform=Windows NT 6.1 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 20 milliseconds
Build info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39'
System info: host: 'CZCHOWN5019295', ip: '2.252.210.20', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_67'
Session ID: b30602d7260eefcf7e7c30b348271eb0
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={userDataDir=C:\Users\msuska\AppData\Local\Temp\scoped_dir29108_23597}, rotatable=false, locationContextEnabled=true, mobileEmulationEnabled=false, version=39.0.2171.95, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, nativeEvents=true, webStorageEnabled=true, applicationCacheEnabled=false, takesScreenshot=true}]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:595)
    at org.openqa.selenium.remote.RemoteWebDriver$RemoteTargetLocator.frame(RemoteWebDriver.java:857)
    at bugs.chromedriver.Test.main(Test.java:15)

phantomjsdriver在版本2.41.0中使用selenium chrome driver所以我也尝试升级到最新版本2.44.0,一个必须解决一些问题:

添加依赖项时,有java.lang.ClassNotFoundException: com.google.gson.JsonElement因此我不得不手动添加gson依赖项 - 新pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>betlista</groupId>
    <artifactId>bugs.chromedriver</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>

        <dependency>
            <groupId>com.github.detro</groupId>
            <artifactId>phantomjsdriver</artifactId>
            <version>1.2.0</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-chrome-driver</artifactId>
            <version>2.44.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.3.1</version>
        </dependency>

    </dependencies>

</project>

接下来有org.openqa.selenium.WebDriverException: unknown error: cannot parse capability: chromeOptions,需要稍微修改测试源:

// ChromeDriver driver = new ChromeDriver(); // old
DesiredCapabilities cdc = DesiredCapabilities.chrome();
ChromeDriver driver = new ChromeDriver(cdc);

但同样的错误 - org.openqa.selenium.NoSuchFrameException: no such frame

ChromeDriver替换为PhantomJSDriver时,同样正常。

有旧Chrome driver issue

修改
我相信,这是错误的 - 我从window.frameElement描述中得到的最好的理解。

在我看来,像switchTo应该像这样工作:

  1. 在开头有一个框架 - 来自JS window.frames.length返回1
  2. 所以我必须&#34;切换&#34;到第一帧,window.frames[0].frames.length返回3
  3. 第二个是菜单

3 个答案:

答案 0 :(得分:2)

尝试在切换到新框架之前添加driver.switchTo().defaultContent();

答案 1 :(得分:1)

你的问题在这里:

driver.switchTo().frame(0); // outer
...
driver.switchTo().frame(1); // menu - ERROR

第一个switchTo()将切换到您的框架,外框,因为您的评论不正确指出。第二个switchTo()将失败,因为那里没有包含框架。

解决方法是删除第一个switchTo(),因为即使你的意图实际上什么也不做,并且第二个 driver.switchTo().frame(0); // menu

答案 2 :(得分:0)

在我看来,基于索引的导航存在问题。

尝试通过标记名称实现相同的工作按预期工作(在2.41.0和2.44.0依赖版本中)

    List<WebElement> frames = driver.findElementsByTagName("frame");
    driver.switchTo().frame(frames.get(0));
    List<WebElement> frames2 = driver.findElementsByTagName("frame");
    driver.switchTo().frame(frames2.get(1));