我有问题要正确切换到框架。
该项目是使用此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>
</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
时,同样正常。
修改
我相信,这是错误的 - 我从window.frameElement描述中得到的最好的理解。
在我看来,像switchTo
应该像这样工作:
window.frames.length
返回1 window.frames[0].frames.length
返回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));