在 Cucumber/Calabash 中的 Android,如何使用 webview iframe 进行测试?

On Android in Cucumber/Calabash, how do I test with a webview iframe?

我可以在 Android 网络视图中找到 iframe,但我需要与其交互。各种页面建议

query("webView css:'iframe'", :stringByEvaluatingJavaScriptFromString => '...')

但这会导致 "No such method found: stringByEvaluatingJavaScriptFromString([String])",它看起来像一个 iOS 函数,所以我很确定这是一个仅 iOS 的解决方案:我需要 Android.

我知道我可以通过在 URL 中打开它们来传递 javascript 查询,但我只经历过使用特殊代码从 Android 网络视图中获取内容 Chrome 链接到应用程序的对象。

有什么获取数据的想法吗?

我在探索的过程中写下了相当于答案的内容,但我将其张贴在这里是为了节省其他人的时间(希望如此)。


我可以成功运行 Javascript 在视图中:

query("webView index:0", :loadUrl => 'javascript:alert("Hello")')

所以我可能可以合理地安排按下按钮以进行测试:

query("webview index:0", :loadUrl => 'javascript: ifr = document.getElementsByTagName("iframe")[0]; idoc = ifr.contentDocument || ifr.contentWindow.document; idoc.getElementById('myCheck').click(); false')

要再次获取数据,我可以创建一个 DIV 并使用一些 'return' 值设置其标题(例如):

query("webView index:0",  :loadUrl => 'javascript:var idiv = document.createElement("div"); idiv.id="grabby"; document.getElementsByTagName("body")[0].appendChild(idiv); idiv.title="some return value"; false')

(javascript: 命令中的尾随 'false' 是为了防止 运行 宁 javascript: 命令的结果替换页面 - 这花费了锻炼一段时间。)

我也可以查看 iframe:

query("webView index:0",  :loadUrl => 'javascript:var idiv = document.getElementById("grabby"); ifr = document.getElementsByTagName("iframe")[0]; idoc = ifr.contentDocument || ifr.contentWindow.document; idiv.title = idoc.getElementsByTagName("input")[3].id; false')

当我试图用

检索它时
query('webView css:#grabby')

它挂了一会儿,然后因超时而崩溃:

HTTPClient::ReceiveTimeoutError: execution expired
    from /Users/tim./.rvm/gems/ruby-2.1.5/gems/httpclient-2.6.0.1/lib/httpclient/session.rb:876:in `gets'
    from /Users/tim./.rvm/gems/ruby-2.1.5/gems/httpclient-2.6.0.1/lib/httpclient/session.rb:876:in `block in parse_header'
    from ...

奇怪的是,query('webView css:"*"') 似乎大多数情况下都没有超时,并报告 'grabby' DIV 完整的标题字符串

query('webView css:"*"').find { |e| e['id'] == 'grabby' }

所以这足够有用了。我将不得不编写一些可怕的递归下降的东西来找出 iframe 的内容 - 也许使 div 不可见,然后将 htmlContent 复制到那里。

我真的不知道为什么直接查询会崩溃。

iOS 响应是正确的,您应该使用 javascript 来获取 iframe 的内容。但是,您应该使用 evaluate_javascript(query_string, javascript) 来评估 Android 中的 javascript。例如

evaluate_javascript("webview", "return document.getElementsByTagName('iframe')[0].contentWindow.document.getElementById('...').getBoundingClientRect();")

使用坐标点按视图。

如果 rect 没有被正确解析,你可以这样做: var boundingBox = document.getElementsByTagName('iframe')[0].contentWindow.document.getElementById('main').getBoundingClientRect(); var rect = {}; rect.width = boundingBox.width; rect.height = boundingBox.height; rect.left = boundingBox.left; rect.top = boundingBox.top; return rect;

其次,query('webView css:#grabby') 不是有效查询。 query('webView css:"#grabby"')query("webView css:'#grabby'") 是。如果测试服务器崩溃而不是报告它,您很可能 运行 是(非常)旧版本的 Calabash-Android。