appium+android

基础配置

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('包名')

  • 卸载appdriver.remove_app('包名')

  • 安装appdriver.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')
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值