我们以一个开发者头条的app,为例,演示一下自动化的过程
3.1 准备一些事情
即使安装好上述软件后。要自动化,还要准备一些事情,首先当然需要有被测试的 app 应用了。这里我们用的是开发者头条的 app 是从应用市场上下载下来。大家可以到其官网上下载安卓应用的 apk 文件
在一个合适的目录汇中,比如 E:\tools\
目录下面。其次,运行 appium server ,这里就是上面安装的 appium desktop 。appium desktop 桌面图标长这个样子。
双击启动起来,大家注意这只是打开 appium desktop 界面。
要把 Appium server 启动起来要点击 Start Server :
然后界面呈现这种状态。
image.png
Welcome to Appium 这个就是 Appium server 的版本。** Appium REST http interface listener started on 0.0.0.0:4723** 这样才是启动成功。
3.2 连接真实设备
连接手机的方法请移步
3.3 运行代码
打开开发者头条,点击 “+” 进入登录页面,只后点击用邮箱登录。
然后输入我们注册的用户名和密码点击登录。
image.png
大家创建个 python 文件,输入如下内容:
#导包
from appium import webdriver
#准备自动化配置信息
desired_caps={
#移动设备平台
'platformName':'Android',
#平台OS版本号
'plathformVersion':'8',
#设备的名称--值可以随便写
'deviceName':'test0106',
#提供被测app的信息-包名,入口信息
'appPackage':'com.alpha.lagouapk',
'appActivity':'.HelloActivity',
#确保自动化之后不重置app
'noReset':True,
#设置session的超时时间,单位秒
'newCommandTimeout':6000,
#更换底层驱动
'automationName':'UiAutomator1',
'unicodeKeyboard':True,#修改手机的输入法,UI2不需要设置
'resetKeyboard':True#自动化结束之后将输入法还原
}
#初始化driver对象-用于控制手机
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={
#移动设备平台
'platformName':'Android',
#平台OS版本号,写整数位即可
'plathformVersion':'8',
#设备的名称--值可以随便写
'deviceName':'test0106',
#提供被测app的信息-包名,入口信息:
#adb shell dumpsys activity recents | findstr intent={
'appPackage':'com.hpbr.bosszhipin',
'appActivity':'.module.launcher.WelcomeActivity',
#确保自动化之后不重置app
'noReset':True,
#设置session的超时时间,单位秒
'newCommandTimeout':6000,
#设置底层测试驱动-1.15默认使用的底层驱动就是UiAutomator2
'automationName':'UiAutomator2',#或者UiAutomator1
# 'skipServerInstallation':True#跳过UI2的安装,如果第一次运行程序,不要添加该配置
}
这里定义的 desired_capabilities ,作为下面生成 webdriver 时的参数。这些键值对告诉 appium server 测试程序希望进行的是什么样的测试。大家可以根据如下注释,了解每个配置项的含义。
#导包
from appium import webdriver
#准备自动化配置信息
desired_caps={
#移动设备平台
'platformName':'Android',
#平台OS版本号,写整数位即可
'plathformVersion':'8',
#设备的名称--值可以随便写
'deviceName':'test0106',
#提供被测app的信息-包名,入口信息:
#adb shell dumpsys activity recents | findstr intent={
'appPackage':'com.hpbr.bosszhipin',
'appActivity':'.module.launcher.WelcomeActivity',
#确保自动化之后不重置app
'noReset':True,
#设置session的超时时间,单位秒
'newCommandTimeout':6000,
#设置底层测试驱动-1.15默认使用的底层驱动就是UiAutomator2
'automationName':'UiAutomator2',#或者UiAutomator1
# 'skipServerInstallation':True#跳过UI2的安装,如果第一次运行程序,不要添加该配置
}
#启动Remote RPC,将 capability参数传入,
#创建一个 webdriver对象, 和Selenium 类似。
#初始化driver对象-用于控制手机-启动被测应用
#IP-appium-server所在机器的网络ip,port-监听的端口号,path固定/wd/hub
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('jcyrss@163.com')
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的。。等等还有一些其他参数。
网友评论