chromedriver.switchTo().frame(webview) 在测试 chrome 应用程序时崩溃

chromedriver.switchTo().frame(webview) crashes when testing a chrome app

我有一个 chrome 应用程序,里面有一个 webview。为了 运行 功能测试,我需要单击此 Web 视图中的元素,但 driver.switchTo().frame(webview) 崩溃并出现异常 org.openqa.selenium.NoSuchFrameException

示例代码:

System.setProperty("webdriver.chrome.driver", "/home/janindua/Software/chromeDriver/chromedriver");

ChromeOptions options = new ChromeOptions();
options.addExtensions(new File("/home/janindua/workspace/discovery-ui/scraper2/build/target/scraper.crx"));
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
ChromeDriver driver = new ChromeDriver(capabilities);
driver.get("chrome-extension://monoimhdfegpapbgppdmjfdgjdbkpboi/window.html");
driver.navigate().refresh();
driver.findElement(By.id("weburl-txtbox")).sendKeys("http://google.com/");
driver.findElementById("weburl-btn").click();
Thread.sleep(10000);
WebElement we = driver.findElementById("webv");
driver.switchTo().frame(we);

window html :

堆栈跟踪:

Exception in thread "main" org.openqa.selenium.NoSuchFrameException: no such frame: element is not a frame
(Session info: chrome=42.0.2311.135)
(Driver info: chromedriver=2.16.333243         
(0bfa1d3575fc1044244f21ddb82bf870944ef961),platform=Linux 3.13.0-24-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 9 milliseconds
Build info: version: '2.46.0', revision: '87c69e2', time: '2015-06-04   16:17:10'
System info: host: 'janindua', ip: '127.0.1.1', os.name: 'Linux',  os.arch: 'amd64', os.version: '3.13.0-24-generic', java.version: '1.7.0_80'
Session ID: 878af1ba4a28469360756d6f786f6510
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=LINUX, acceptSslCerts=true,  javascriptEnabled=true, browserName=chrome, chrome={userDataDir=/tmp/.com.google.Chrome.ZJ2D7R}, rotatable=false, locationContextEnabled=true, mobileEmulationEnabled=false, version=42.0.2311.135, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, webStorageEnabled=true, nativeEvents=true, hasTouchScreen=false, 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:204)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:156)
at    org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:605)
at org.openqa.selenium.remote.RemoteWebDriver$RemoteTargetLocator.frame(RemoteWebDriver.java:895)
at Google.main(Google.java:26)

目前这是一个已知错误,报告为 Issue 960

如果您的 chrome 应用使用 webview 加载网页并且您想要 运行 一些自动化脚本,chrome驱动程序不提供访问元素的方法在 webview 中加载的网页。

chromedriver.switchTo().frame(webview)chromedriver.switchTo().window(webview) 方法都会抛出异常,因为 webview 不是任一方法可接受的输入。

janindu's answer is no longer correct (Partialy).

Since Oct 2015 there is a proper method to get webviews window handle

如何: 我们需要通知驱动程序我们希望它处理 webviews window 处理程序 (chromeOptions 和 windowTypes 是重要的部分)

它应该看起来像这样

capabilities: {
     'browserName': 'chrome',
     'chromeOptions': {
         'windowTypes': ['webview']
     }
},

之后,就可以按照通常的方式获取window处理程序,

browser.getAllWindowHandles()