app自动化测试----基础入门appium初使用(UI自动化)
1.说明
前提:app自动化环境搭建----Windows系统搭建 已搭建完成
appium官方文档:https://appium.io/docs/en/about-appium/getting-started/?lang=zh
2.创建项目(连接手机)
python appium 官方地址:https://pypi.org/project/Appium-Python-Client/
# 安装 python appium 包 pip install Appium-Python-Client # windows系统执行命令 pip install Appium-Python-Client # mac系统执行命令
项目结果:
# main.py 文件 import os from appium import webdriver # 获取apk在项目中的存放地址 apk = os.path.join(os.path.dirname(os.path.abspath(__file__)),'apk/app-release-fanmao-cnode.apk') desired_caps = { 'platformName':'Android', # 测试Android系统 'platformVersion':'7.1.2', # Android版本 可以在已连接手机 设置->关于手机 中查看 'deviceName':'127.0.0.1:62001', # cmd中使用 adb devices 命令查看已连接的设备 'automationName':'UiAutomator2', # 自动化引擎(默认UiAutomator2即可) 'app':apk # app 文件路径(当前方式,每次运行项目,app都会重新安装一次) } # 创建 webdriver 实例 连接手机 driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_capabilities=desired_caps)
第一步:启动 appium server
需要注意的是:使用手机测试的话,启动appium 的时候需要在手机上安装 appium setting 有些手机有安全选项 需要手动去确认一下。
第二步:在pycharm中执行代码
如果是在模拟器中执行,会先安装appium setting(有,则跳过这一步),再安装我们测试的apk,然后打开apk(打开成功,则连接手机通过,才可以继续编写我们的代码)
执行完成后,可以关闭appiu(Ctrl+c 即可以关闭)
3.自动化登录app
(1)找到自己的adb安装路径
找到 app 定位工具
(2)在模拟器或者连接的真机中,打开app里面我们需要定位的页面,再打开uiautomatorviewer.bat
(3)元素定位----xpath 定位
//class的值[@属性及其对应的值] /下面的元素class值
//android.view.ViewGroup[@resource-id="org.cnodejs.android.md:id/toolbar"]/android.widget.ImageButton
# main.py 文件 import os import time from appium import webdriver # 获取apk在项目中的存放地址 apk = os.path.join(os.path.dirname(os.path.abspath(__file__)),'apk/app-release-fanmao-cnode.apk') desired_caps = { 'platformName':'Android', # 测试Android系统 'platformVersion':'7.1.2', # Android版本 可以在已连接手机 设置->关于手机 中查看 'deviceName':'127.0.0.1:62001', # cmd中使用 adb devices 命令查看已连接的设备 'automationName':'UiAutomator2', # 自动化引擎(默认UiAutomator2即可) 'app':apk # app 文件路径(当前方式,每次运行项目,app都会重新安装一次)
}
# 创建 webdriver 实例 连接手机
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_capabilities=desired_caps) time.sleep(5)
# 点击登录
login_image_btn = '//android.view.ViewGroup[@resource-id="org.cnodejs.android.md:id/toolbar"]/android.widget.ImageButton' driver.find_element_by_xpath(login_image_btn).click()
time.sleep(1)
click_login_name = 'org.cnodejs.android.md:id/tv_login_name'
driver.find_element_by_id(click_login_name).click() time.sleep(1)
# 输入登录的token http://47.100.175.62:3000/
driver.find_element_by_id('org.cnodejs.android.md:id/edt_access_token').send_keys("83dc9ad3-f0e1-4cf3-a0de-d82a3508f79d")
# 点击登录
driver.find_element_by_id('org.cnodejs.android.md:id/btn_login').click()
第一步:启动 appium server
需要注意的是:使用手机测试的话,启动appium 的时候需要在手机上安装 appium setting 有些手机有安全选项 需要手动去确认一下。
第二步:关闭 uiautomatorviewer.bat 元素定位工具
第二步:在pycharm中执行代码
4.元素定位
(1)Xpath定位
//class的值[@属性及其对应的值] /下面的元素class值
//android.view.ViewGroup[@resource-id="org.cnodejs.android.md:id/toolbar"]/android.widget.ImageButton
(2)and 并且多个属性来定位
//*[@text="登录" and @resource-id="org.cnodejs.android.md:id/btn_login"]
(3)子元素定位,先找到父元素,再找到子元素,[2] 表示第二个子元素
//*[@resource-id="org.cnodejs.android.md:id/recycler_view"]/android.widget.LinearLayout[2]
(4)xpath text 文本值定位
//*[@text="点击头像登录"]
5.自动化发微博
5.1 先在模拟器上面下载并安装 微博App (使用模拟器/真机都可以),安装完成并登陆后,获取包名,启动页名称
打开cmd,运行命令
打开模拟器中的微博,查看日志
packageName:com.sina.weibo activityName:.SplashActivity
5.2 连接模拟器获取自动化代码
启动 appium桌面客户端
在新的窗口中添加连接配置
{ "platformName":"Android", # 测试Android系统 "platformVersion":"7.1.2", # Android版本 可以在已连接手机 设置->关于手机 中查看 "deviceName":"127.0.0.1:62001", # cmd中使用 adb devices 命令查看已连接的设备 "automationName":"UiAutomator2" # 自动化引擎(默认UiAutomator2即可) } # 可直接复制到JSON Representation { "platformName": "Android", "platformVersion": "7.1.2", "deviceName": "127.0.0.1:62001", "automationName": "UiAutomator2" }
ps:上传图片好麻烦啊~~~(注意,需要先下载几张图片在手机相册中)
from appium import webdriver import time from appium.webdriver.common.touch_action import TouchAction desired_caps = { 'platformName':'Android', # 测试Android系统 'platformVersion':'7.1.2', # Android版本 可以在已连接手机 设置->关于手机 中查看 'deviceName':'127.0.0.1:62001', # cmd中使用 adb devices 命令查看已连接的设备 'automationName':'UiAutomator2', # 自动化引擎(默认UiAutomator2即可) 'noReset': True, # 不要重置app的状态(比如,已经登陆的app,我们运行项目的时候保留之前的状态) 'fullReset': False, # 不要清理app的缓存数据(比如,已经登陆的app,我们运行项目的时候保留之前的状态) 'appPackage':"com.sina.weibo", # 应用的包名(打开对应包名的app) 'appActivity': ".SplashActivity" # 应用的活动页名称 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps) time.sleep(15) el1 = driver.find_element_by_id("com.sina.weibo:id/rightBtn_wrapper") el1.click() time.sleep(2) el2 = driver.find_element_by_accessibility_id("写微博") el2.click() # 等待发微博页面加载成功 time.sleep(3) el3 = driver.find_element_by_id("com.sina.weibo:id/edit_view") el3.send_keys("Hi 今天天气真好啊") driver.find_element_by_accessibility_id("插入图片").click() time.sleep(3) # 选择图片(抓取不到,所以需要自己去写) xpath_img1 = '//*[@resource-id="com.sina.weibo:id/photo_album_gridview"]/android.widget.RelativeLayout[2]' xpath_img2 = '//*[@resource-id="com.sina.weibo:id/photo_album_gridview"]/android.widget.RelativeLayout[3]' driver.find_element_by_xpath(xpath_img1).click() time.sleep(2) # 选中 driver.find_element_by_id('com.sina.weibo:id/btn_num_check').click() # 返回上一层 driver.back() time.sleep(2) driver.find_element_by_xpath(xpath_img2).click() time.sleep(1) driver.find_element_by_id('com.sina.weibo:id/btn_num_check').click() # 点击下一步 driver.find_element_by_id('com.sina.weibo:id/btn_confirm_edit').click() time.sleep(1) driver.find_element_by_id('com.sina.weibo:id/btn_confirm_edit').click() time.sleep(1) el4 = driver.find_element_by_accessibility_id("发送") el4.click() # 刷新微博 time.sleep(3) TouchAction(driver).press(x=390, y=200).move_to(x=390, y=1323).release().perform() # driver.quit()