一、课程目标及课程规划
1、目标:
(1)开发2个移动端一键自动化测试框架
(2)开发1个appium自动化服务
2、课程安排:
(1)第一章 appium环境到基础函数的封装
(2)第二章 PO模型设计
(3)第三章 Unitest的使用
(4)第四章 appium服务介绍
(5)第五章 一键自动化从设计到实战
(6)第六章 关键字模型从设计到实战
(7)第七章 持续集成讲解
(8)第八章 查漏补缺
(9)第九章 IOS下Appium自动化测试
3、Appium基础:
(1)Appium环境搭建
(2)Appium基础使用
(3)常见定位方式
(4)基本函数封装
4、PO模型、关键字驱动、一键自动化
5、移动自动化测试框架从设计到开发
(1)设计服务端
(2)工具类开发
(3)服务端开发
(4)多机并行
(5)基类封装
(6)调试错误
6、关键字模型从设计到开发
关键字模型设计、操作类设计封装、关键字模型实现、流程梳理
实现持续集成
二、Appium简介及工作原理
1、为什么要选择Appium做移动自动化?
Appium是开源、跨平台
2、做什么?
Ios和Android、H5自动化
3、Android自动化工作原理?
电脑编写测试脚本(test scripts)和Appium server服务创建通讯,appium server服务调用UIAutomator接口(android4.2以上(包括4.2)),UIAutomator在apk上执行自动化脚本,执行完后结果返回给appium server,再返回到客户端(电脑)。
给运行手机app,再通过UIAutomator返回给appium server,通过appium
4、Ios自动化工作原理?
电脑编写测试脚本(test scripts)和Appium server服务创建通讯,appium server服务调用instruments接口,instruments英 [ˈɪnstrʊmənts]在apk上执行自动化脚本(必须装上xcode,mac系统),执行完后结果返回给appium server,再返回到客户端。
三、Appium环境的搭建
1、整体流程: 依赖关系
脚本 ——— python
|
Appium Server ——— Appium
|
UiAutomator ——— Android SDK(谷歌公布的)
|
手机执行 ——— 手机/模拟器
2、 依赖关系
Appium ——— Node.js
AndroidSDK ——— jdk
3、appium 与python的连接关系:Appium-Python-Client(API方法)
4、需要安装和配置的图片
5、JDK安装
环境变量的配置:计算机——高级系统设置——高级——环境变量——系统变量
(1)新建:
变量名:JAVAV_HOME
变量值:D:\java\jdk (jdk安装路径)
(2)变量名:path中添加
变量值:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
(3)变量名:CLASSPATH添加:
;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;
检查jdk配置:win+R 输入cmd,命令行输入java
6、SDK安装(jdk的上层)
https://www.cnblogs.com/nebie/p/9145627.html
(1)新建:
变量名:ANDROID_HOME
变量值:D:\java\sdk
(2)变量名:path中添加
变量值:%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;
验证sdk:win+R 输入cmd录入adb
7、Nodes.js安装
官网下载安装即可,按照步骤下一步
https://nodejs.org/en/download/
8、Appium安装
官网下载
9、下载python和Appium-Python-Client(API方法)
(1)python和python编辑器pycharm安装
Python:下载如图
在windows中配置环境变量
path:D:\Python\Python37\Scripts\;D:\Python\Python37\;
PyCharm 下载地址 : https://www.jetbrains.com/pycharm/download/
PyCharm 安装地址:http://www.runoob.com/w3cnote/pycharm-windows-install.html
professional 表示专业版,community 是社区版,推荐安装社区版,因为是免费使用的。
(2)https://pypi.org/project/Appium-Python-Client/#files 安装Appium-Python-Client
下载的压缩包解压后,当前解压目录下,安装:录入: python setup.py install,安装成功如图
四、Appium的运行
1、启动安装的Appium server,直接点击“start server”启动appium-desktop,出现如图:点击“Start inspector Session”图标
进入sever配置页面,按照对应的“参数名-值”配置相应的参数,
appPackage和appActivity可以通过在命令提示符中输入“adb shell dumpsys window w |findstr \/ |findstr name=”命令获取(需要提前将APP在手机上打开)。
2、点击搜索标志的小标,进行设置运行的参数,如图,运行成功,下载app成功,说明配置的环境成功
配置:
platformName text(文本) Android
deviceName text UUID(手机的) # cmd中录入adb devices
app filepath apk的路径文件
五、Android工具使用介绍
SDK常用工具
(1)SDK解压包中:tools——uiautomatorviewer.bat
(2)SDK解压包中:platform-tools——adb.exe
(3)获取包信息命令:aapt dump badging xxx.apk
(4)app页面元素的定位:uiautomatorviewer.bat
(5)Android SDK manager里面什么是必须下载的?
根据官方文档的描述
SDK Tools 必须
SDK Platform-tools 必须
SDK Platform必须至少安装一个版本
System Image建议安装
Android Support建议安装
SDK Samples建议安装
(6)解决Android SDK Manager下载太慢问题
打开android sdk manager
打开tool->options,如图所示
将Proxy Settings 里的HTTP Proxy Server和HTTP Proxy Port分别设置成mirrors.neusoft.edu.cn和80
将Others中的Force https://...sources to be fetched using http://...复选框勾上
(7)360助手端口暂用adb的端口5037
查看端口号:adb nodaemon server
查看被占用端口对应的PID,输入命令:netstat -aon|findstr "5037",回车,记下最后一位数字,即PID。
查看 是哪个进程:tasklist|findstr "9624" 9624 是PID
或者是我们打开任务管理器,切换到进程选项卡,在PID一列查看2720对应的进程是谁,如果看不到PID这一列,如下图:
(8)Android修改端口
Android默认的adb端口是5037,电脑上有一些应用的端口,又恰巧与adb端口冲突占用掉了
修改adb端口是最快最有效的解决方法:
再我的电脑下配置一下环境变量:新建一个环境变量 变量名为: ANDROID_ADB_SERVER_PORT
变量值为: 可以给自己设定一个数值,主要是为了不要和其他的程序端口冲突,建议10000——60000 之间,随便找一个数值。
(9)真正解决办法:将platform-toos中adb.exe复制到C:\Windows\System32解决
(10)wifi连接手机
https://blog.csdn.net/weixin_41253809/article/details/93195449
六、启动代码配置讲解
from appium import webdriver
capabilities = {
"platformName": "Android",
"deviceName": "47ef96800404",
"app": "D:\\imooc7.1.110102001android.apk"
}
webdriver.Remote("http://127.0.0.1:4720/wd/hub",capabilities)
七、启动日志分析https://testerhome.com/topics/12499
八、页面滑动及初级使用
(1)屏幕页面没有元素滑动,用坐标轴来操作,以左上角为原点
from appium import webdriver
import time
def get_driver():
capabilities = {
"platformName": "Android",
"deviceName": "47ef96800404",
"app": "D:\\imooc7.2.010102001android.apk",
"appActivity": "com.imooc.component.imoocmain.splash.MCSplashActivity",
"appPackage": "cn.com.open.mooc",
"automationName":"UIAutomator2"
}
driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",capabilities)
return driver
driver = get_driver()
# 获取屏幕的宽高
time.sleep(2)
def get_size():
size = driver.get_window_size()
width = size['width']
height = size['height']
return width,height
# 向左滑动
def swipe_left():
x1 = get_size()[0]/10*9
y1 = get_size()[1]/2
x = get_size()[0]/10
driver.swipe(x1,y1,x,y1)
# 向右滑动
def swipe_right():
x1 = get_size()[0]/10
y1 = get_size()[1]/2
x = get_size()[0]/10*9
driver.swipe(x1,y1,x,y1)
# 向上滑动
def swipe_up():
x1 = get_size()[0]/2
y1 = get_size()[1]/10
y = get_size()[1]/10*9
driver.swipe(x1,y1,x1,y)
# 向下滑动
def swipe_down():
x1 = get_size()[0]/2
y1 = get_size()[1]/10
y = get_size()[1]/10*9
driver.swipe(x1,y1,x1,y1)
def swipe_on(direction):
if direction == 'up':
swipe_up()
elif direction == 'down':
swipe_down()
elif direction == 'left':
swipe_left()
else:
swipe_right()
swipe_on('left')
swipe_on('left')
swipe_on('left')
swipe_on('up')
swipe_on('up')
time.sleep(2)
driver.find_element_by_id('cn.com.open.mooc:id/tvSkip').click()
九、慕课网登录代码(id和classname定位元素)
from appium import webdriver
import time
def get_driver():
capabilities = {
"platformName": "Android",
"deviceName": "47ef96800404",
"app": "D:\\imooc7.2.010102001android.apk",
"appActivity": "com.imooc.component.imoocmain.splash.MCSplashActivity",
"appPackage": "cn.com.open.mooc",
"automationName":"UIAutomator2",
# "noReset":"true"
}
driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",capabilities)
return driver
driver = get_driver()
# 获取屏幕的宽高
time.sleep(2)
def get_size():
size = driver.get_window_size()
width = size['width']
height = size['height']
return width,height
# 向左滑动
def swipe_left():
x1 = get_size()[0]/10*9
y1 = get_size()[1]/2
x = get_size()[0]/10
driver.swipe(x1,y1,x,y1)
# 向右滑动
def swipe_right():
x1 = get_size()[0]/10
y1 = get_size()[1]/2
x = get_size()[0]/10*9
driver.swipe(x1,y1,x,y1)
# 向上滑动
def swipe_up():
x1 = get_size()[0]/2
y1 = get_size()[1]/10
y = get_size()[1]/10*9
driver.swipe(x1,y1,x1,y)
# 向下滑动
def swipe_down():
x1 = get_size()[0]/2
y1 = get_size()[1]/10
y = get_size()[1]/10*9
driver.swipe(x1,y1,x1,y1)
def swipe_on(direction):
if direction == 'up':
swipe_up()
elif direction == 'down':
swipe_down()
elif direction == 'left':
swipe_left()
else:
swipe_right()
# 去登录
def go_login():
driver.find_element_by_id('cn.com.open.mooc:id/tvSkip').click()
time.sleep(3)
driver.find_element_by_id("cn.com.open.mooc:id/ivOperation").click()
time.sleep(3)
driver.find_element_by_class_name('android.widget.TextView').click()
time.sleep(3)
# 登录
def login():
time.sleep(3)
driver.find_element_by_id('cn.com.open.mooc:id/accountEdit').clear()
driver.find_element_by_id('cn.com.open.mooc:id/accountEdit').send_keys('13641235100')
driver.find_element_by_id('cn.com.open.mooc:id/passwordEdit').send_keys('wjs#182')
driver.find_element_by_id('cn.com.open.mooc:id/login').click()
time.sleep(3)
element = driver.find_element_by_class_name('android.widget.TextView').text
print(element)
swipe_on('left')
swipe_on('left')
swipe_on('left')
swipe_on('up')
swipe_on('up')
time.sleep(5)
go_login()
login()
十、层级定位思想分析
1、通过某一组元素定位:
例子方法:
elemet = find_elements_by_classname('class名字')
element[0].send_keys('账号')
element[1].send_keys('密码')
十一、通过uiautomator进行定位用户信息
元素定位方法:
def login_by_uiautomator():
driver.find_element_by_android_uiautomator('new
UiSelector().text('18513199586')').send_keys('输入信息')
十二、通过xpath定位元素(尽量别用效率比较低在手机端)
1、xpath是一种在xml文档中定位元素的语言
2、绝对路径定位:
find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
3、利用元素属性定位:
find_element_by_xpath("//input[@id='su']")
// 表示当前页面某个目录下,input表示定位元素的标签名,[@id='su']表示这个元素的id属性值等于su。
4、层级与属性结合:
find_element_by_xpath("//span[@class='bg s_ipt_wr']/input")
span[@class='bg s_ipt_wr'] 通过 class 属性定位到是父元素,后面/input 也就表示父元素下面标签名为
input 的子元素
5、使用逻辑运算符:
find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")
and 连接更多的属性来唯一的标识一个元素