一、Appium用途和特点
Appium
是一个移动 App (手机应用)自动化工具。
手机APP 自动化有什么用?
-
自动化完成一些重复性的任务
比如微信客服机器人
-
爬虫
就是通过手机自动化爬取信息。
为什么不通过网页、HTTP 爬取呢?有的系统没有网页,也不方便通过HTTP爬取
-
自动化测试
很多企业里面有这样的需求
Appium
自动化方案的特点:
-
开源免费
-
支持多个平台
iOS (苹果)、安卓 App 的自动化都支持。
-
支持多种类型的自动化
支持 苹果、安卓应用原生界面 的自动化
支持 应用内嵌 WebView 的自动化
支持 手机浏览器中的 web网站自动化
支持 flutter应用的自动化
-
支持多种编程语言
像 Selenium 一样, 可以用多种编程语言 调用它 开发自动化程序。
二、 自动化原理
Appium自动化架构借鉴Selenium, 包含了 3个主体部分:自动化程序、Appium Server、移动设备.
-
自动化程序
自动化程序是由我们来开发的,实现具体的手机自动化功能。
要发出具体的指令控制手机,也需要使用客户端库。
和Selenium一样,Appium 组织也提供了多种编程语言的客户端库,包括 java,python,js, ruby等,方便不同编程语言的开发者使用。
我们需要安装好客户端库,调用这些库,就可以发出自动化指令给手机。
-
Appium Server
Appium Server 是 Appium 组织开发的程序,它负责管理手机自动化环境,并且转发自动化程 序的控制指令给手机,并且转发手机给自动化程序的响应消息。
-
手机设备
我们这里说的手机设备,其实不仅仅是手机,包括所有苹果、安卓的移动设备,比如:手机、平板、智能手表等。
为了直观方便的讲解,这里我们简称: 手机
当然手机上也包含了我们要自动化控制的手机应用APP。
手机设备为什么能 接收并且处理自动化指令呢?
因为,Appium Server 会在手机上 安装一个 自动化代理程序, 代理程序会等待自动化指令,并且执行自动化指令
比如:要模拟用户点击界面按钮,Appium 自动化系统的流程是这样的:
-
自动化程序 调用客户端库相应的函数, 发送
点击元素
的指令(封装在HTTP消息里)给 Appium Server -
Appium Server 再转发这个指令给手机上的自动化代理
-
手机上的自动化代理接收到指令后,调用手机平台的自动化库,执行点击操作,返回点击成功的结果给 Appium Server
-
Appium Server 转发给自动化程序
-
自动化程序了解到本操作成功后,继续后面的自动化流程
其中,自动化代理控制,使用的什么库来实现自动化的呢?
如果测试的是苹果手机, 用的是苹果的 XCUITest 框架 (IOS9.3版本以后)
如果测试的是安卓手机,用的是安卓的 UIAutomator 框架 (Android4.2以后)
这些自动化框架提供了在手机设备上运行的库,可以让程序调用这些库,像人一样自动化操控设备和APP,比如:点击、滑动,模拟各种按键消息等。
三、 Android自动化环境搭建
1. 安装appium 点击这里打开下载页面
2. 安装client编程库
根据原理图, 我们知道自动化程序需要调用客户端库和 Appium Server 进行通信。
pip install appium-python-client
3. 安装JDK Java Downloads | Oracle
# 打开文件
vim .bash_profile
# 括号中都复制进去
【
# 复制如下内容,JAVA_HOME 替换为自己目录
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_341.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
# 配置文件立即生效
source .bash_profile
# 查看 JAVA_HOME 目录
echo $JAVA_HOME
】
# 执行使之生效
source .bash_profile
# 查看jdk是否生效
java - version
4. 安装 Android SDK
对于安卓APP的自动化,Appium Server 是需要 Android SDK的adb命令。
因为要用到里面的一些工具,比如 要执行命令设置手机、传送文件、安装应用、查看手机界面等。
# 安装
brew install android-platform-tools
# 验证
adb version
或者直接下载android-sdk-macos包
5. 安装appium inspector 定位元素的软件
6. 连接手机
上述的软件环境都准备好以后,要自动化手机APP,需要:
-
在你运行程序的电脑上 用 USB线 连接上 你的安卓手机
-
进入
手机设置
->关于手机
,不断点击版本号
菜单(7次以上), -
退出到上级菜单,在开发者模式中,启动USB调试
如果手机连接USB线后,手机界面弹出 类似 如下提示。
注意:
有的手机系统,可能需要一些额外的选项需要设置好。
比如,有的手机,开发者选项里 需要打开 允许通过USB安装应用
等。
总之,给USB开发调试 尽可能方便的控制手机。
连接好以后,打开命令行窗口, 执行 adb devices
命令来列出连接在电脑上的安卓设备。
7. 在pycharm中输入下方例子
运行代码前,要先 运行 Appium Desktop
from appium import webdriver
from selenium.webdriver.common.by import By
from appium.webdriver.extensions.android.nativekey import AndroidKey
desired_caps = {
'platformName': 'Android', # 被测手机是安卓
'platformVersion': '8', # 手机安卓版本
'deviceName': 'xxx', # 设备名,安卓手机可以随意填写
'appPackage': 'tv.danmaku.bili', # 启动APP Package名称
'appActivity': '.ui.splash.SplashActivity', # 启动Activity名称
'unicodeKeyboard': True, # 使用自带输入法,输入中文时填True
'resetKeyboard': True, # 执行完程序恢复原来输入法
'noReset': True, # 不要重置App
'newCommandTimeout': 6000,
'automationName' : 'UiAutomator2'
# 'app': r'd:\apk\bili.apk',
}
# 连接Appium Server,初始化自动化环境
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 设置缺省等待时间
driver.implicitly_wait(5)
# 如果有`青少年保护`界面,点击`我知道了`
iknow = driver.find_elements(By.ID, "text3")
if iknow:
iknow.click()
# 根据id定位搜索位置框,点击
driver.find_element(By.ID, 'expand_search').click()
# 根据id定位搜索输入框,点击
sbox = driver.find_element(By.ID, 'search_src_text')
sbox.send_keys('白月黑羽')
# 输入回车键,确定搜索
driver.press_keycode(AndroidKey.ENTER)
# 选择(定位)所有视频标题
eles = driver.find_elements(By.ID, 'title')
for ele in eles:
# 打印标题
print(ele.text)
input('**** Press to quit..')
driver.quit()