我的新浪微博:http://weibo.com/u/1602714773
CSDN博客:http://blog.csdn.net/hunterno4
robotium原理之获取WebElement元素
上一篇 /
下一篇 2014-06-28 19:35:46
/ 个人分类:robotium
robotium框架支持
WebView,在robotium中有getWebElements()、getWebElements(By by)等方法来获取
android中的WebView的元素,并提供了 clickOnWebElement方法来完成点击事件.android中的原生控件是比较好攻取的,那么对于WebView这个框架是怎么获取的呢。
第一步:利用JS获取页面中的所有元素
在PC上,获取网页的元素可以通过注入javascript元素来完成,以Chrome浏览器为例,打开工具——JavaScript控制台(快捷方式:Ctrl+Shift+J),输入 javascript.:prompt(document.URL)即会弹出含当前页面的URL的提示框,因此通过编写适当的JS脚本是可以在这个弹出框中显示所有页面元素的。RobotiumWeb.js就是此功能实现用的JS脚本。以solo中getWebElements()为例,
- public ArrayList<WebElement> getWebElements(boolean onlySufficientlyVisible){
- boolean javaScriptWasExecuted = executeJavaScriptFunction("allWebElements();");
-
- return getWebElements(javaScriptWasExecuted, onlySufficientlyVisible);
- }
- private boolean executeJavaScriptFunction(final String function){
- final WebView webView = viewFetcher.getFreshestView(viewFetcher.getCurrentViews(WebView.class, true));
-
- if(webView == null){
- return false;
- }
-
- final String javaScript = prepareForStartOfJavascriptExecution();
-
- activityUtils.getCurrentActivity(false).runOnUiThread(new Runnable() {
- public void run() {
- if(webView != null){
- webView.loadUrl("javascript.:" + javaScript + function);
- }
- }
- });
- return true;
- }
可以看出这个方法执行的是allWebElements();函数,即类似执行RobotiumWeb.js文件中如下JS代码片段:
可以把如下片段放到JavaScript控制台中看效果
- javascript.:
- function allWebElements() {
- for (var key in document.all){
- try{
- promptElement(document.all[key]);
- }catch(ignored){}
- }
- finished();
- }
-
- function promptElement(element) {
- var id = element.id;
- var text = element.innerText;
- if(text.trim().length == 0){
- text = element.value;
- }
- var name = element.getAttribute('name');
- var className = element.className;
- var tagName = element.tagName;
- var attributes = "";
- var htmlAttributes = element.attributes;
- for (var i = 0, htmlAttribute; htmlAttribute = htmlAttributes[i]; i++){
- attributes += htmlAttribute.name + "::" + htmlAttribute.value;
- if (i + 1 < htmlAttributes.length) {
- attributes += "#$";
- }
- }
-
- var rect = element.getBoundingClientRect();
- if(rect.width > 0 && rect.height > 0 && rect.left >= 0 && rect.top >= 0){
- prompt(id + ';,' + text + ';,' + name + ";," + className + ";," + tagName + ";," + rect.left + ';,' + rect.top + ';,' + rect.width + ';,' + rect.height + ';,' + attributes);
- }
- }
- function finished(){
- prompt('robotium-finished');
- }
从脚本中可以看出JS获得页面元素后还进行了一定的格式化处理,在每个元素之间加了;,符号,这也是为了在后面代码中更加方便地解析。脚本的最后调用了finished()函数,即弹出包含robotium-finished的提示框。这一步完成了页面元素的获取,那么提示框中包含的内容在Android中怎么获取呢?
第二步:在Android中获取WebView中prompt提示框中的信息
在Android的Webkit包中有个WebChromeClient类,这个类中的onJsPrompt方法就是用于处理WebView中的提示框的,当WebView中有JS提示框时,会回调该方法,String message参数将包含提示框中的信息,因此robotium写了个继承自WebChromeClient类的.
写不下了,原文链接:http://blog.csdn.net/hunterno4/article/details/35569665
相关阅读:
- 传谷歌将推新设计语言 统一Android界面 (nana135, 2014-6-16)
- 消息称小米正在筹备进军美国市场计划 (nana135, 2014-6-16)
- Android启动过程深入解析 (zaza9084, 2014-6-26)
- Android数据的四种存储方式之SQLite数据库 (zaza9084, 2014-6-23)
- Android测试提升效率批处理脚本 (zaza9084, 2014-7-01)
- Eclipse中Android单元测试 (zaza9084, 2014-6-25)
- 谷歌开拓新领域:电视汽车将配备Android系统 (nana135, 2014-6-24)
- Junit实现Android单元测试 (zaza9084, 2014-6-26)
- 任意Android设备上运行测试 (zaza9084, 2014-7-07)
- 谷歌全线布局生态系统:新一代Android亮相 (nana135, 2014-6-26)
收藏
举报
TAG:
Android
robotium
Robotium
WebElement
webelement
webView
WebView