在从Cordova 3.4.0升级到Cordova 3.6.3之后,由于一个奇怪的错误,我的Appium测试无法继续。通过在Android上创建一个基本的基于web视图的应用程序,在测试开始一段时间后发布一个window.location.reload(),这个错误可以很容易地被复制。
评估问题
我可以评估这个问题是一个特殊的文件: cordova.js,当我用Cordova构建它时,它成为我应用程序中js文件的一部分。我的应用程序只加载一个javascript文件:cordova.js,我将所有其他依赖项删除到其他js文件。当该文件在我的应用程序中时(即使index.html不使用其中定义的任何函数),我的测试就会失败。如果我删除该文件的依赖项,测试就可以了!
问题是,当我的应用程序发出一个window.location.reload()时,我的测试在这个错误消息中失败了:
info:调试对客户端的错误响应:{"status":26,“value”:{“message”:“模式对话框已打开,阻止此操作”,“origValue”:“意外警报打开\n(会话信息: webview=)\n (驱动程序信息: chromedriver=2.10.267521,platform=Windows NT 6.3 x86_64)"},
如何复制
我创建了一个示例应用程序来复制这个东西。您可以找到我使用的app (APK文件)和C#测试。
APK复制,这是在附件中。可以运行一个简单的Appium测试来重现这个问题:
[Test]
public void SimpleTest()
{
this.appPackage = "com.myorg.myapp";
this.appActivity = "myapp";
BeforeAll();
Thread.Sleep(3000);
var submitAddressButton = driver.FindElementByClassName("testClass");
submitAddressButton.Click();
Thread.Sleep(3000);
submitAddressButton = driver.FindElementByClassName("testClass");
Expect(submitAddressButton, Is.Not.Null);
}重要
一个对话框被报道的事实实际上是非常奇怪的。在检查了很多之后,我可以验证我的应用程序上没有显示任何本机/webview对话框。事实上,我看不到任何对话框,如果我试图使用Appium和WebDriver API关闭这个幽灵对话框,命令就会失败,因为找不到任何对话框。
备注
考虑到问题不在我在测试中使用的API中(用于Appium的C# dotnet驱动程序)。一切都发生在我的Appium服务器上,运行在Mac上。
发布于 2015-01-27 14:37:51
我认为这是由于以下基于提示符的js<->java通信逻辑,它运行每个页面重新加载
androidExec.init = function() {
bridgeSecret = +prompt('', 'gap_init:' + nativeToJsBridgeMode);
channel.onNativeReady.fire();
}https://github.com/apache/cordova-android/blob/master/framework/assets/www/cordova.js#L948
Android本机层可以通过onJSPrompt (http://developer.android.com/reference/android/webkit/WebChromeClient.html#onJsPrompt(android.webkit.WebView)来处理这个问题,因此没有显示实际的对话框。但是Selenium驱动程序似乎不能正确地处理这种情况。
https://stackoverflow.com/questions/28054582
复制相似问题