python+Appium——移动端自动化之元素定位及操作

目录

元素定位方法

根据ID

根据CLASS NAME

根据ACCESSIBILITY ID

XPath定位

安卓UIAutomator

元素操作

其他操作

通知栏

adb 命令

自动化常用adb命令

shell

内嵌H5操作


元素定位方法

根据ID

同Selenium的定位方法相同,ID属性一般唯一,在安卓应用元素中,这个ID信息为resource-id属性,使用的代码为.find_element_by_id()

根据CLASS NAME

安卓界面的class属性其实是根据元素的类型,类似于web中的tagname(标签名)属性,所以通常并不唯一,因此,根据classs属性来选择元素时,通常是选择多个具有这一属性的元素,使用.find_elements_by_class_name(),结果为列表存放。

使用class属性时选择所有全程信息,如果只选择如下图中.TextView,无法定位到元素

根据ACCESSIBILITY ID

元素的content-desc属性是用来描述该元素作用的,如果要查询的界面元素有content-desc属性,我们可以通过它来选择定位元素,代码为.find_element_by_accessibility_id()

XPath定位

在Web中的xpth中语法完全适用于Appium。在Appium中选择的节点标签名class属性,不同于Web中的tagname。

安卓UIAutomator

前面的几种选择元素的方法,其底层都是利用安卓uiautomator框架的API功能实现的。参考安卓官方文档:UiSelector  |  Android Developers

程序的这些定位请求被Appium server转发给手机自动化代理程序,就会转化为uiautomator里面相应的定位函数调用API的java代码。

code = 'new UiSelector().text("热").className("android.widget.TextView")'
ele = driver.find_element_by_android_uiautomator(code)
ele.click()

在python自动化代码中,使用java先new一个方法UiSelector(),然后调用这个方法中的函数,上面代码中绿色标记的为使用uiautomator函数的固定格式,new UiSelector()后面的跟的是元素的属性特征方法,属性值一定用双引号(java方法),常用的几种方法如下,具体的方法属性访问上面网址。

  1. text方法:可以根据元素的文本属性查找元素
  2. textContains:根据文本包含的字符串查找
  3. textStartsWith:根据文本开头的字符串查找
  4. textmartch:使用正则表达式方法,如code = 'new UiSelector().textMatches("^我的.*")'
  5. Instance:匹配的结果所有元素里面的第n个元素(从0开始)
  6. Index:是其父元素的几个节点,类似xpath 里面的*[n](从0开始)
  7. childSelector :用来选择后代元素,如
Code = 'new UiSelector().resourceId("tv.danmaku.bili:id/recycler_view").childSelector(new UiSelector().className("android.widget.TextView"))'

            目前有bug:只能找到符合条件的第一个元素,参考appium 在github上的 issues:https://github.com/appium/java-client/issues/150

元素操作

  • 点击:同Web
  • 输入:同Web
  • 获取文本:对象的text属性
  • 获取坐标:整个驱动对象(手机窗口)的坐标 get_window_size(),返回的是一个字典对象{'width':x, 'height':y};指定对象的坐标 location,同样返回一个字典{'x':x,'y':y}
  • 滑动:WebDriver对象的 swipe方法提供了这个功能,比如:driver.swipe(start_x=x, start_y=y1, end_x=x, end_y=y2, duration=800)

    前面4个参数是滑动起点和终点的x、y坐标。第5个参数duration是滑动从起点到终点坐标所耗费的时间。【注意这个时间非常重要,在屏幕上滑动同样的距离,如果时间设置的很短,就是快速的滑动。比如:一个翻动新闻的界面,快速的滑动,就会是扫动的动作,会导致内容惯性滚动很多。】

  • 按键:调用press_keycode方法,就能模拟按键动作,包括安卓手机的实体按键和虚拟键盘按钮,代码示例: 
from appium.webdriver.extensions.android.nativekey import AndroidKey
driver.press_keycode(AndroidKey.ENTER)      # 输入回车键,确定搜索

     按键的定义,可以参考这篇文档:https://github.com/appium/python-client/blob/master/appium/webdriver/extensions/android/nativekey.py

  • 长按、双击、移动:Appium的TouchAction类提供了更多的手机操作方法,比如:长按、双击、移动,长按代码示例:
from appium.webdriver.common.touch_action import TouchAction 
actions = TouchAction(driver)
actions.long_press(element)
actions.perform()

    参考源代码中的注释:https://github.com/appium/python-client/blob/master/appium/webdriver/common/touch_action.py

其他操作

通知栏

# 创建手机驱动服务对象
d = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 启动其他应用包,两个参数:包名、应用appActivity名
d.start_activity('','')
# 安装包app,参数为app包的位置及名称
d.install_app('/')
# 判断是否已经安装了app,参数为包名
d.is_app_installed('')
# 获取页面page文档,如同web中的HTML文档
page = d.page_source
# 卸载app,参数为包名
d.remove_app('')
# 关闭app
d.close_app()
# 通过元素的坐标点击元素,参数1:为一个列表(列表的之为两对坐标,见元素的bounds属性);参数2:点击行为持续的时间
d.tap([(540,1764),(1080,1920)],300)
# 打开通知栏
d.open_notifications()
# 返回操作
d.back()
# 退出手机驱动对象
d.quit()

adb 命令

在android sdk里面的命令行工具 adb 。

adb全程 Android Debug Bridge,这个adb使用非常广泛。它可以与Android手机设备进行通信,它可进行各种设备操作。比如:安装应用和调试应用,传输文件,甚至登录到手机设备上shell的进行访问,就像远程登录一样。这个adb在sdk的platform-tools目录下面,安装时确保路径在path环境变量中。

Appium对anroid的自动化就非常依赖这个adb工具。执行自动化过程中,有很多内部操作,比如获取设备信息,传送文件到手机,安装apk,启动某些程序等,都是通常这个adb实现的。

命令可以使用Python的 os.system() 或者 subprocess 来自动化调用它,完成我们的各种自动化需求。比如,我们自动化过程中,可能需要截屏手机,并且下载到指定目录中,就可以在我们的Python程序中这样写:

import os
os.system('adb shell screencap /sdcard/screen3.png && adb pull /sdcard/screen3.png')

特别是,还可以通过adb 使用 am(activity manager) 和pm (package manager) 两个工具, 可以启动 Activity、强行停止进程、广播 intent、修改设备屏幕属性、列出应用、卸载应用等。更多adb命令参考:https://developer.android.google.cn/studio/command-line/adb.html#devicestatus

自动化常用adb命令

查看连接的设备:adb devices -l

查看目录:adb shell ls /sdcard

上传:adb push wv.apk /sdcard/wv.apk

下载:adb pull /sdcard/new.txt

截屏:adb shell screencap /sdcard/screen.png

截屏后的文件存在手机上,可以使用 adb pull 下载下来

shell

登录到手机设备上shell的进行访问,就像远程登录一样,可用来在连接的设备上运行各种命令。可以执行一下 adb shell 然后执行各种安卓支持的Linux命令,比如ps、netstat、netstat -an|grep 4724、pwd、ls、cd、rm 等。 执行quit退出 shell

内嵌H5操作

参考:appium微信公众号H5页面自动化测试 - ☆星空物语☆ - 博客园

      https://www.jianshu.com/p/3d817925e6d2

      http://www.python3.vip/tut/auto/appium/04/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值