一、介绍
Appium是一个开源工具,用于自动化iOS收集、Android手机和Windows桌面平台的原生、混合和移动Web应用程序测试。appium是基于 webdriver 协议添加对移动设备自动化api扩展而成,因此大部分的api与selenium一样 ;同时体系架构也与 selenium 一样;基于tcp/ip协议。appium支持多平台(Android、iOS等)、多语言(python、java等);Appium是跨平台的,可以用在OSX,Windows以及Linux桌面系统上运行。
二、安装及环境配置
提前准备好:jdk环境、Android环境;
安装appium,下载地址:https://github.com/appium/appium-desktop/releases
windows 版本,傻瓜式安装。
三、连接设备
adb devices 查询连接的设备;如果未连接,可以重启adb服务:
adb kill -server 关闭服务;
adb start -server 启动服务;
appium 连接设备: 点击搜索图标 ;三个图标分别是: start inspector session 开始检查回话、Get Raw Logs 获得原生日志、 Stop Server 停止服务
deviceName:设备名称; 值为:127.0.0.1:62001
platformName:系统名称 ;Android or IOS
platformVersion: 系统版本 ,指移动设备的操作系统版本,在设置里查看; 夜神模拟器查看Android版本:可在命令行窗口:adb shell getprop ro.build.version.release
APPPackage : 应用包名,adb命令查询: pm list packages 列出所有的应用报名,pm list packages -3 指第三方; dumpsys window windows|grep -i current ;列出当前打开的应用包名及activity ; 查看启动的应用启动项名称:adb shell dumpsys activity top | find "ACTIVITY"
前面的是包名; / 后面的是activity ,配置好,点击start session 即可链接成功。
四、通过python脚本操作移动端应用
类似于selenium 操作浏览器;导入模块 Appium-Python-Client
初始化参数:
import time
from appium import webdriver
# 初始化参数
desired_caps = {
'platformName': 'Android', # 安卓系统
'platformVersion': '7.1.2', # 手机安卓版本
'deviceName': '127.0.0.1:62001', # 设备名,
'appPackage': 'com.taobao.taobao', #包名 com.taobao.taobao
'appActivity': 'com.taobao.browser.BrowserActivity', # 启动的Activity名称
'uuid':'127.0.0.1:62001' #指定设备编号 ,adb devices输出结果
}
{
"platformName": "Android",
"platformVersion": "7.1.2",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.taobao.taobao",
"appActivity": "com.taobao.browser.BrowserActivity"
}
然后进行 appium 连接,会自动打开淘宝APP;
操作命令:
我们打开Android UI分析器。获取到了目前手机页面的信息。根据我们的目的,找到需要的组件,根据组件ID就可以在上手机上定位它,从而完成我们相要的操作。
import time
from appium import webdriver
# 初始化参数
desired_caps = {
'platformName': 'Android', # 安卓系统
'platformVersion': '7.1.2', # 手机安卓版本
'deviceName': '127.0.0.1:62001', # 设备名,
'appPackage': 'com.taobao.taobao', #包名 com.taobao.taobao
'appActivity': 'com.taobao.browser.BrowserActivity', # 启动的Activity名称
'uuid':'127.0.0.1:62001' #指定设备编号 ,adb devices输出结果
}
#连接Appium Server,初始化环境,启动app ,127.0.0.1 或 localhost 地址和端口,
#就是启动appium时界面显示的ip和端口;wd:可以理解是WebDriver的缩写;hub:是指主节点、中心节点
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 每个操作等待5秒
driver.implicitly_wait(5)
driver.find_element_by_id('XX').click()
driver.find_element_by_id('XX').send_keys('芒果饼干')
driver.find_element_by_id('XX').click()
print("---------------")
time.sleep(600)
driver.quit()
至此,一个简单的python脚本就完成了;查看手机,会发现手机正在自动做打开淘宝,搜索芒果饼干的操作;若加上断言,就是一条完整的用例。
五、元素定位 与 操作
两种方式:一是根据操作步骤,可以使用appium的Inspector获取登陆相关操作元素的属性;二是使用Android SDK里自带的工具uiautomatorviewer获取;
元素定位常用接口:
格式:find_element_by_定位方式(value) ,与selenium 定位一致;
id定位:通过工具获取到按钮的 resource-id;
driver.find_element_by_id('resource-id')
class定位:通过工具获取到按钮的class
driver.find_element_by_class_name('class')
text定位:根据文本内容text定位;需要确认这个中文是当前页面唯一值,否则定位不到。
driver.find_element_by_android_uiautomator("text('百度一下')")
xpath定位:根据路径定位;
driver.find_element_by_xpath("xpath路径")
css_selector定位(webview):只适用于webview的html页面,继承自webdriver,与pc版本的UI测试一致
driver.find_element_by_css_selector()
link_text定位(webview):只适用于webview容器中的html页面,继承自webdriver,与pc版本的UI测试一致
driver.find_element_by_link_text()
name定位:只适用于webview容器中的html页面,继承自webdriver,与pc版本UI测试一致。
driver.find_element_by_name()
定位元素的另一种写法:find_element(by,value) ;find_element_by_方式(value)实际调用的都是find_element(by,value);要导入这个包:from selenium.webdriver.common.by import By
如:定位id为 password 的元素
方式一:driver.find_element_by_id("password”)
方式二:driver.find_element(By.ID,"password")
这种方式好处是可以直接把操作的by和value放到一个元组里,调用通用方法来传参获得元素结果。
By的操作可以是:By.ID 相当于by_id、By.CLASS_NAME 相当于by_class_name、By.XPATH 相当于by_xpath、By.NAME 相当于by_name、By.TAG_NAME 相当于by_tag_name、By.CSS_SELECTOR 相当于by_css_selector、By.LINK_TEXT 相当于by_link_text
元素操作方法:
找到元素后可以对元素进行的操作,如点击、输入文本等;
click() :点击操作
driver.find_element_by_id("su").click()
clear():清空输入框内容
driver.find_element_by_id("kw").clear()
send(xx):输入框内输入内容
driver.find_element_by_id("com.wuba.zhuanzhuan:id/ij").send_keys("test content")
text :获得元素的text内容
print(driver.find_element_by_xpath(" //xxxxx").text)
api参考文档: