我们以一个开发者头条的app,为例,演示一下自动化的过程
3.1 准备一些事情
即使安装好上述软件后。要自动化,还要准备一些事情,首先当然需要有被测试的 app 应用了。这里我们用的是开发者头条的 app 是从应用市场上下载下来。大家可以到其官网 https://toutiao.io/](https://toutiao.io/ 上下载安卓应用的 apk 文件。放在一个合适的目录汇中,比如 E:\tools\
目录下面。其次,运行 appium server ,这里就是上面安装的 appium desktop 。appium desktop 桌面图标长这个样子。
双击启动起来,大家注意这只是打开 appium desktop 界面。
要把 Appium server 启动起来要点击 Start Server :
然后界面呈现这种状态。
Welcome to Appium 这个就是 Appium server 的版本。** Appium REST http interface listener started on 0.0.0.0:4723** 这样才是启动成功。
3.2 连接真实设备
我们以小米手机为例,演示如何连接到系统,并进行自动化的过程如下:
- 用 USB 先连接到电脑,一头连接手机,一头连接电脑
-
进入手机设置 --> 更多设置 --> 开发者选项。
下滑找到USB 调试。
- 在电脑上执行如下命令(这个 adb 在 E:\tools\platform-tools 请大家一定要设置在环境变量中)
输入 adb devices -l 如图:
如果能正确列出设备信息,如上图所示。就表示从电脑上可以访问手机设备。就可以使用该手机进行自动化开发了。现在电脑系统,有的手机能够自动被 Windows 系统识别,就会显示上面的信息。而有的手机不一定能自动识别,因为还没有安装手机的 usb 驱动,需要我们去安装。可以通过官方 Windows 手机管理软件,比如华为手机(安装华为手机助手),也可以是豌豆荚, 360 手机助手等,也会帮我们安装驱动。
3.3 运行代码
打开开发者头条,点击 “+” 进入登录页面,只后点击用邮箱登录。
然后输入我们注册的用户名和密码点击登录。
大家创建个 python 文件,输入如下内容:
from appium import webdriver
import time,traceback
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '7'
desired_caps['deviceName'] = 'test'
# adb install e:\apk\toutiao.apk
desired_caps['appPackage'] = 'io.manong.developerdaily'
desired_caps['appActivity'] = 'io.toutiao.android.ui.activity.LaunchActivity'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
desired_caps['noReset'] = True
desired_caps['newCommandTimeout'] = 6000
# desired_caps['automationName'] = 'uiautomator2'
#启动Remote RPC
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.implicitly_wait(10)
try:
# 根据id找到元素,并点击,id和 html 元素的id不同
driver.find_element_by_id("tab_bar_plus").click()
time.sleep(1)
driver.find_element_by_id("btn_email").click()
time.sleep(1)
# 输入用户名、密码
ele = driver.find_element_by_id("edt_email")
ele.send_keys('输入自己的账号')
ele = driver.find_element_by_id("edt_password")
ele.send_keys('输入自己的密码')
time.sleep(2)
# 点击登录
driver.find_element_by_id('btn_login').click()
except:
print(traceback.format_exc())
input('**** Press to quit..')
driver.quit()
大家运行一下,看看是否能成功登陆开发者头条。
3.4 代码解释
我们先看第一行代码
from appium import webdriver
跟from selenium import webdriver
很相似,这个 webdriver 是个什么东西呢,我们可以点进去看一下。大家点进去可能会很奇怪,会以为有个文件叫 webdriver.py 呢,但是不是,它是一个 _init_.py
的文件。
注意当我们 import 导入一个模块的时候,如果说这个 appium 目录下没有这个 webdriver.py 的文件,如果说没有,但是 appium 下面有个 webdriver 目录,它就会把目录下的这个 _init_.py
也可以作为 webdriver 模块。
配置项部分:
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '7'
desired_caps['deviceName'] = 'test'
# adb install e:\apk\toutiao.apk
desired_caps['appPackage'] = 'io.manong.developerdaily'
desired_caps['appActivity'] = 'io.toutiao.android.ui.activity.LaunchActivity'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
desired_caps['noReset'] = True
desired_caps['newCommandTimeout'] = 6000
这里定义的 desired_capabilities ,作为下面生成 webdriver 时的参数。这些键值对告诉 appium server 测试程序希望进行的是什么样的测试。大家可以根据如下注释,了解每个配置项的含义。
#测试平台,不能写错
desired_caps['platformName'] = 'Android'
#平台版本,不能写错
desired_caps['platformVersion'] = '7'
#设备名称,android上随便填写一个值
desired_caps['deviceName'] = 'test'
#apk 文件路径名,如果设备还没有此应用,则会安装。已安装就注释掉
desired_caps['app'] = r'e:\apk\toutiao.apk'
#app package名,一定要有,是开发者给app取的名字,可以唯一标识这个app。
desired_caps['appPackage'] = 'io.manong.developerdaily'
#app启动Activity,也是必须的参数。安卓应用一个Activity 就对应
#一个用户操作界面
desired_caps['appActivity'] = 'io.toutiao.android.ui.activity.LaunchActivity'
# 如果我们自动化,要输入的信息里面有中文字符,需要这个参数,否则可以不要
#加上这个参数会新加一种unicode输入法
desired_caps['unicodeKeyboard'] = True
# 表示测试完后,输入法还要还原成原来的,比如原来是搜狗输入法
desired_caps['resetKeyboard'] = True
# 这个noReset参数,非常重要!!
# 保证了app 测试前不会清除数据,缺省是会清除数据的
desired_caps['noReset'] = True
# 我们的测试程序连接上appium server后,appium server 一直等待client 的命令。
#如果超过一定的时间,没有命令,比如debug的时候,它就会认为客户端已经退出了。就会断开连接
#这个参数就是指定多长时间,appium server可以认为连接已经断开了
desired_caps['newCommandTimeout'] = 6000
#启动Remote RPC,将 capability参数传入,
#创建一个 webdriver对象, 和Selenium 类似。
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
try:
# 和Selenium含义一样,问问大家还记得吗?
driver.implicitly_wait(10)
# 根据id找到元素,并点击,id和 html 元素的id不同
driver.find_element_by_id("io.manong.developerdaily:id/tab_bar_plus").click()
time.sleep(1)
driver.find_element_by_id("io.manong.developerdaily:id/btn_email").click()
time.sleep(1)
# 输入用户名、密码
ele = driver.find_element_by_id("io.manong.developerdaily:id/edt_email")
ele.send_keys('[email protected]')
ele = driver.find_element_by_id("io.manong.developerdaily:id/edt_password")
ele.send_keys('sdfsdf')
time.sleep(2)
# 点击登录
driver.find_element_by_id('io.manong.developerdaily:id/btn_login').click()
pass
except:
print(traceback.format_exc())
我们看下面这行代码。
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
webdriver.Remote,注意我们前面做 selenium 的时候,如果是谷歌浏览器就是webdriver.Chrome,至于 appnium 这里就写 Remote 因为这个 Remote 就是 appium 里面的一个 webdriver 对象,它的第一个参数是 appium server 它所运行的 url ,因为 appium server 它是以一个 web 服务的状态启动的,我们的自动化程序就是要连接这个appium server 服务,这个web* 服务它是 http 服务协议通信的.。因为我这个是启动在本机上所以这里就写 localhost 。端口 4723,有的人会问,我怎么知道这个端口啊?还有后面的这些东西,后面这些 /wd/hub 几乎是不变的,这个是 url 的固定地址,这块就固定填写/wd/hub 就行了,localhost:4723 就看你 appium server 启动在哪,大部分都是在本机上,所以说//localhost:4723/wd/hub 这个地址是几乎不变的,有可能变的是端口,只要你不改几乎也是不变的,因为 4723 是缺省端口,除非端口冲突了,正好有另外一个应用也占用了 4723 一般不会99%的不会 ,所以只要填固定的地址就可以了,我们启动之前不是有地址和端口吗。
我们通常不需要去改它,然后第二个参数 desired_caps 就是上面创建的字典对象,字典对象里面存了配置参数。把它传给 appium server 这行代码想创建webdriver实例对象,它的初始化操作干什么事情呢?就是去连接 appium server 并且把这次自动化的参数传递给他。告诉它们我们做的是Android的自动化,这个时候appium server 就会做一系列的事情,比如当前appium server 所在的这台电脑有没有连接一个安卓手机,并且安卓的版本是7的。。等等还有一些其他参数。
查看3.5 appPackage 和 appActivity
上面有两个参数 appPackage 和 appActivity,这两个参数是必填的,下面我们介绍两种查看的方法。
- 方法一 把 apk 保存在电脑上,使用 Android SDK 里面的工具。执行如下命令
E:\tools\build-tools\28.0.2\aapt.exe dump badging E:\tools\toutiao.apk
如下部分,就是 appPackage 需要填入的内容。
往下拉,这里就是 appActivity 需要填入的内容。
- 方法二 如果你 apk 已经安装在手机上了,可以直接打开手机上该应用,进入到你要操作的界面然后执行。
adb shell dumpsys activity recents | find "intent={" > d:\info.txt && d:\info.txt
圈中的部分就是我们想要的。
3.6命令装包
输入如下命令
adb install -r e:\tools\toutiao.apk
运行截图: