Appium 移动端混合型 App (hybrid app) 自动化测试选型与实践

虎卧荒丘 · July 24, 2014 · Last by 江门 replied at May 23, 2016 · 4963 hits
本帖已被设为精华帖!

背景

  公司产品的业务已经发展到了移动端,开发选型已经结束,决定使用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

附测试apk:http://pan.baidu.com/s/1nt9KPKl
由于有的小伙伴一直无法调通环境,特写了一个demo放到github了
项目地址:https://github.com/github1978/appium-hybrid-demo

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,得到如下结果

总结

本次选型的结果还不错,下一步就是考察appium的可扩展性。
PS:找到了testerhome这样的社区,希望能成为一个成熟的、活跃的社区。最终成为测试界的领航者。

共收到 26 条回复 时间 点赞

大赞~~很希望大家都来加入testerhome~~给我们增加新的血液~~

#1楼 @monkey 嗯 以后会常在社区做交流 :) 多多关照

#2楼 @umbrella1978 1.5坑很多吧?感觉都没经过检验

#3楼 @lihuazhang 正在深入了解,也许不久就会碰到:P

楼主的头像稍微有点熟悉了。。

看得我也想尝试用Appium来做自动化 ==》==

文章结构清晰有条不紊视为发帖范文!@umbrella1979你是混合模式的app,那ui自动化可以完全整合进你web的测试框架!

#7楼 @luis 嗯 一直在做,这次的目的也将移动端的UI自动化整合到框架中

要测的app是NATIVE_APP,请问有方法可以输入中文吗😭

狂赞,希望以后多多分享使用经验。多多支持我们这个技术驱动型的测试社区。

#9楼 @liqing380 可以,appium有成熟的方案了。可以参考论坛上的帖子。

hybrid app如何定位webview中的元素?去网页上获取?

#12楼 @adfghzhang 是的,如果是wap网页,就用wap浏览器去浏览,这里推荐用chrome或者火狐上一个在线wap浏览的地址。例如下面这个:http://www.pctowap.com/
这样用chrome的开发者工具(审查元素)的功能就能获取到元素的属性
如果是内网的话,需要使用chrome(需要开发版)或者遨游浏览器模拟手机模式去访问,推荐用遨游
可以看这个资料:http://www.iqshw.com/qqjiqiao/20140214/71831.html
另外要注意的是像百度搜索这种,在用2G网络、3G网络和wifi下的页面会有不同,需要注意,如果是自己内部的项目有必要的话也要注意

#13楼 @umbrella1978 helloworld.apk的内容是什么?就是一个webview吗?能发个给我看看吗

#14楼 @luckystaff 这个apk是用phonegap打包出来的,其实只是在其中加了一个跳转链接访问指定地址而已
apk已经上传到:http://pan.baidu.com/s/1nt9KPKl
关于phonegap可以去查查资料,跨平台的混合app解决方案

麻烦问一下,appium 测试结束后自动生成的测试报告,以及测试过程中发现问题的统计、log的抓取这些是一个怎样的情况呢,有没有已经涉及到了?

#16楼 @sas 这些都需要自己去实现appium只是提供一个自动化的工具,需要我们自己在脚本中插入检查点、截图以及收集信息输出测试报告

迄今为止,在这里看到最好的帖子!拜谢。

大赞一个

楼主,您好!selendroid模式启动一定要加app=‘被测app’这句吗?如果使用selendroid模式,但不加这句是不是回报错?

中文输入早已支持,需要你在代码里输入,http://www.cnblogs.com/cingchen/p/4319012.htmltry这里有介绍,还有等待用 catch等待元素加载的办法不是很方便,有时候手机卡了就会运行失败,可以借鉴这个http://www.cnblogs.com/cingchen/p/4347853.html

我直接在手机chrome里输入www.baidu.com, 然后执行
for (String contextName : contextNames) {
System.out.println(contextName); // 用于返回被测app是NATIVE_APP还是WEBVIEW,如果两者都有就是混合型App
}

输出结果是NATIVE_APP和WEBVIEW_1.为什么会这样呢?纯webview不应该输出WEBVIEW_0吗?

而且关于如何获得百度搜索框的ID可以给出更详细点的步骤吗?

小白在此谢过。。

#22楼 @sunflower 你的chrome不是native app 么?

问个问题, 对于微信公众号,如何自动化测试呢?

#15楼 @umbrella1978 求助楼主,我用手机chrome打开我们的H5页面可以获取到webview的content,在微信里进入H5就获取不到这个CONTENT,然后用chrome里获取到的content在微信里切换webview,也不成功~有什么高见么?

26Floor has been deleted

#13楼 @umbrella1978

用chrome的INSPECT可以实现,不过需要***。。。。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up