1、元素识别方法
元素识别方法:
前面也说过appium也是以webdriver为基础的,对于元素的定位也基本一致,只是增加一些更适合移动平台的独特方式:
- id定位:
主要看resource id的值:
函数:
driver.findElementById(resource_id的值);
- class定位:
主要看class的值
函数:
driver.findElementByClassName(class的值);
- AndroidUIAutomator定位:
主要看text的值
函数:
driver.findElementByAndroidUIAutomator(“text(\”中文\”)”);
- Accessibility ID定位
函数:
driver.findElementByAccessibilityId(content-desc的值);
- Xpath定位
主要看目标元素的位置
函数:findElementByXPath(路径)
findElementByXPath(“//*[@resource-id=‘xxx’]”)
2、元素的操作方法
click() 点击
sendKeys() 模拟键盘输入
clear() 清除
Getattribute() 获取属性值
针对应用的操作
如应用的安装、卸载、关闭、启动等。
1)安装应用:installApp();
2)卸载应用:removeApp();
3)关闭应用:closeAPP();
4)启动应用:launchApp()
5)检查应用是否安装:isAppInstalled()
6)将应用置于后台:runAppInBackground()
7)应用重置:resetApp()
模拟手势操作
import io.appium.java_client.TouchAction;
//要生成对象
TouchAction touchAction = new TouchAction(driver);
1)按压控件:press()
2)长按控件:longPress()
3)点击控件:tap()
4)移动:moveTo()
5)暂停:wait()
6)结束操作:release()
7)将操作发送服务器:Perform()
移动设备特有的操作
1)息屏: lockDevice()
2)当前Activity:currentActivity()
3)收起键盘:hideKeyboard()
4)滑动:swipe()
5)拉出文件:pullFile()
6)推送文件:pushFile()
3、案例
定位、获取元素,QQ登录和退出
package haha;
import io.appium.java_client.AppiumDriver;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.remote.DesiredCapabilities;
public class Test01 {
public static void main(String[] args)throws MalformedURLException, InterruptedException {
// TODO 自动生成的方法存根
DesiredCapabilities des=new DesiredCapabilities();
des.setCapability("platformName","android");//平台
des.setCapability("deviceName","Android Emulator");//设备名称
des.setCapability("platformVersion","4.4.4");//版本号
des.setCapability("noReset","true");//不要重复安装
des.setCapability("appPackage","com.tencent.mobileqq");//包名
Thread.sleep(3000);//3秒
//活动页
des.setCapability("appActivity","com.tencent.mobileqq.activity.LoginActivity");
Thread.sleep(7000);//7秒
//创建连接appium的对象
AppiumDriver dr = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"),des);
//获取元素
String str=dr.findElementById("com.tencent.mobileqq:id/btn_login").getAttribute("text");
System.out.println(str);//id方法
Thread.sleep(3000);//3秒
String str2=dr.findElementByClassName("android.widget.Button").getAttribute("text");
System.out.println(str2);//name方法
Thread.sleep(6000);//5秒
String str3=dr.findElementByAndroidUIAutomator("text(\"登录\")").getAttribute("text");
System.out.println(str3);//text方法
Thread.sleep(3000);//3秒
String xp="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.Button[2]";
dr.findElementByXPath(xp).click();//xpath方法
Thread.sleep(5000);//5秒
String str1=dr.findElementByAccessibilityId("请输入QQ号码或手机或邮箱").getAttribute("text");
System.out.println(str1);//content-desc方法
// Thread.sleep(5000);//3秒
// dr.findElementById("com.tencent.mobileqq:id/btn_login").click();
Thread.sleep(3000);//3秒
dr.findElementByAccessibilityId("请输入QQ号码或手机或邮箱").click();//点击元素
Thread.sleep(3000);//3秒
dr.findElementByAccessibilityId("请输入QQ号码或手机或邮箱").clear();//清除元素
dr.findElementByAccessibilityId("请输入QQ号码或手机或邮箱").sendKeys("302650100");
Thread.sleep(3000);//3秒
dr.findElementById("com.tencent.mobileqq:id/password").click();
Thread.sleep(3000);//3秒
dr.findElementById("com.tencent.mobileqq:id/password").clear();
dr.findElementById("com.tencent.mobileqq:id/password").sendKeys("wx3289696");//输入值
Thread.sleep(3000);//3秒
dr.findElementById("com.tencent.mobileqq:id/login").click();
Thread.sleep(3000);//3秒
dr.swipe(123,564,123,200,5000);
Thread.sleep(8000);//3秒
//点击头像
dr.findElementById("com.tencent.mobileqq:id/conversation_head").click();
//点击设置
Thread.sleep(5000);
dr.findElementById("com.tencent.mobileqq:id/settings").click();
//点击我的账户
Thread.sleep(5000);
dr.findElementById("com.tencent.mobileqq:id/account_switch").click();
Thread.sleep(5000);
//点击退出当前账户
dr.findElementByAndroidUIAutomator("text(\"退出当前账号\")").click();
Thread.sleep(5000);
dr.quit();
}
}
正式版qq登录出错拖图案例
package maker;
import io.appium.java_client.AppiumDriver;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.remote.DesiredCapabilities;
public class A06登陆正式版qq出错拖图 {
public static void main(String[] args) throws MalformedURLException, InterruptedException{
// TODO 自动生成的方法存根
//1.配置设备和app信息
DesiredCapabilities des=new DesiredCapabilities();
des.setCapability("platformName","android");//平台
des.setCapability("deviceName","Android Emulator");//设备名
des.setCapability("platformVersion","4.4.4");//版本号
des.setCapability("noReset","true");//不要重复安装
des.setCapability("appPackage","com.tencent.mobileqq");//包名
//活动页
des.setCapability("appActivity","com.tencent.mobileqq.activity.LoginActivity");
//2.创建连接appium的对象
AppiumDriver dr = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"),des);
//暂停
Thread.sleep(5000);//5秒
dr.findElementByAccessibilityId("请输入QQ号码或手机或邮箱").click();
// Thread.sleep(3000);//5秒
dr.findElementByAccessibilityId("请输入QQ号码或手机或邮箱").clear();
// Thread.sleep(3000);//5秒
dr.findElementByAccessibilityId("请输入QQ号码或手机或邮箱").sendKeys("111011101");
// Thread.sleep(3000);//5秒
dr.findElementByAccessibilityId("密码 安全").click();
dr.findElementByAccessibilityId("密码 安全").clear();
dr.findElementByAccessibilityId("密码 安全").sendKeys("abc123456");
// Thread.sleep(3000);//5秒
//点击登陆 登 录
dr.findElementById("com.tencent.mobileqq:id/login").click();
Thread.sleep(5000);//5秒
//滑动
dr.swipe(168, 330, 520, 330, 10000);
Thread.sleep(5000);//5秒
dr.quit();
}
}
轻聊版qq登录案例
首次登qq
package maker;
import io.appium.java_client.AppiumDriver;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.remote.DesiredCapabilities;
public class A02元素操作 {
public static void main(String[] args) throws MalformedURLException, InterruptedException{
// TODO 自动生成的方法存根
//1.配置设备和app信息
DesiredCapabilities des=new DesiredCapabilities();
des.setCapability("platformName","android");//平台
des.setCapability("deviceName","Android Emulator");//设备名
des.setCapability("platformVersion","4.4.4");//版本号
des.setCapability("noReset","true");//不要重复安装
des.setCapability("appPackage","com.tencent.qqlite");//包名
//活动页
des.setCapability("appActivity","com.tencent.mobileqq.activity.RegisterGuideActivity");
//2.创建连接appium的对象
AppiumDriver dr = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"),des);
//暂停
Thread.sleep(5000);//5秒
//点击登陆按键 id:com.tencent.qqlite:id/btn_login
dr.findElementById("com.tencent.qqlite:id/btn_login").click();
Thread.sleep(3000);//3秒
//获取qq号码输入框, 请输入QQ号码或手机或邮箱
dr.findElementByAccessibilityId("请输入QQ号码或手机或邮箱").click();
//输入qq号
dr.findElementByAccessibilityId("请输入QQ号码或手机或邮箱").sendKeys("2062911635");
Thread.sleep(3000);//3秒
//获取密码输入框,
dr.findElementByAccessibilityId("请输入密码").click();
dr.findElementByAccessibilityId("请输入密码").sendKeys("abc123456");
Thread.sleep(3000);//3秒
//点击登陆按键 com.tencent.qqlite:id/login
dr.findElementById("com.tencent.qqlite:id/login").click();
Thread.sleep(3000);//3秒
dr.quit();
}
}
计算器项目
package com.qf.calc;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.remote.DesiredCapabilities;
import io.appium.java_client.AppiumDriver;
/*
实现计算器app的自动化测试:
1、自动化脚本的对象是谁?到底是模拟器还是手机(假设选择的是模拟器)
2、appium支持ios、android、firefox os。要告诉脚本本次测试是针对哪一个平台的(假设是Android)
3、要告诉脚本,本次针对的Android版本是哪一个?4.4.4
4、要确定测试的app是谁?找到该app的包名:com.lilysgame.calculatorjw
5、要确定一个app入口的activity:com.lilysgame.calculator.MainActivity
6、创建一个appium对象,负责连接appium server
7、通过selenium提供的api方法定位元素(页面上控件)
8、对相应的元素做操作,按钮就要点击、文本框就要赋值.....
9、获取实际结果,并与预期的结果进行对比,得出测试执行的结论(断言)
具体实现:
1、selenium中提供了一个类,DesiredCapabilities,提供了很多方法,可以设置一些列的键值对
2、创建DesiredCapabilities的对象
DesiredCapabilities des = new DesiredCapabilities();
3、des的方法setCapability()设置键值对
des.setCapability("platformName","Android");//指定平台是android
des.setCapability("deviceName","Android Emulator");//指定的是模拟器
des.setCapability("platformVersion","4.4.4");//指定平台的版本号
des.setCapability("appPackage","com.lilysgame.calculatorjw");//指定要测试的应用的包名
des.setCapability("appActivity","com.lilysgame.calculator.MainActivity");//指定入口页面
4、创建Appium的对象
5、通过selenium提供的api方法定位元素(页面上控件)
6、对相应的元素做操作,按钮就要点击、文本框就要赋值.....
7、获取实际结果,并与预期的结果进行对比,得出测试执行的结论(断言)
//时间等待有两种方式:
* Thread.sleep(2000);强制等待,设置多少就等待多少
* 全局等待,对driver的等
*
*/
public class CalcTest {
public static void main(String[] args) throws MalformedURLException, InterruptedException {
//创建DesiredCapabilities的对象
DesiredCapabilities des = new DesiredCapabilities();
//des的方法setCapability()设置键值对
des.setCapability("platformName", "Android");
des.setCapability("deviceName", "Android Emulator");
des.setCapability("platformVersion", "4.4.4");
//再添加一个键值对,不让app每次测试都重置一遍
des.setCapability("noReset", true);
des.setCapability("appPackage", "com.lilysgame.calculatorjw");
des.setCapability("appActivity","com.lilysgame.calculator.MainActivity");
//创建Appium的对象
AppiumDriver driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"),des);
//设置一个全局等待的方法,要全局等待10s
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//到目前为止,就已经能够连接上app啦,driver就可以对app进行操作啦
//定位元素的语句,要指定id属性定位到元素并对其进行操作
//定位到计算器的按键1,并点击
//driver.findElementById("com.lilysgame.calculatorjw:id/btnOne").click();
//使用class属性定位按键1,但是由于所有的按键都是一个class name,就点了默认的del,一般不用
//driver.findElementByClassName("android.widget.Button").click();
//通过text属性定位到元素
//driver.findElementByAndroidUIAutomator("text(\"5\")").click();
//通过xpath定位页面元素
driver.findElementByXPath("//*[@resource-id='com.lilysgame.calculatorjw:id/btnOne']").click();
//在点击完成1按键之后,等待5秒
//Thread.sleep(5000);
//点击+
driver.findElementById("com.lilysgame.calculatorjw:id/btnAdd").click();
//点击2
driver.findElementById("com.lilysgame.calculatorjw:id/btnTwo").click();
//点等号
driver.findElementById("com.lilysgame.calculatorjw:id/btnEqual").click();
//定义预期结果变量
String expectValue = "7";
//获取实际结果,使用getAttribute("text")
String acutalValue = driver.findElementById("com.lilysgame.calculatorjw:id/et_show").getAttribute("text");
//判断是否相等
if(expectValue.equals(acutalValue)){
System.out.println("加法运算实现是对的");
}else{
System.out.println("加法运算实现是错误的");
}
}
}