zoukankan      html  css  js  c++  java
  • 移动端混合型App(hybrid app)自动化测试选型与实践

    背景

      公司产品的业务已经发展到了移动端,开发选型已经结束,决定使用phonegap做移动端的web应用开发平台。考虑到业务的复杂与多样,移动端的测试同样需要自动化。在网上看了很多,最终锁定了3个移动端测试工具:Selendroid,Appium,Robotium。之所以选择他们3个,是因为团队已经有了以Selenium为基础的测试框架,而这三个工具与Selenium可以说一脉相承。

    目标

      基于phonegap的混合型app(hybrid app)web应用移动端自动化测试

    选型过程

    Selendroid(放弃)

    放弃Selendroid的原因是在按照官网教程操作后,运行测试时,报错,拿着报错在网上查询,结果都没有解决。资料少的可怜,后来看到Appium中集成了Selendroid后,果断放弃。

    Robotium(放弃)

    其实Robotium在尝试的过程中是最顺利的一个,功能也强大。

    但其只支持Android设备,而且其以Android Test工程测试的方式很难集成到公司团队已有的框架中,所以也放弃了。

    但是仍然会关注其发展,社区活跃,功能够精深有很多可以借鉴的地方。在Appium的研究过程中也起了很大的作用。

    Appium(选中)

    Appium支持ios和android设备,支持hybrid app,集成了Selendroid,易于集成到公司现有框架中,社区正在形成,文档资料也在丰富中。

    在尝试的过程中虽有曲折,但最后也顺利实现了。

    混合型app以Appium搭建自动化测试开发环境

    Appium

    官方网址:http://appium.io/

    中文社区:http://testerhome.com/

    下载地址(由testerhome社区提供):http://pan.baidu.com/s/1jGvAISu#dir

    1. 下载最新版本AppiumServer 1.2.0,解压后,进入目录下找到Appium.exe,运行即可,此程序作为Appnium与被测设备之间通讯的服务端

    出现如下界面说明启动成功

    2. 将真机连接到PC端

    3. 我使用Eclipse作为开发IDE,建立一个maven工程appium-demo,在pom中引用了公司框架中的Selenium核心工程,这样可以省去添加Selenium依赖的过程

    ,同时在maven的中央库中找到Appium包,并引用

    Appium的maven引用

    GroupId:io.appium

    ArtifactId:java-client

    Version:1.5.0

     4. 建立工程后,就可以写测试代码了,在工程中建立一个Junit Test类Test1.java,代码如下:

    package com.example.hello;
    
    import io.appium.java_client.AppiumDriver;
    
    import java.io.File;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.Set;
    
    import junit.framework.TestCase;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.junit.runners.BlockJUnit4ClassRunner;
    import org.openqa.selenium.By;
    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.remote.DesiredCapabilities;
    
    @RunWith(BlockJUnit4ClassRunner.class)
    public class Test1 extends TestCase {
    
        private AppiumDriver driver;
    
        @Before
        public void start() throws MalformedURLException {
            // 使用phonegap打包的hybrid app路径
            String apppath = "D:\Work\codes\hands\hands-hello-phonegap\platforms\android\bin\HelloWorld.apk";
    
            // 初始化AppniumDriver
            DesiredCapabilities capabilities = new DesiredCapabilities();
            capabilities.setCapability("deviceName", "NX403A");// 真机测试android设备
            capabilities.setCapability("platformVersion", "4.2.2");// 真机android版本为4.2.2
            capabilities.setCapability("platformName", "Android");// 真机为android系统
            capabilities.setCapability("app", apppath);// 被测app apk包的位置
            capabilities.setCapability("appPackage", "com.example.hello");// 被测app的Activity类所在包
            capabilities.setCapability("appActivity", ".HelloWorld");// 被测app的Activity类
            capabilities.setCapability("automationName", "selendroid");// 因为真机为4.2版本,所以使用selendroid
            // http://127.0.0.1:4723/wd/hub地址就是AppiumServer的地址
            driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"),
                    capabilities);
        }
    
        @Test
        public void main() {
            try {
                Set<String> contextNames = driver.getContextHandles();
                for (String contextName : contextNames) {
                    System.out.println(contextName); // 用于返回被测app是NATIVE_APP还是WEBVIEW,如果两者都有就是混合型App
                }
    
                Thread.sleep(5000);// 等它一会
    
                driver.context("WEBVIEW_0");// 让appium切换到webview模式以便查找web元素
                WebElement text_baidusearch = driver.findElement(By.id("word"));
                text_baidusearch.click();// 点击百度的搜索输入框(web元素)
    
                /*
                 * appium不支持中文输入 参考了robotium的以js方式为元素直接设置value的做法
                 * 利用Selenium中Webdriver执行js方法实现中文输入
                 */
                JavascriptExecutor jse = (JavascriptExecutor) driver;
                jse.executeScript("document.getElementById('word').value='输入法'");
    
                Thread.sleep(10000);// 等一会观察下效果
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        @After
        public void stop() {
            driver.quit();
        }
    
    }

    工程结构如下

    5. 保持被测设备为解锁状态,虽然Appium有一个unlock的功能,但有时不起作用,所以最好还是将锁屏关闭。运行Test1.java,得到如下结果

     

  • 相关阅读:
    ansible执行命令或playbook报错原因及解决方法整理
    一款基于WordPress生成的微信小程序源码,免费开源
    WordPress小程序之酱茄Free小程序开源版更新敏感词检测功能
    酱茄pro小程序发布直播和地理位置功能(WordPress小程序)
    WordPress小程序-酱茄cms(积分阅读小程序)V1.1.0发布
    酱茄Free主题 – 酱茄WordPress资讯主题免费开源版下载
    酱茄Pro小程序V1.6.6更新之订阅消息发布
    WordPress小程序源码下载 酱茄开源版小程序源码
    酱茄助你三分钟打造专属WordPress社区论坛小程序
    酱茄cms小程序专为WordPress内容/知识付费场景设计
  • 原文地址:https://www.cnblogs.com/zzzhuxf/p/3860647.html
Copyright © 2011-2022 走看看