基于Android的Appium+Python自动化脚本编写

1.Appium

Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试, 它使用WebDriver协议驱动iOS,Android和Windows应用程序。

通过Appium,我们可以模拟点击和屏幕的滑动,可以获取元素的id和classname,还可以根据操作生成相关的脚本代码。

下面开始Appium的配置。·

appPackage和APPActivity的获取

任意下载一个app

解压

但是解压出来的xml文件可能是乱码,所以我们需要反编译文件。

逆向AndroidManifest.xml

下载AXMLPrinter2.jar文件,逆向xml文件:命令行输入以下命令:

java -jar AXMLPrinter2.jar AndroidManifest.xml ->AndroidManifest.txt

获得以下可以查看的TXT文件

寻找带有launcher 的Activity

寻找manifest里面的package

Devicename的获取

通过命令行输入 adb devices:

appium的功能介绍

下面将根据上图序号一一介绍功能:

选中界面元素,显示元素相关信息

模拟滑动屏幕,先点击一下代表触摸起始位置,在点击一下代表触摸结束为止

模拟点击屏幕

模拟手机的返回按钮

刷新左边的页面,使之与手机同步

记录模拟操作,生成相关脚本

根据元素的id或者其他相关信息查找元素

复制当前界面的xml布局

文件退出

2.Python的脚本

元素定位的使用

(1).xpath定位

xpath定位是一种路径定位方式,主要是依赖于元素绝对路径或者相关属性来定位,但是绝对路径xpath执行效率比较低(特别是元素路径比较深的时候),一般使用比较少。

通常使用xpath相对路径和属性定位。

by_xpath.py

|-------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 | from find_element.capability ``import driver driver.find_element_by_xpath(``'//android.widget.EditText[@text="请输入用户名"]'``).send_keys(``'123456'``) driver.find_element_by_xpath(``'//*[@class="android.widget.EditText" and @index="3"]'``).send_keys(``'123456'``) driver.find_element_by_xpath(``'//android.widget.Button'``).click() driver.find_element_by_xpath(``'//[@class="android.widget.Button"]'``).click() |

(2).classname定位

classname定位是根据元素类型来进行定位,但是实际情况中很多元素的classname都是相同的,

如用户名和密码都是clasName属性值都是:"android.widget.EditText" 因此只能定位第一个元素也就是用户名,而密码输入框就需要使用其他方式来定位,这样其实很鸡肋.一般情况下如果有id就不必使用classname定位。

by_classname.py

|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 | from find_element.capability ``import driver driver.find_element_by_class_name(``'android.widget.EditText'``).send_keys(``'123565'``) driver.find_element_by_class_name(``'android.widget.EditText'``).send_keys(``'456879'``) driver.find_element_by_class_name(``'android.widget.Button'``).click() |

(3).id定位

日常生活中身边可能存在相同名字的人,但是每个人的身份证号码是唯一的,在app界面元素中也可以使用id值来区分不同的元素,然后进行定位操作。

Appium中可以使用 find_element_by_id() 方法来进行id定位。

|-----|------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 | driver.find_element_by_id(``'android:id/button2'``).click() driver.find_element_by_id(``'com.tal.kaoyan:id/tv_skip'``).click() |

3.示例:模拟软件的自动注册

首先配置连接属性

|----------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | desired_caps``=``{} # 所使用的平台 desired_caps[``'platformName'``]``=``'Android' # 所使用的手机的名字 可以通过 adb devices 获得 desired_caps[``'deviceName'``]``=``'127.0.0.1:62001' # ANDROID 的版本 desired_caps[``'platforVersion'``]``=``'5.1.1' # app 的路径 desired_caps[``'app'``]``=``r``'D:\extend\kaoyanbang.apk' # app的包名 desired_caps[``'appPackage'``]``=``'com.tal.kaoyan' # app 加载页面 desired_caps[``'appActivity'``]``=``'com.tal.kaoyan.ui.activity.SplashActivity' # 设置每次是否清除数据 desired_caps[``'noReset'``]``=``'False' # 是否使用unicode键盘输入,在输入中文字符和unicode字符时设置为true desired_caps[``'unicodeKeyboard'``]``=``"True" # 是否将键盘重置为初始状态,设置了unicodeKeyboard时,在测试完成后,设置为true,将键盘重置 desired_caps[``'resetKeyboard'``]``=``"True" # appium服务器的连接地址 driver``=``webdriver.Remote(``'http://localhost:4723/wd/hub'``,desired_caps) driver.implicitly_wait(``2``) |

编写操作脚本

|-------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import random import time driver.find_element_by_id(``'com.tal.kaoyan:id/login_register_text'``).click() username``=``'zx2019'``+``'F2LY'``+``str``(random.randint(``1000``,``9000``)) print``(``'username: %s' %``username) driver.find_element_by_id(``'com.tal.kaoyan:id/activity_register_username_edittext'``).send_keys(username) password``=``'zxw2018'``+``str``(random.randint(``1000``,``9000``)) print``(``'password: %s' %``password) driver.find_element_by_id(``'com.tal.kaoyan:id/activity_register_password_edittext'``).send_keys(password) email``=``'51zxw'``+``str``(random.randint(``1000``,``9000``))``+``'@163.com' print``(``'email: %s' %``email) driver.find_element_by_id(``'com.tal.kaoyan:id/activity_register_email_edittext'``).send_keys(email) #点击进入考研帮 driver.find_element_by_id(``'com.tal.kaoyan:id/activity_register_register_btn'``).click() #专业选择 driver.find_element_by_id(``'com.tal.kaoyan:id/activity_perfectinfomation_major'``).click() driver.find_elements_by_id(``'com.tal.kaoyan:id/major_subject_title'``)[``1``].click() driver.find_elements_by_id(``'com.tal.kaoyan:id/major_group_title'``)[``2``].click() driver.find_elements_by_id(``'com.tal.kaoyan:id/major_search_item_name'``)[``1``].click() #院校选择 driver.find_element_by_id(``'com.tal.kaoyan:id/activity_perfectinfomation_school'``).click() driver.tap([(``182``,``1557``),]) driver.find_element_by_xpath(``'/hierarchy/android.widget.FrameLayout/' ``'android.widget.LinearLayout/android.widget.FrameLayout/' ``'android.widget.LinearLayout/android.widget.FrameLayout/android.widget.' ``'RelativeLayout/android.widget.ExpandableListView/android.widget.' ``'LinearLayout[1]/android.widget.TextView[1]'``).click() driver.find_element_by_xpath(``'/hierarchy/android.widget.FrameLayout/' ``'android.widget.LinearLayout/android.widget.FrameLayout/' ``'android.widget.LinearLayout/android.widget.FrameLayout/' ``'android.widget.RelativeLayout/android.widget.ExpandableListView/' ``'android.widget.LinearLayout[4]/android.widget.TextView'``).click() time.sleep(``2``) driver.tap([(``983``,``1354``),]) # driver.find_elements_by_id('com.tal.kaoyan:id/more_forum_title')[1].click() # driver.find_elements_by_id('com.tal.kaoyan:id/university_search_item_name')[1].click() driver.find_element_by_id(``'com.tal.kaoyan:id/activity_perfectinfomation_goBtn'``).click() print``(``'注册成功'``) |

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

视频文档获取方式:

这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

相关推荐
liyy6146 分钟前
Android架构组件:MVVM模式的实战应用与数据绑定技巧
android
测试老哥20 分钟前
功能测试干了三年,快要废了。。。
自动化测试·软件测试·python·功能测试·面试·职场和发展·压力测试
爱吃油淋鸡的莫何20 分钟前
Conda新建python虚拟环境问题
开发语言·python·conda
闲人编程27 分钟前
Python实现日志采集功能
开发语言·python·fluentd·filebeat·日志采集
2401_8628867836 分钟前
蓝禾,汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推
前端·c++·python·算法·游戏
luthane38 分钟前
python 实现armstrong numbers阿姆斯壮数算法
python·算法
昕er1 小时前
Python 中自动打开网页并点击[自动化脚本],Selenium
python·selenium·自动化
风控牛1 小时前
【chromedriver编译-绕过selenium机器人检测】
java·python·selenium·测试工具·安全·机器人·行为验证
su1ka1111 小时前
re题(36)BUUCTF-[WUSTCTF2020]Cr0ssfun
python