虽然Athrun对WebView的支持不是很完美,但一些基本功能还是可以完成的,比如:查找一个名字为“HelloWeb”的Web Element,并将其值改为“Hello World!”。相应的用法如下:
webview.typeTextInWebElement(By.name("HelloWeb"), "Hello World!", 0);
一 WebView自动化测试的应用与原理
1 进入Web页面
首先,它的执行步骤和Native View的操作步骤是一致的,通过形如以下的代码进入真正的Web页面:
findElementByText("WebView").doClick();
WebViewElement webview = findWebElementById("mywebview", WebViewElement.class);
2 查找Web元素
接下来,我们需要在WebView页面上找到相应的子元素。Athrun框架中封装了一个By类,并扩展了多个内部子类用于封装各种Web子控件的查找方法,如:Id ,Xpath ,CssSelector,ClassName,Name,Text,TagName等。请看以下例子:
WebElement webEle = webview.getWebElement(By.className("btn-bg"),0);
上述例子的具体含义为:通过ClassName为“btn-bg”来查找WebElement。
那为什么通过这个ClassName就能找到呢?这个问题是最关键。请看下面的调用顺序:
getWebElement 调 用
waitForWebElement调 用
searchForWebElement 调 用
getCurrentWebElements,getViewFromList
其实直接返回WebElement的是searchForWebElement方法,我们看看它的具体实现:
/**
* Searches for a web element.
*
* @param by the By object.
* @param minimumNumberOfMatches the minimum number of matches that are expected to be shown. 0 means any number of matches
* @param timeout the amount of time in milliseconds to wait
* @param scroll true if scrolling should be performed
* @return true if the web element is found
*/
private WebElement searchForWebElement(final By by, int minimumNumberOfMatches, int timeout, boolean scroll){
if(minimumNumberOfMatches < 1){
minimumNumberOfMatches = 1;
}
List<WebElement> viewsFromScreen = webUtils.getCurrentWebElements(by);
addViewsToList (webElements, viewsFromScreen);
return getViewFromList(webElements, minimumNumberOfMatches);
}
在searchForWebElement中,先调用getCurrentWebElements(by)获取所有条件符合by的WebElements,然后通过getViewFromList获取webElements列表中符合参数minimumNumberOfMatches的WebElement。
getViewFromList挺好理解的,关键是getCurrentWebElements这个方法。它是怎么做到的呢?
/**
* Returns an ArrayList of WebElements of the specified By object currently shown in the active WebView.
*
* @param by the By object.
* @return an ArrayList of the WebElement objects currently shown in the active WebView
*/
public ArrayList<WebElement> getCurrentWebElements(final By by) {
boolean javaScriptWasExecuted = executeJavaScript(by);
return getSufficientlyShownWebElements(javaScriptWasExecuted);
}
上文中的executeJavaScript和getSufficientlyShownWebElements才是解决问题的突破口。
executeJavaScript:在java中执行js脚本
getSufficientlyShownWebElements:保存所有完全显示在界面上的web元素。
executeJavaScript方法做了哪些工作呢?
I 通过读取Athrun框架下的WebView.js(WebUtils-> getJavaScriptAsString)文件,并将读取的内容保存在一个String中。而WebView.js中定义了各种查找页面元素的方法,如:
function id(id)、
function xpath(xpath)、
function cssSelector(cssSelector)等。
II通过By的具体类型(Id,Name,CssSelector等),拼凑出一个function的调用,其中包括function名及其参数,并以String的类型返回,如:
executeJavaScriptFunction("id(\"" + by.getValue() + "\");")中的
"id(\"" + by.getValue() + "\");"
III 在方法executeJavaScriptFunction方法中,将I和II返回的结果拼凑,并加上前缀“javascript:”,最终就变成:
Javascript:+ WebView.js原文+ id(by.getValue());并将其传给webView.loadUrl方法,如:
webView.loadUrl("javascript:" + javaScript + function);
因为id(String)方法在WebView.js中已声明定义了,所以是合法调用。
通过执行executeJavaScript方法,找到了符合by的所有web元素,接下来就调用getSufficientlyShownWebElements方法将所有显示在页面上的元素保存在一个数据中,也就的到了getCurrentWebElements所要的结果了,所以想要的元素也找到了,所以就可以触发点击事件,输入文本事件了。
3 触发动作
获取到WebElement后,就可以获取其Location,如:
webElement.getLocationX()
webElement.getLocationY()
然后就可以clickOnScreen了,click其实也是通过Instrumentation发送event事件的。如下所示:
/**
* Clicks on a given coordinate on the screen.
*
* @param x
* the x coordinate
* @param y
* the y coordinate
*/
public void clickOnScreen(float x, float y) {
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis();
MotionEvent event = MotionEvent.obtain(downTime, eventTime,
MotionEvent.ACTION_DOWN, x, y, 0);
MotionEvent event2 = MotionEvent.obtain(downTime, eventTime,
MotionEvent.ACTION_UP, x, y, 0);
try{
inst.sendPointerSync(event);
inst.sendPointerSync(event2);
}catch(SecurityException e){
Assert.assertTrue("Click can not be completed!", false);
}
}
现在整个WebView的自动化测试就完成了。
总结:WebView自动化测试,其实就是Java执行Js的一系列操作。
相关推荐
介绍了athrun自动化测试工具的使用及举例
- **跨架构支持:** Appium支持Native(原生)、Hybrid(混合)以及Webview应用程序的自动化测试。 - **跨设备兼容:** 可以在Android、iOS以及Firefox OS等不同操作系统平台上的设备进行自动化测试。 - **跨语言...
Robotium、Selendroid、Appium和Calabash支持跨平台测试,其中Appium是目前最受欢迎的黑盒测试框架,而Athrun则是淘宝提供的自动化测试解决方案,支持iOS和Android。 测试可以按照不同标准分类。黑盒测试和白盒测试...
Athrun可能是一个专为特定目的设计的开源工具,如自动化测试、任务调度或者数据处理。由于标签中提到了“源码”和“工具”,我们可以推测这个Demo包含了一些代码示例,用于展示如何使用Athrun进行开发或操作。 描述...
【单项论证报告(标准设备)】讨论了OS自动化测试实验室的建设,重点是引入TestinPro自动化测试系统,以解决208所在自动化测试、效率和资产管理方面的挑战。以下是相关知识点的详细说明: 1. **自动化测试能力**: ...
没有源码也是可以做的) 被测应用下载:http://download.csdn.net/detail/wirelessqa/4487252 测试代码(只贴出MainActivity和GridView,用例很简单就不多作注释了) 大家可以对照着Athrun的用例来看看两个框架...
自动化测试框架(如Athrun)是提高开发效率和保证应用质量的关键技术之一。它能够自动化进行业务测试,加速开发流程,并有效减少因手工测试可能引入的错误。 9. 应用架构组成: 支付宝钱包由多个应用中心组成,...
**arthrun**是一款由阿里巴巴集团内部开发并开源的移动应用自动化测试框架。其主要针对的是Android和iOS平台的应用进行自动化测试,旨在通过自动化手段来解决无线应用在测试过程中遇到的各种问题。arthrun的核心理念...
Arthrun 是一个自动化测试框架,主要针对iOS和Android平台的应用程序。它提供了一套工具集,用于构建和执行自动化测试,以确保应用程序的功能性和稳定性。Arthrun 的设计目的是简化测试过程,提高测试效率,并允许...
- 掌握使用Monkey、MonkeyRunner、JUnit、Robotium、Appium、Athrun等工具进行自动化测试和性能测试。 12. 持续集成与测试: - 理解CI/CD的概念,学习如何将TMTS集成到开发流程中。 13. 国际化与适配: - 学习...
Dalvik的源码解析可以帮助我们理解垃圾回收、类加载、优化和多线程执行的细节。 5. **Framework层**:这一层包含了许多核心服务,如Activity Manager、Content Providers、Broadcast Receivers和Intent Services等...
1. 人物名称:文档中提及了多位高达系列中的角色,如基拉·大和(Kira Yamato)、拉克丝·克莱恩(Lacus Clyne)、卡嘉莉·尤拉·阿斯哈(Cagalli Yula Athha)、阿斯兰·萨拉(Athrun Zala)、玛莉娜·伊斯迈尔...
这是因为这些应用程序依赖于微软的C++运行时库,而这些库并没有随Windows系统自动安装。 MSVCP120.dll是Microsoft Visual C++ 2013运行时库的一部分,它包含了C++标准库的实现和其他一些必要的运行时组件。当应用...