我的新浪微博: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()为例,
  1. public ArrayList<WebElement> getWebElements(boolean onlySufficientlyVisible){  
  2.     boolean javaScriptWasExecuted = executeJavaScriptFunction("allWebElements();");  
  3.       
  4.     return getWebElements(javaScriptWasExecuted, onlySufficientlyVisible);  
  5. }  
  1. private boolean executeJavaScriptFunction(final String function){  
  2.     final WebView webView = viewFetcher.getFreshestView(viewFetcher.getCurrentViews(WebView.classtrue));  
  3.   
  4.     if(webView == null){  
  5.         return false;  
  6.     }  
  7.                //做一些JS注入执行前的准备工作,例如将WebView设为可允许执行JS等,并将RobotiumWeb.js中的脚本以String形式返回  
  8.     final String javaScript = prepareForStartOfJavascriptExecution();  
  9.   
  10.     activityUtils.getCurrentActivity(false).runOnUiThread(new Runnable() {  
  11.         public void run() {  
  12.             if(webView != null){  
  13.                 webView.loadUrl("javascript.:" + javaScript + function);  
  14.             }  
  15.         }  
  16.     });  
  17.     return true;  
  18. }  
        可以看出这个方法执行的是allWebElements();函数,即类似执行RobotiumWeb.js文件中如下JS代码片段:
可以把如下片段放到JavaScript控制台中看效果
[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
  1. javascript.:  
  2. function allWebElements() {  
  3.     for (var key in document.all){  
  4.         try{  
  5.             promptElement(document.all[key]);   //调用promptElement(element)函数          
  6.         }catch(ignored){}  
  7.     }  
  8.     finished();    //执行完后,调用finished()函数  
  9. }  
  10.   
  11. function promptElement(element) {  
  12.     var id = element.id;  
  13.     var text = element.innerText;  
  14.     if(text.trim().length == 0){  
  15.         text = element.value;  
  16.     }  
  17.     var name = element.getAttribute('name');  
  18.     var className = element.className;  
  19.     var tagName = element.tagName;  
  20.     var attributes = "";  
  21.     var htmlAttributes = element.attributes;  
  22.     for (var i = 0, htmlAttribute; htmlAttribute = htmlAttributes[i]; i++){  
  23.         attributes += htmlAttribute.name + "::" + htmlAttribute.value;  
  24.         if (i + 1 < htmlAttributes.length) {  
  25.             attributes += "#$";  
  26.         }  
  27.     }  
  28.   
  29.     var rect = element.getBoundingClientRect();  
  30.     if(rect.width > 0 && rect.height > 0 && rect.left >= 0 && rect.top >= 0){  
  31.         prompt(id + ';,' + text + ';,' + name + ";," + className + ";," + tagName + ";," + rect.left + ';,' + rect.top + ';,' + rect.width + ';,' + rect.height + ';,' + attributes);   //弹出包含id、text、name等字段的提示框  
  32.     }  
  33. }  
  34. function finished(){  
  35.     prompt('robotium-finished');    //弹出包含robotium-finished字符串的提示框,用于标识脚本注入执行结束  
  36. }  

        从脚本中可以看出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

TAG: Android robotium Robotium WebElement webelement webView WebView

 

评分:0

我来说两句

Open Toolbar