AppiumDriver<MobileElement>和 AndroidDriver 之间的区别

Appium学习总结-练手项目:开源中国APP-爱编程
Appium学习总结-练手项目:开源中国APP
在APP发展广泛的社会上,我们测试人员的测试技能也要跟着进步,对面APP的测试,每次都要快速上线新版本的迭代测试中,测试人员每次都要做很多次的回归测试,让人觉得好疲累。对面这种情况,现在使用Appium来做自动化测试,可以帮助测试人员能够准确快速地做很多次回归测试啦!
Appium的环境搭建和配置,在本文我就不多说了,具体请详见我的博文“” 。
今天整理下,以前用开源中国APP当练手项目的实践经验,在环境搭建好的前提下,大概包括以下几方面:
一、测试用例的设计
写测试用例前,先要了解APP的所有功能模块,明确测试范围,确定测试用例的颗粒度。
假如测试项目的测试时间比较紧迫,一般都是建议重点先测试用户使用频率比较高的基本功能点。
假如测试项目的测试时间比较充裕,那测试用例的颗粒度可以做到最小,把覆盖面扩大到所有功能点上。
根据我对开源中国APP的功能了解,大概设计了部分测试用例,可见下图或。
二、代码测试框架的设计
我的设计是这样的
1、& 每个测试用例,写一个测试TestCase文件。
2、& 所有TestCase文件都会使用到的方法,写在一个BaseTest类里,由TestCase文件来继承使用。比如:启动Appium、截图。
3、& 部分TestCase文件会使用到的方法,可以按功能点来建一个类,再调用。比如:登录功能、注销功能、收藏结果比对。
4、& 每个TestCase文件都可以单独执行。
5、& 也可以把所有TestCase文件放到XML文件里,运行TestNG Suite,批量执行测试用例。
三、源代码
源代码,只涉及到安卓机的,可见下图,也可以详见。
以下是“综合-开源资讯-收藏”测试用例,OscLoginNewsCollection类,源代码如下:
package com.appium.
import java.io.F
import java.net.URL;
import java.util.HashM
import java.util.L
import java.util.concurrent.TimeU
import mons.io.FileU
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptE
import org.openqa.selenium.OutputT
import org.openqa.selenium.TakesS
import org.openqa.selenium.WebD
import org.openqa.selenium.WebE
import org.openqa.selenium.remote.DesiredC
import org.openqa.selenium.support.ui.ExpectedC
import org.openqa.selenium.support.ui.WebDriverW
import org.testng.A
import org.testng.R
import org.testng.annotations.AfterC
import org.testng.annotations.BeforeC
import org.testng.annotations.T
import io.appium.java_client.AppiumD
import io.appium.java_client.MobileE
import io.appium.java_client.android.AndroidD
public class OscLoginNewsCollection extends BaseTest {
private AppiumDriver&MobileElement&
@BeforeClass
public void setUp() throws Exception {
driver = this.getAppiumParameter();
@Test(description = "综合-开源资讯-收藏成功")
public void LoginNewsCollection() throws InterruptedException {
this.screenshot("LoginNewsCollection1.jpg", driver);
OscLogin Login = new OscLogin();
Login.login(driver);
this.screenshot("LoginNewsCollection2.jpg", driver);
// 点击【综合】
WebElement itemMe = driver.findElement(By
.id("net.oschina.app:id/nav_item_news"));
itemMe.click();
// 点击【开源资讯】
WebElement layoutView = driver.findElement(By
.id("net.oschina.app:id/layout_tab"));
WebElement linearLayout = layoutView.findElement(By
.className("android.widget.LinearLayout"));
List&WebElement& support = linearLayout.findElements(By
.className("android.support.v7.a.a$f"));
WebElement supportText = support.get(0);
supportText.click();
// 等待30秒内寻找这个元素
(new WebDriverWait(driver,20)).until(
new ExpectedCondition&MobileElement&(){
public MobileElement apply(WebDriver d) {
MobileElement recyclerView = driver.findElement(By
.id("net.oschina.app:id/recyclerView"));
List&MobileElement& titleView = recyclerView.findElements(By
.id("net.oschina.app:id/ll_title"));
if(titleView.size()&0){
MobileElement textView=titleView.get(0);
return textV
//进入开源资讯列表界面后截图
this.screenshot("LoginNewsCollection3.jpg", driver);
// 点击资讯标题
MobileElement recyclerView = driver.findElement(By
.id("net.oschina.app:id/recyclerView"));
List&MobileElement& titleView = recyclerView.findElements(By
.id("net.oschina.app:id/ll_title"));
String titleText = "";
for(int i=0;i&titleView.size();i++){
MobileElement textView=titleView.get(i);
MobileElement lay_info = textView.findElement(By.id("net.oschina.app:id/lay_info"));
if(lay_info != null){
MobileElement subTextView = textView.findElement(By
.id("net.oschina.app:id/tv_title"));
String titleText = subTextView.getText().substring(7);
System.out.println("=====列表标题:" + titleText );
subTextView.click();
//进入详情页面
MobileElement actionBar = driver.findElement(By.id("net.oschina.app:id/action_bar"));
MobileElement actionBarTexts = actionBar.findElement(By.className("android.widget.TextView"));
String actionBarText = actionBarTexts.getText();
System.out.println("=====进入" + actionBarText);
// 等待30秒内寻找这个元素
(new WebDriverWait(driver,30)).until(
new ExpectedCondition&MobileElement&(){
public MobileElement apply(WebDriver d) {
MobileElement lay_container = driver.findElement(By
.id("net.oschina.app:id/lay_container"));
return lay_
//打印详情页面的标题
String inforDetailsTitle = "";
if(actionBarText.equals("软件详情") == true){
MobileElement tv_software_name = driver.findElement(By
.id("net.oschina.app:id/tv_software_name"));
inforDetailsTitle = tv_software_name.getText().substring(13);
System.out.println("=====详情标题:" + inforDetailsTitle);
}else if(actionBarText.equals("问答详情") == true){
MobileElement tv_ques_detail_title = driver.findElement(By
.id("net.oschina.app:id/tv_ques_detail_title"));
inforDetailsTitle = tv_ques_detail_title.getText();
System.out.println("=====详情标题:" + inforDetailsTitle);
MobileElement tv_title = driver.findElement(By
.id("net.oschina.app:id/tv_title"));
inforDetailsTitle = tv_title.getText();
System.out.println("=====详情标题:" + inforDetailsTitle);
// 进入开源资讯详情界面后截图
this.screenshot("LoginNewsCollection4.jpg", driver);
// 收藏成功
WebElement collectionLinear = driver.findElement(By
.className("android.widget.LinearLayout"));
WebElement clickCollection = collectionLinear.findElement(By
.id("net.oschina.app:id/ib_fav"));
clickCollection.click();
//刷新页面等待3秒
Thread.sleep(3000);
catch(Exception e){
e.printStackTrace();
// 收藏成功截图
this.screenshot("LoginNewsCollection5.jpg", driver);
// 从博客详情返回综合列表
WebElement returnButton = driver.findElement(By
.id("net.oschina.app:id/action_bar"));
WebElement clickButton = returnButton.findElement(By
.className("android.widget.ImageButton"));
clickButton.click();
this.screenshot("LoginNewsCollection6.jpg", driver);
// 检测收藏标题是否存在于我的收藏列表中
OscCollectionResultAssert ResultAssert = new OscCollectionResultAssert();
ResultAssert.CollectionResultAssert(driver, inforDetailsTitle);
// 进入我的收藏列表后截图
this.screenshot("LoginNewsCollection7.jpg", driver);
Reporter.log("综合-开源资讯-登录-收藏");
// 从我的收藏列表返回到个人信息页面
MobileElement returnButton2 = driver.findElement(By
.id("net.oschina.app:id/action_bar"));
MobileElement clickButton2 = returnButton2.findElement(By
.className("android.widget.ImageButton"));
clickButton2.click();
this.screenshot("LoginNewsCollection8.jpg", driver);
OscCancellation Cancellation = new OscCancellation();
Cancellation.Cancellation(driver);
this.screenshot("LoginNewsCollection9.jpg", driver);
@AfterClass
public void tearDown() throws Exception {
driver.quit();
四、测试报告
把所有TestCase文件放到XML文件里,运行TestNG Suite,批量执行测试用例。
以下是“综合-开源资讯-收藏”单个执行测试报告:
以下是“综合-开源资讯-收藏”单个执行的总测试报告如下图所示:
五、&测试过程中屏幕截图
在测试过程中屏幕截图也是很重要,它可以协助你排查问题。
以下是测试OscLoginNewsCollection类的屏幕截图gif文件:
六、&&实践中遇到的问题
1、& 无法判断“收藏成功的按钮是否呈亮”。大家要是知道判断方法的话,请私信告诉我,谢谢!
2、& 若大家觉得我写的代码存在问题,那也可以私信告诉我,我会很乐意地接受你的建议的。谢谢!
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。转:Appium_学习笔记
转自:http://blog.csdn.net/jiguanghoverli/article/details/
&& 今天使用appium
来测试android客户端,使用的是selenium + webdriver+
java,发现客户端的引导页无法操作,搜索到内容如下:
1. 滚动条的滑动(/nova/articles/1091993.html)
top=document.documentElement.scrollT
left=document.documentElement.scrollL &
& String setscroll =
"document.documentElement.scrollTop=" + &
& JavascriptExecutor jse=(JavascriptExecutor)
jse.executeScript(setscroll);&
2. 向下滑动一页
Actions actions = new Actions(driver);
actions.sendKeys(Keys.BACK_SPACE).perform();
3:鼠标滑动
driver.findElement(By.cssSelector(".user-info.right&div&p&a"));
Actions builder = new Actions(driver);
builder.moveToElement(element).build().perform();
//Thread.sleep(100); no need
element = driver.findElement(By.cssSelector(".frd-del"));
element.click();
private static WebD
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("general.useragent.override",
"Mozilla/5.0 (iP U; CPU iPhone OS 3_0 like Mac OS X; en-us)
AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341
Safari/528.16");
driver = new FirefoxDriver(profile);
5:页面切换
String pWindUrl = driver.getCurrentUrl();
//跳至新打开的窗口
if (driver.getWindowHandles().size() != 2) {fail(); }
for (String handle : driver.getWindowHandles()) {
driver.switchTo().window(handle);
(driver.getCurrentUrl().equals(pWindUrl)){
driver.close(); //关闭父窗口
& & } else {
(driver.findElements(By.cssSelector(".img")).size() != 6) { fail();
6:alert提示
alert = driver.switchTo().alert();
alert.accept();
//alert.dismiss();
& & & File
scrFile = ((TakesScreenshot) driver)
.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("img\\Screenshot.png"));
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.close();
8.查找当前页面的编辑区域
textfields = driver.find_elements_by_tag_name("textfield")
els=driver.find_elements_by_tag_name("text")
9.查找元素
table =driver.find_element_by_tag_name("tableView")
row = table.find_elements_by_tag_name("tableCell")[index]
rows = table.find_elements_by_tag_name("tableCell")
nav_bar = driver.find_element_by_tag_name("navigationBar")
scroll = driver.find_element_by_tag_name("scrollview")
webview = scroll.find_element_by_tag_name("webview")
#find the URL field
textfield = driver.find_element_by_name("URL entry")
# get the window handles (webview)
handle = self.driver.window_handles[0]
self.driver.switch_to_window(handle)
# Find the google logo
logo = self.driver.find_element_by_id("hplogo")
driver.execute_script("mobile: leaveWebView")
# make screenshot and save it to the local filesystem
success = self.driver.get_screenshot_as_file("foo.png")
10:执行脚本_Java
Map tap = new HashMap(); &
tap.put("tapCount", new Double(2));
tap.put("touchCount", new Double(1)); &
tap.put("duration", new Double(0.5)); &
tap.put("x", new Double(300)); &
tap.put("y", new Double(300)); &
driver.executeScript("mobile: tap", tap);&
driver.execute_script("mobile: tap", {"touchCount":"1", "x":"0.9",
"y":"0.8", "element":element.id})
滑动引导图从第一张到第二张()
& & swipe_args = { 'startX':0.9,
'startY':0.5, 'endX':0.1, 'endY':0.5, 'duration':10}
self.driver.execute_script("mobile: swipe", swipe_args)
except Exception, e:
& & print e
请参考:/appium/appium/blob/master/docs/gestures.md
11.根据路径获取元素
self.driver.find_elements_by_xpath("//ImageView")
self.driver.find_elements_by_xpath("//TextView")
12.点击屏幕的某个点
self.driver.execute_script("mobile: tap", {"touchCount":"1",
"x":22, "y":45}) #点击屏幕坐标为(22,45)的点1次
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。手机自动化测试(7)--appium代码使用 - CSDN博客
手机自动化测试(7)--appium代码使用
2.1 架包引入
(1)参照 &
2.2 启动篇
private AndroidDriver&AndroidElement&
public void setUjp() throws Exception {
// set up appium
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(&deviceName&, &Android Emulator&);
capabilities.setCapability(&platformVersion&, &4.4&);
capabilities.setCapability(&appPackage&, &com.example.android.apis&);
capabilities.setCapability(&appActivity&, &com.example.android.apis.ApiDemos&);
driver = new AndroidDriver&&(new URL(&http://127.0.0.1:7922/wd/hub&), capabilities);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}(1)定义driver对象需要使用AndroidDriver而不能是AppiumDriver,原因是AndroidDriver附加有一些特殊方法,用例里面需要使用,例如pressKeyCode
(2)appPackage参数和appActivity参数是可以在系统里面唯一定位app启动页面,可以不用使用app参数
(3)URL是指的服务端
(1)element.getCenter() &获取控件中心点坐标
(2)element.getLocation() &获取控件起始坐标(左上角坐标)
(3)element.getSize() &计算出控件大小。值 = 终点坐标X-起点坐标X,终点坐标Y-起点坐标Y
(4)driver.swipe(startx, starty, endx, endy, duration) &滑动(起点X坐标,起点Y坐标,目的X坐标,目的Y坐标,滑动时间)
(5)driver.pressKeyCode(key) & 模拟手机按键(比如返回键得KYE值就是4)&
(6)driver.longPressKeyCode(key) &模拟手机长时间按键(比如长按home键)
(7) driver.scrollTo(&name&) &&翻页找到list里面值为name的控件
(8)driver.tap(fingers, x, y, duration) 敲击(x,y)点,duration*5毫秒后松开,如此重复fingers次。
& & & & & & & & & & & & & & & & & & & & & & & & & & & & &(例如点击一次20,20:tap(1, 20, 20, 0))
(9)TouchAction 手势
touch.tap(x, y).waitAction().press(x, y).longPress(element).waitAction(1000).moveTo(x, y).release().perform();
touch.tap(x, y).waitAction().press(x, y).longPress(element).waitAction(1000).moveTo(x, y).release().cancel();& & & & & & &tap &敲击
& & & & & & &waitAciton 等待一段时间
& & & & & & &press(x,y) 按下手指
& & & & & & &longpress(x,y) 长按
& & & & & & &moveTo(x,y) &移动
& & & & & & &release() 抬起手指
& & & & & & &cancel() 取消本次手势串
& & & & & & &perform() 发送本次手势串请求
& & & & & & &tap就是press+release+perform
(10)元素查找&
//弹出单选框
//appium自带方法定位,先用classname定位到一组元素,再到包含自己控件的元素里面
用classname定位到自己的控件
List&AndroidElement& text = driver.findElementsByClassName(&android.widget.TableRow&);
text.get(7).findElementByClassName(&android.widget.TextView&).click();
2.4 等待页面打开
&span style=&font-size:14&&
WebDriverWait wait = new WebDriverWait(driver, 60);
AndroidElement e = wait.until(new ExpectedCondition&AndroidElement&() {
public AndroidElement apply(WebDriver arg0) {
// TODO Auto-generated method stub
AndroidElement ae = driver.findElementById(&com.duguang.baseanimation:id/tv_hint&);
if (ae.getText().equals(&上滑可以进入首页&))
});&/span&3 APPium的机制
客户端将我们的各种指令通过http请求发送到服务端APPIUM,appium再将指令解析出来,调用对应的手机接口,完成各种操作。
本文已收录于以下专栏:
相关文章推荐
1、搭建Android环境
http://blog.csdn.net/jlminghui/article/details/
注:需要设置系统变量“ANDROID_HOME”。
我的第一篇appium小代码完成了上一篇的环境配置操作,就可以开始写我们的appium自动化代码了。
在编写代码的时候,可以使用genymotion虚拟机操作,也可以通过USB连接真机操作,下面我会区...
Appium 服务关键字
automationName
你想使用的自动化测试引擎
Appium (默认) 或 Selendroid
platformN...
构建:下载依赖包
    1.1优先级
      本地仓库&私服&中央仓库
    1.2 逻辑
        先在本地仓库找,时候有需要的架包,没有到私服找,再没有就到中央...
有USB的方式
(1)初始时,手机先与PC使用USB连接
(2)使用命令 adb tcpip 5555(端口,任意)
(3)使用命令adb shell netcfg,查看手机IP
(4)使用命令adb...
七厂商外本  彼中,借请求参取推销产品为具有原主散外推销天分的供给商的产品;或许非契合原主集合采买产品黑皮书必选要供的产品。  旧浪科技讯 11月12夜音讯,知情己士泄漏,备蒙关心的中邦挪动600万部...
Android测试环境搭建
一、操作系统
      使用Win7_64位操作系统。(可以用其他的系统,下面都是针对Win7 64位进行操作)
二、安装JDK
运行jdk-6u45-wind...
工具:wireshark
流程:手机--》电脑--》网络
原理:手机与电脑共用一个网卡与网络通信,而wireshark主要是捕获网卡上流通的数据
(1)使用笔记本,开始wifi热点,创...
环境搭建好了后,可以开始写测试脚本了,这里以Zhihu客户端为测试对象:
第一个Appium(java)例子
1.      新建Java工程,名字为Appium_zhihu_demo,因为我是用zh...
1.对于monkey测试的基础,先来试试输出日志
adb logcat -v time &d:logcat.txt
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)自动化测试是研发人员进行质量保障的重要一环,良好的自动化测试机制能够让开发者及早发现编码中的逻辑缺陷,将风险前置。日常研发中,由于快速迭代的原因,我们经常需要在各个业务线上进行主流程回归测试,目前这种测试大部分由人工进行,费时费力,重复劳动多。如果能将UI自动化测试与主流程回归结合到一起,一方面保证了代码质量,另一方面大大节约人力成本,可谓一举两得。
为什么需要UI自动化测试
原因主要是以下三点:
保证质量——及早发现代码缺陷,风险前置。
减少重复劳动,节约人力——快速迭代中经常需要进行主流程回归,测试完整个主流程,需要耗费相当大的人力成本。
统一标准——每个人对测试用例以及业务理解程度不同,标准可能存在不一致。
进行UI自动化测试面临的问题
工具选择。
降低对后端的依赖,避免因为测试环境后端不稳定导致的测试失败。
整合测试用例,增加复用,降低用例维护成本。
自动化测试工具对比
业界UI测试工具发展迅速,目前有Robotium、Appium、Espresso、UIAutomator、Calabash等等,其中在Android中应用最广泛的当属UIAutomator、Robotium、Appium。
下面列表比较说明:
UIAutomator
Android,H5
Android,iOS,H5
Almost any
是否支持无源码测试
支持API级别
除了Android、Hybrid类型的App,Appium还可以在iOS设备上运行。加上之前组内有同事做过Appium方面的分享,在这方面有一定的基础,所以最终我们选择了Appium。
接口稳定性与数据可变性
业务特性决定我们的case在运行过程中会经常向后端请求数据,然后根据后端接口返回的数据决定页面元素展示。因此,有两个难点是必须克服的:
后端接口稳定性
测试环境并不像线上,能在7x24内保持稳定。业务接口经常出现因所依赖的外部环境异常而请求失败的情况,以往处理这种情形,我们能做的事情往往很有限,最糟糕的就是必须要等待第三方修改完成后,才能继续我们的测试。因此,如何保持接口稳定,将成为UI自动化测试不得不面对的问题。
测试数据配置与保存
克服了1中提到的接口稳定难点后,仍然要面对第二个难点——频繁修改配置以适应测试用例的条件。举个例子,对于闪惠业务,用例里面会对于商户配置的多种情况进行测试(无优惠、有优惠未开始、仅有闪惠优惠、有闪惠和团购、闪惠打折、闪惠赠品等),这里面的条件是复杂多变的。如果每一次进行测试前,都由执行测试人在商户后台登录后手动修改配置,将耗费巨大的人力成本。因此我们势必找出一条途径,将这种繁琐的配置过程自动化。
接入Appmock
注:使用Appmock,需建立在App底层网络请求模块已经具备切换mock地址的功能的基础上。
Appmock是美团点评平台组制作的非常优秀的mock工具,其前身是美团点评同事张文东所编写的wendong.dp(仅供美团点评内部使用)。在Appmock上可以进行网络请求的查看与mock。那么,是否可以让我们的自动化测试用例在运行时访问Appmock,获取预设的mock数据呢?做过相关App开发的同事都知道,在App中这是很容易实现的,只要访问某个特定HTTP链接进行注册即可。
Appmock使用界面
由此,“后端接口稳定性”的问题,在Appmock的帮助下就解决了,如果把后端数据直接配置在Appmock上,请求失败的概率就微乎其微。即便如此,仍然要面临频繁修改配置的需求,只不过是把修改的操作从商家后台页面转移到了mock系统。有没有什么方法,可以让修改配置的操作自动化进行呢?
在研读过Appmock的源码后,我们想到,可以自己搭建一个mock-server,把不同阶段的mock数据保存在数据库中,并且开放出网络接口,用来切换各个测试用例所需的mock数据。具体的系统结构如下图所示。
上图描述了一次用例运行的简要过程,事前需要在数据库中准备好测试数据,mock-server基于Appmock,使用NodeJS进行二次开发完成。
编写测试用例
为了简化用例编写,减少开发与维护的工作量,使用Page Object模式进行用例开发。
Page Object定义为抽象页面的对象,通过对页面功能的封装,进行相应操作。它的优点是:
减少重复代码,增加复用性。
提高代码可读性、稳定性。
易于维护。
UI自动化测试框架的编写方式类似于MVC架构,我们将测试用例中的业务逻辑、各个页面间的元素以及测试数据相分离后独立编写,以下均用排队业务的主流程举例。
测试类组成
测试类的组成包括
tearDown()方法以及各个测试用例
testXXXX(),所有的测试用例必须以小写test开头,如正常排号下的
testQueueNormalQueue():
public void setUp() throws Exception {
File apk = new File(APK_NOVA);
DesiredCapabilities capabilities = DesiredCapabilities.android();
capabilities.setCapability(&device&, Platform.ANDROID);
capabilities.setCapability(CapabilityType.VERSION, &5.1&);
// capabilities各个常量字段
driver = new AndroidDriver&AndroidElement&(new URL(&http://127.0.0.1:4723/wd/hub&), capabilities);
splashScreen = new SplashScreen(driver);
mainPage = new MainPage(driver);
// Page Object初始化
public void tearDown() throws Exception {
driver.quit();
public void testQueueNormalQueue() {
测试用例中不用直接对页面元素进行操作,我们所要做的事情仅仅是业务层面的逻辑,包括表单数据的提交、页面按钮的点击跳转等等。
页面类编写
页面类的编写采用Page Object模式,包括页面中会使用到的元素、页面元素的操作方法集以及页面元素的检验方法集。
Page子类均继承
BasePage父类,它要做的事情很简单,无非就是1个
driver,2个
driverWait用于延时加载的等待时间,以及页面元素的初始化:
public class BasePage {
private static final int TIMEOUT = 1;
// short timeout for web-element
private static final int TIMEOUT_LONG = 10;
// long timeout for web-element
public AndroidDriver&AndroidElement&
public WebDriverWait driverW
public WebDriverWait driverLongW
public BasePage(AndroidDriver&AndroidElement& driver) {
this.driver =
this.driverWait = new WebDriverWait(this.driver, TIMEOUT);
this.driverLongWait = new WebDriverWait(this.driver, TIMEOUT_LONG);
PageFactory.initElements(this.driver, this);
// 这句非常重要,如果不写的话尽管编译不会报错,但是后面要说的页面元素在运行时一个都找不到
然后是各个
Page子类的实现方法:
public class ShopInfoPage extends BasePage {
public ShopInfoPage(AndroidDriver&AndroidElement& driver) {
super(driver);
…… // 页面元素 @FindBy
…… // 操作方法,比如login()、clickXXXXXXButton()、gotoXXXXXXPage()
…… // 检验方法,比如checkLoaded()、checkLoginSuccess()、checkQueue_LoginReadyQueue()
Page子类的元素定位我们使用
@FindBy注解方式进行统一的管理。
元素定位最基本的方法就是使用
id/name/class等,如果不行的话就用相对复杂却无所不能的
xpath,如:
// 点击登录按钮
@FindBy(id = &login_tip&)
private WebElement clickLoginB
// MAPI域名输入框
@FindBy(xpath = &//*[contains(@resource-id, &id/mapi_item&)]//*[contains(@resource-id, &id/debug_domain&)]&)
private WebElement mapiDomainT
Page中的操作和检验方法调用已经封装好的BaseUtils中的方法,如:
BaseUtils.waitForElement(driverWait, loginButton).click();
// 等待元素出现并点击
Assert.assertTrue(BaseUtils.waitForElementVisibility(driverLongWait, usernameText));
// 检验元素应该展示在页面上
BaseUtils方法
BaseUtils中封装好了一些通用的方法,还需要不断完善并扩展。下面介绍其中一些常用及重要的方法:
openDebugPanel():每次直接调用该方法来打开Debug面板,由于Debug面板是一个系统层面的悬浮窗,它不属于任何页面中的元素(你完全没办法通过
XPath获得)。
clickPoint():点击某个坐标+持续时间,坐标采用相对屏幕位移的方式(左上为0,0),这里只实现了简单的单指的点击操作,实际上
driver.tap可以模拟多指的共同操作。
swipeToUp() & swipeToDown():上拉 & 下拉页面操作,需要传的是次数和每次持续时间,模拟手指在屏幕上的滑屏操作,主要用于刷新页面以及绕过某些有坑的
scrollTo。
prepareMockData():这里要做的就是,在关键步骤操作前传入
mock_data_id,我们会将数据请求发送给服务器,然后服务器从数据库拉到对应的mock data并更新。
saveScreenshot():顾名思义,截图。在每个重要的页面操作方法中加入即可,需要传入的是
case_id以及操作或检查时的
keyword,方便在用例执行完以后看截图分析和Bug复现。
waitForElementXXX():在预设等待时间内等待元素出现并定位元素。
UI自动化测试运行效果
在排队与闪惠两条业务线进行了UI自动化测试实践,它们执行完成全套用例的耗时均不超过20min。相比于之前人工进行主流程测试动辄花费半天的工作量的情况,大大降低了人力成本,将工程师宝贵的时间节约给了更有价值的研发工作。
当然,自动化测试前期的环境搭建、数据准备、用例编写等任务是必不可少的,这些准备工作很多都是一次性投入,一劳永逸,也正是自动化测试的价值所在。
相关 [appium android ui] 推荐:
- IT瘾-startup
国庆长假第三天,微博和朋友圈上又被各种出行和旅游等照片刷了屏. 假期和周末是人们休息的时间,而过度的娱乐反而让人假期过后更加疲惫. 今日国外媒体(bigthink)刊文报道称,人们常常用各种约会和玩乐来塞满周末两天闲暇时光. 结果造成周末休整的愿望适得其反,往往假期之后不禁没休息好,反而疲惫益甚. 文章指出,与其用过多的娱乐充斥生活,安静独处反而是更有效的休息方式.
- 美团点评技术团队
传统的Android开发架构一般是MVC模式,. Model:业务逻辑和实体模型. View:对应于布局文件. Controllor:对应于Activity. 单独从逻辑看起来非常好,与我们做Web开发时,开发模式类似,但在实际开发中,View对应于布局文件,实际上关于该布局文件中的数据绑定的操作,事件处理的代码都在Activity中,Activity既像View又像Controller(MVVP架构中包括数据绑定),导致Activity中职责太重,耦合度大.
- 博客园_首页
最近在看一本书,加来道雄(Michio Kaku)的《物理学的未来》,第一、第二章是程序员更加关心的,对于下一个100年计算机和人工智能未来的预测. 想想计算机发展短暂的历史,这些发生了的翻天覆地的变化,似乎都在弹指一挥间. 无论如何,书中对其这样几个猜想令我记忆深刻:. 这是物理学家眼中的世界(另外推荐他的另一本书《平行宇宙》),激动人心;另一方面,我回想起小时候无比痴迷的机器猫,小小四维空间袋,寄托了孩子多少纯真的梦想,有多少神奇的道具已经成为现实…….
- plidezus - 盒子UI
- 首发于《福布斯》中文网:/column/liurun/2622. 虽然IT和互联网越来越被认为是两个行业,但身在IT公司的我,有很多朋友在互联网跌爬滚打,我也有时会帮做投资的朋友看一些互联网项目,给些意见. 对人才的“渴求”,可能是因为策略的缺失.
- Keven - Engadget 中国版
【陈怀临注:今天因为某些原因,与雷军有个电话交流. 非常佩服其深邃的见解和谦卑的人品. 其原文和网站为 . 一个朋友,在一家软件的大企业做了十年的软件研发,想出来创业,问我要注意什么. 我开玩笑说,要想成功,必须学习互联网创业的“葵花宝典”,第一条就是 “挥刀自宫”. 大的软件公司有很多资源,研发能力不错,各种推广资源也非常优越,但很少开发出来优秀的互联网产品.
- 移动开发 - ITeye博客
使用SOA架构的企业,应该是有一定IT系统基础的企业,最好是已经实施过ERP,或者HCM,CRM等的企业. 企业发展到一定的程度,会需要上线相应的ERP来规范化流程,数据. 而当企业进一步发展后,单一的ERP产品已经无法满足业务变化的需要,比如一个业务不仅和生产相关,同时还和人力资源相关,另外还和公司内新开发的一个第三方系统关联.
- CSDN博客移动开发推荐文章
综合来源:
&. 之前有外媒报导,Canonical公司将于2月21日发布Ubuntu手机操作系统的开发者预览版本,如果想体验这款全新操作系统,不管是开发者还是普通用户,需要使用三星Galaxy Nexus和谷歌Nexus 4进行安装. Canonical也将提供安装工具和指南.
- evan - 信息和交互 - UCD大社区
2011年度LinuxCon北美会议于美国时间8月17日到19日在温哥华举行,所有主题研究的视频允许公众免费观看. 17日的演讲者包括了Linux基金会执行董事Jim Zemlin(想象没有Linux的世界),Red Hat CEO Jim Whitehurst(Linux未来二十年的挑战),小组座谈会讨论Linux二十年(包括Jim Zemlin、Dan Frye、Jon “Maddog” Hall等),Greg Kroah-Hartman对话Linux作者Linus Torvalds.
- 丁丁 - Engadget 中国版
“六度分离”理论可以算是社交网络研究中最著名的理论之一:生活这个世界上的每个人平均只需要通过6个中间人就能与全世界任何一个人建立联系. 在网络社交逐渐发达的今天,“六度分离”理论的论证变得容易起来,最近Yahoo联合Facebook一同开始对这个理论进行了名为“小世界实验”的再度验证. Facebook高达七亿五千万的用户群是最好的调查对象,这些用户平均每人拥有130个Facebook好友.
- Johnny - ITeye资讯频道
为了庆祝其成立五十周年,美国国家侦察局(NRO)解密了著名的KH-9间谍卫星,于9月17日在华盛顿史密森尼博物馆Steven F.Udvar-Hazy中心公开展示...一天(YouTube视频及图片). NRO成立于日. KH-9 Hexagon是一种照相侦察卫星,美国于1971年到1986年之间共发射了20颗KH-9系列卫星,最后一次发射失败,它是当时最先进的间谍卫星,它据信在太空拍摄了苏联、中国和其它美国认为具有战略价值的地区的卫星照片,除了情报圈外外界对其外形从未目睹过.
--> 坚持分享优质有趣的原创文章,并保留作者信息和版权声明,任何问题请联系:@。}

我要回帖

更多关于 三菱gt-phev上市时间 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信