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

在Cucumber/Calabash中的Android上,如何使用webview iframe进行测试?,android,iframe,calabash,Android,Iframe,Calabash,我可以在Android webview中找到iframe,但我需要与之交互。各页建议 query("webView css:'iframe'", :stringByEvaluatingJavaScriptFromString => '...') 但这导致“找不到这样的方法:stringByEvaluatingJavaScriptFromString([String])”,而且它看起来像一个iOS函数,所以我很确定这是一个iOS唯一的解决方案:我需要Android 我知道我可以通过在URL

我可以在Android webview中找到iframe,但我需要与之交互。各页建议

query("webView css:'iframe'", :stringByEvaluatingJavaScriptFromString => '...')
但这导致“找不到这样的方法:stringByEvaluatingJavaScriptFromString([String])”,而且它看起来像一个iOS函数,所以我很确定这是一个iOS唯一的解决方案:我需要Android

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


获取数据有什么想法吗?

我在探索时写了一个相当于答案的东西,但我在这里发布它是为了节省其他人的时间(希望如此)


我可以在视图中成功运行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:command后面的'false'用于防止运行javascript:command的结果替换页面,这需要一段时间才能解决。)

我也可以查看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的内容。但是,您应该使用
评估javascript(query\u string,javascript)
来评估Android中的javascript。e、 g

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;
返回矩形;


其次,
query('webView css:#grabby')
不是有效的查询<代码>查询('webView css:“#grabby'”)或
查询('webView css:“#grabby'”)
。如果测试服务器崩溃而不是报告,则您很可能正在运行(非常)旧版本的Calabash Android。

您可能不需要创建div或加载url。我在一个应用程序上做了一些复杂的工作,该应用程序使用JavaScript iOS WebView API使用iframes。找不到这样的方法:stringByEvaluatingJavaScriptFromString([String])它只是iOS,您应该知道WKWebView的API已更改。这非常有帮助,特别是将bbox复制到一个新的散列:没有它,它只是返回“{}”。我发现Javascript坐标需要被包含iframe的位置在webView中偏移,然后偏移并缩放到Android坐标系,然后才能用于单击对象。特别是,我通过将查询('webView索引:0')的宽度和高度除以Javascript的window.innerWidth和window.innerHeight来确定webView的Android和Javascript比例因子。我需要在其他手机上测试这个,但到目前为止看起来似乎是合理的。你可能是对的。您可以看看我们是如何缩放和转换webview坐标的,我们已经在几部手机上成功测试过了。如果您不忘记整数不能很好地表示1.5,那么缩放效果最好。我真希望Ruby能够支持静态类型。