`
huangqinqin
  • 浏览: 365751 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

Athrun框架WebView自动化测试源码解析

 
阅读更多

虽然AthrunWebView的支持不是很完美,但一些基本功能还是可以完成的,比如:查找一个名字为“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 CssSelectorClassNameNameTextTagName。请看以下例子:

WebElement webEle =  webview.getWebElement(By.className("btn-bg"),0);

 

 

上述例子的具体含义为:通过ClassName为“btn-bg”来查找WebElement

那为什么通过这个ClassName就能找到呢?这个问题是最关键。请看下面的调用顺序:

 

getWebElement     

waitForWebElement  

searchForWebElement     

getCurrentWebElementsgetViewFromList

 

其实直接返回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)获取所有条件符合byWebElements,然后通过getViewFromList获取webElements列表中符合参数minimumNumberOfMatchesWebElement

 

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);
    }

 

 

上文中的executeJavaScriptgetSufficientlyShownWebElements才是解决问题的突破口。

executeJavaScript:在java中执行js脚本

getSufficientlyShownWebElements:保存所有完全显示在界面上的web元素。

 

executeJavaScript方法做了哪些工作呢?

I  通过读取Athrun框架下的WebView.jsWebUtils-> getJavaScriptAsString文件,并将读取的内容保存在一个String中。而WebView.js中定义了各种查找页面元素的方法,如:

function id(id)

function xpath(xpath)

function cssSelector(cssSelector)等。

 

II通过By的具体类型(IdNameCssSelector等),拼凑出一个function的调用,其中包括function名及其参数,并以String的类型返回,如:

executeJavaScriptFunction("id(\"" + by.getValue() + "\");")中的

"id(\"" + by.getValue() + "\");"

 

 

III 在方法executeJavaScriptFunction方法中,将III返回的结果拼凑,并加上前缀“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自动化测试工具介绍

    介绍了athrun自动化测试工具的使用及举例

    appium手机自动化测试-黄延胜

    - **跨架构支持:** Appium支持Native(原生)、Hybrid(混合)以及Webview应用程序的自动化测试。 - **跨设备兼容:** 可以在Android、iOS以及Firefox OS等不同操作系统平台上的设备进行自动化测试。 - **跨语言...

    深入浅出Android 自动化测试1

    Robotium、Selendroid、Appium和Calabash支持跨平台测试,其中Appium是目前最受欢迎的黑盒测试框架,而Athrun则是淘宝提供的自动化测试解决方案,支持iOS和Android。 测试可以按照不同标准分类。黑盒测试和白盒测试...

    Athrun Demo

    Athrun可能是一个专为特定目的设计的开源工具,如自动化测试、任务调度或者数据处理。由于标签中提到了“源码”和“工具”,我们可以推测这个Demo包含了一些代码示例,用于展示如何使用Athrun进行开发或操作。 描述...

    单项论证报告(标准设备).docx

    【单项论证报告(标准设备)】讨论了OS自动化测试实验室的建设,重点是引入TestinPro自动化测试系统,以解决208所在自动化测试、效率和资产管理方面的挑战。以下是相关知识点的详细说明: 1. **自动化测试能力**: ...

    Android自动化测试之Robotium&lt;二>:用例分析

    没有源码也是可以做的)  被测应用下载:http://download.csdn.net/detail/wirelessqa/4487252   测试代码(只贴出MainActivity和GridView,用例很简单就不多作注释了)  大家可以对照着Athrun的用例来看看两个框架...

    王卫星:支付宝钱包开发框架

    自动化测试框架(如Athrun)是提高开发效率和保证应用质量的关键技术之一。它能够自动化进行业务测试,加速开发流程,并有效减少因手工测试可能引入的错误。 9. 应用架构组成: 支付宝钱包由多个应用中心组成,...

    arthrun-ios简介

    **arthrun**是一款由阿里巴巴集团内部开发并开源的移动应用自动化测试框架。其主要针对的是Android和iOS平台的应用进行自动化测试,旨在通过自动化手段来解决无线应用在测试过程中遇到的各种问题。arthrun的核心理念...

    arthrun 相关文档简介

    Arthrun 是一个自动化测试框架,主要针对iOS和Android平台的应用程序。它提供了一套工具集,用于构建和执行自动化测试,以确保应用程序的功能性和稳定性。Arthrun 的设计目的是简化测试过程,提高测试效率,并允许...

    安卓开发学习路线图.pdf

    - 掌握使用Monkey、MonkeyRunner、JUnit、Robotium、Appium、Athrun等工具进行自动化测试和性能测试。 12. 持续集成与测试: - 理解CI/CD的概念,学习如何将TMTS集成到开发流程中。 13. 国际化与适配: - 学习...

    Android2.2源码core包

    Dalvik的源码解析可以帮助我们理解垃圾回收、类加载、优化和多线程执行的细节。 5. **Framework层**:这一层包含了许多核心服务,如Activity Manager、Content Providers、Broadcast Receivers和Intent Services等...

    高达的经典台词参照.pdf

    1. 人物名称:文档中提及了多位高达系列中的角色,如基拉·大和(Kira Yamato)、拉克丝·克莱恩(Lacus Clyne)、卡嘉莉·尤拉·阿斯哈(Cagalli Yula Athha)、阿斯兰·萨拉(Athrun Zala)、玛莉娜·伊斯迈尔...

    VCredist_x64.rar

    这是因为这些应用程序依赖于微软的C++运行时库,而这些库并没有随Windows系统自动安装。 MSVCP120.dll是Microsoft Visual C++ 2013运行时库的一部分,它包含了C++标准库的实现和其他一些必要的运行时组件。当应用...

Global site tag (gtag.js) - Google Analytics