Appium 自动化实例

我们以一个开发者头条的app,为例,演示一下自动化的过程

3.1 准备一些事情

即使安装好上述软件后。要自动化,还要准备一些事情,首先当然需要有被测试的 app 应用了。这里我们用的是开发者头条的 app 是从应用市场上下载下来。大家可以到其官网上下载安卓应用的 apk 文件

https://toutiao.io/

在一个合适的目录汇中,比如 E:\tools\ 目录下面。其次,运行 appium server ,这里就是上面安装的 appium desktopappium desktop 桌面图标长这个样子。

image.png

双击启动起来,大家注意这只是打开 appium desktop 界面。

image.png

要把 Appium server 启动起来要点击 Start Server

image.png

然后界面呈现这种状态。


image.png

Welcome to Appium 这个就是 Appium server 的版本。** Appium REST http interface listener started on 0.0.0.0:4723** 这样才是启动成功。

3.2 连接真实设备

连接手机的方法请移步

https://www.jianshu.com/p/878517b1b6d6

3.3 运行代码

打开开发者头条,点击 “+” 进入登录页面,只后点击用邮箱登录

image.png

image.png

然后输入我们注册的用户名和密码点击登录。


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 的文件。

image.png

注意当我们 import 导入一个模块的时候,如果说这个 appium 目录下没有这个 webdriver.py 的文件,如果说没有,但是 appium 下面有个 webdriver 目录,它就会把目录下的这个 _init_.py 也可以作为 webdriver 模块。

image.png

配置项部分:


#准备自动化配置信息
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%的不会 ,所以只要填固定的地址就可以了,我们启动之前不是有地址和端口吗。

image.png

我们通常不需要去改它,然后第二个参数 desired_caps 就是上面创建的字典对象,字典对象里面存了配置参数。把它传给 appium server 这行代码想创建webdriver实例对象,它的初始化操作干什么事情呢?就是去连接 appium server 并且把这次自动化的参数传递给他。告诉它们我们做的是Android的自动化,这个时候appium server 就会做一系列的事情,比如当前appium server 所在的这台电脑有没有连接一个安卓手机,并且安卓的版本是7的。。等等还有一些其他参数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容