基于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``(``'注册成功'``) |

总结:

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

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

软件测试面试文档

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

视频文档获取方式:

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

相关推荐
加油吧zkf3 分钟前
AI大模型如何重塑软件开发流程?——结合目标检测的深度实践与代码示例
开发语言·图像处理·人工智能·python·yolo
t_hj4 分钟前
python规划
python
czhc114007566320 分钟前
Linux 76 rsync
linux·运维·python
福柯柯25 分钟前
Android ContentProvider的使用
android·contenprovider
不想迷路的小男孩25 分钟前
Android Studio 中Palette跟Component Tree面板消失怎么恢复正常
android·ide·android studio
餐桌上的王子27 分钟前
Android 构建可管理生命周期的应用(一)
android
菠萝加点糖31 分钟前
Android Camera2 + OpenGL离屏渲染示例
android·opengl·camera
用户20187928316741 分钟前
🌟 童话:四大Context徽章诞生记
android
yzpyzp1 小时前
Android studio在点击运行按钮时执行过程中输出的compileDebugKotlin 这个任务是由gradle执行的吗
android·gradle·android studio
悠悠小茉莉1 小时前
Win11 安装 Visual Studio(保姆教程 - 更新至2025.07)
c++·ide·vscode·python·visualstudio·visual studio