基础配置
from appium import webdriver
# 定义字典变量
desired_caps = {}
# 必须参数,定义被测脚本的平台属性。不区分大小写,如android、IOS.
desired_caps['platformName'] = 'Android'
# 必须参数,定义被测手机的版本号(设置->关于本机->android版本, 必须跟被测机对得上。不能乱写,大版本不能错。小版本可以不用写)
desired_caps['platformVersion'] = '6.0.1'
# 被测机名字,可以写任意值,但不能为空
desired_caps['deviceName'] = '127.0.0.1:7555'
# 必须参数,指定被测软件的包名(apk名称)
desired_caps['appPackage'] = 'com.android.settings'
# 必须参数,指定要打开的app的页面是那个
desired_caps["appActivity"] = '.Settings'
# 不是必须的的,但一般需要指定(自动化测试的引擎)
desired_caps['automationName'] = 'Uiautomator2'
# app重置策略-True不要停止应用程序,不要清除应用数据,不要卸载
desired_caps['noReset'] = True
# 设置命令的操作时间
desired_caps['newCommandTimeout'] = 6000
# 用于设置中文输入
# 使用Unicode输入法
desired_caps['unicodeKeyboard'] = True
# 重置输入法到原有状态
desired_caps['resetKeyboard'] = True
查看apk包名和activity:
在没有apk包的情况下,直接运行adb命令查看(要运行相应的activity)
adb shell dumpsys activity activities | findstr Run
APP重置策略:
默认:测试后停止并清除应用数据,不卸载APK
fullReset:在会话开始前 测试后 停止APP,清除app数据并卸载APK
noReset:不要停止应用程序,不要清除应用数据,不要卸载
newCommandTimeout:
为了结束Appium会话,会设置一个等待从客户端发送命令的超时时间,默认为60秒,一般不需要设置
unicodeKeyboard:
是否使用unicode键盘输入,在输入中文字符和unicode字符时设置为true
newCommandTimeout:
为了结束Appium会话,会设置一个等待从客户端发送命令的超时时间,默认为60秒,一般不需要设置是否将键盘重置为初始状态,设置了unicodeKeyboard时,在测试完成后,设置为true,将键盘重置
获取driver
# 获取driver(对应appium服务器ip地址和设置的端口号)
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
# wd:可以理解是WebDriver的缩写
# hub:是指主节点、中心节点
运行
1、启动模拟器
2、启动adb服务
3、adb连接模拟器
4、启动appium工具
5、运行脚本
方法
-
当前所在应用包名
driver.current_package
-
当前所在应用启动名
driver.current_activity
-
启动xxx(可应用于跳转)
driver.start_activity('包名','启动名')
-
退出驱动
driver.quit()
退出当前应用driver.close_app()
-
退出指定应用
driver.terminate_app('包名')
启动当前应用driver.launch_app()
-
判断app是否存在
driver.is_app_installed('包名')
-
卸载app
driver.remove_app('包名')
-
安装app
driver.install_app('安装包路径apk')
-
app置于后台(超过既定时间之后会重新置于前台)
driver.background_app(时间秒)
元素定位
可使用uiautomatorviewer配合定位
定位单个元素(如果是定位到多个则为第一个)
- ID定位
driver.find_element_by_id(resource-id属性值)
- class定位
driver.find_element_by_class_name(class属性值)
- xpath定位
driver.find_element_by_xpath(xpath表达式)
- name定位
driver.find_element_by_accessibility_id(content-desc属性值)
定位一组元素(返回数据为列表)
- ID定位
driver.find_elements_by_id(resource-id属性值)
- class定位
driver.find_elements_by_class_name(class属性值)
- xpath定位
driver.find_elements_by_xpath(xpath表达式)
- name定位
driver.find_elements_by_accessibility_id(content-desc属性值)
xpath的写法
示例:
- 文本包含“设”字
//*[contains(@text,'设')]
- class属性为aa
//*[@class='aa']
元素操作及获取信息
-
点击
element.click()
-
输入
element.send_keys(value)
-
清除文本
element.clear()
-
获取元素文本
element.text
-
获取元素位置
element.location
返回值为{'x': n, 'y': n}
-
获取元素大小
element.size
返回值为{'height': n, 'width': n}
-
获取属性值
element.get_attribute(属性名)
print('content-desc为',element.get_attribute('name')) print('text为',element.get_attribute('text')) print('enabled为',element.get_attribute('enabled')) print('resource-id为',element.get_attribute('resourceId')) print('class为',element.get_attribute('className'))
-
滑动
swipe(从一个坐标位置滑动到另外一个坐标位置,精准滑动)drive.swipe(start_x, start_y, end_x, end_y, duration) #start_x: 滑动开始x坐标 #start_y: 滑动开始y坐标 #end_x: 滑动结束x坐标 #end_y: 滑动结束y坐标 #duration:滑动持续时间,单位:ms
-
滚动
scroll(有惯性存在,滚动时不按下开始元素)#在duration时间将el1滚动到el2位置上 driver.scroll(el1,el2,duration)
-
拖拽
drag_and_drop(精准操作,无惯性存在,按下开始元素拖拽到指定元素–从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置)# 将元素el1拖拽至el2位置 drag_and_drop(el1,el2)
手势操作
- 轻敲(模拟手指对某个元素或坐标按下并快速抬起)
TouchAction(driver).tap(el,x,y).perform()
#导包 from appium.webdriver.common.touch_action import TouchAction # 轻敲WLAN # 1、获取元素 el = driver.find_element_by_xpath('//*[@text="WLAN"]') # 2、创建对象 touch_action = TouchAction(driver) # 3、调用轻敲方法:可使用元素也可使用xy坐标位置 touch_action.tap(el) # 4、执行手势 touch_action.perform() # # 2、3、4、可合并为 # TouchAction(driver).tap(el).perform()
- 按下
press(el,x,y)
抬起release()
#按下抬起,效果类似于点击 TouchAction(driver).press(el).release().perform() #或者,获取位置,使用xy坐标方式 location = el.location TouchAction(driver).press(x=location.get('x'),y=location.get('y')).release().perform()
- 长按
TouchAction(driver).tap(el,x,y,duration).perform()
#长按el元素两秒 TouchAction(driver).long_press(el,2000).perform()
- 移动
move_to(el,x,y)
和等待wait(n)
# 绘制解锁图案Z # 1、定位WLAN和应用 WLAN = driver.find_element_by_xpath('//*[@text="WLAN"]') app = driver.find_element_by_xpath('//*[@text="应用"]') # 2、将应用拖拽至WLAN位置 driver.drag_and_drop(app,WLAN) # 3、点击安全 driver.find_element_by_xpath('//*[@text="安全"]').click() # 4、点击屏幕锁定方式 driver.find_element_by_xpath('//*[@text="屏幕锁定方式"]').click() # 5、点击图案 driver.find_element_by_xpath('//*[@text="图案"]').click() # 6、绘制Z # 坐标点 # 134,508 675,508 # 134,1050 675,1050 # move_to 移动,wait等待 TouchAction(driver).press(x=134,y=508).wait(1000).move_to(x=675,y=508).wait(1000).move_to(x=134,y=1050).wait(1000).move_to(x=675,y=1050).wait(1000).perform()
手机操作
-
获取手机分辨率
driver.get_window_size()
-
查看当前网络
driver.network_connection
-
设置网络
driver.set_network_connection(1)
-
截图保存
driver.get_screenshot_as_file('文件名')
-
按键
driver.press_keycode(keycode)
键名 描述 键值 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME 按键Home 3 KEYCODE_MENU 菜单键 82 KEYCODE_BACK 返回键 4 KEYCODE_SEARCH 搜索键 84 KEYCODE_CAMERA 拍照键 27 KEYCODE_FOCUS 拍照对焦键 80 KEYCODE_POWER 电源键 26 KEYCODE_NOTIFICATION 通知键 83 KEYCODE_MUTE 话筒静音键 91 KEYCODE_VOLUME_MUTE 扬声器静音键 164 KEYCODE_VOLUME_UP 音量增加键 24 KEYCODE_VOLUME_DOWN 音量减小键 25
参考:【Appium】手机按键(比如返回键、Home键等)的数字代号总结
- 操作通知栏
# 打开通知栏 driver.open_notifications() sleep(2) # 查找信息并点击 driver.find_element_by_xpath('//*[@text="例子"]').click()
- 获取toast信息
toast为移动应用中有时间显示的黑底白字的提示 1、需要设置引擎 desired_caps['automationName'] = 'Uiautomator2' 2、编码获取文本值,eg: # 方法一:文本定位,不灵活 toast_msg = driver.find_element_by_xpath('//*[contains(@text,"登录需要同意")]').text print(toast_msg) # 方法二,直接获取toast的内容,需提前导包 from selenium.webdriver.support.ui import WebDriverWait toast_msg = WebDriverWait(driver,5).until(lambda x:x.find_element_by_xpath("//*[@class='android.widget.Toast']")).text print(toast_msg)
- 切换环境
当app中嵌套web信息是,需要先进行切换才能够定位 # 获取当前应用的所有环境 driver.contexts # 切换环境 driver.switch_to.context('WEBVIEW_com.android.browser')