image

## text属性的方法

`driver.find_element_by_android_uiautomator(``'new UiSelector().text("Custom View")'``).click() ``#text`

`driver.find_element_by_android_uiautomator(``'new UiSelector().textContains("View")'``).click() ``#textContains`

`driver.find_element_by_android_uiautomator(``'new UiSelector().textStartsWith("Custom")'``).click() ``#textStartsWith`

`driver.find_element_by_android_uiautomator(``'new UiSelector().textMatches("^Custom.*")'``).click() ``#textMatches`

**class属性的方法**

`driver.find_element_by_android_uiautomator(``'new UiSelector().className("android.widget.TextView").text("Custom View")'``).click() ``#className`

`driver.find_element_by_android_uiautomator(``'new UiSelector().classNameMatches(".*TextView$").text("Custom View")'``).click() ``#classNameMatches`

** 伪xpath方法定位**

`driver.find_element_by_android_uiautomator(``'new UiSelector().text("Custom View").fromParent(new UiSelector().text("Accessibility Service"))'``).click() ``#通过同级元素定位同级元素`

`driver.find_element_by_android_uiautomator(``'new UiSelector().className("android.widget.ListView").childSelector(new UiSelector().text("Custom View"))'``).click() ``#通过父级元素定位子集元素`

** resourceId属性的方法**

`driver.find_element_by_android_uiautomator(``'new UiSelector().resourceId("android:id/text1")'``) ``#resourceId`

`driver.find_element_by_android_uiautomator(``'new UiSelector().resourceIdMatches(".*id/text1$")'``) ``#resourceIdMatches`

** description属性的方法

`driver.find_element_by_android_uiautomator(``'new UiSelector().description("Custom View")'``).click() ``#description`

`driver.find_element_by_android_uiautomator(``'new UiSelector().descriptionStartsWith("Custom")'``).click() ``#descriptionStartsWith`

`driver.find_element_by_android_uiautomator(``'new UiSelector().descriptionMatches("^Custom.*")'``).click() ``#descriptionMatches`

|

** 元素的其他属性**

除了以上比较常用的方法外,UIAutomator还支持其他一些方法,比如根据控件属性是否可点击可聚焦可长按等来缩小要定位的控件的范围,具体使用方法不一一列举(checked,clickable,focesed.......)

`driver.find_element_by_android_uiautomator(``'new UiSelector().clickable(true).text("Custom View")'``).click()`

uiautomator 的查找元素:

# resourceId 方式

self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("%s")')

# text 方式

self.driver.find_element_by_android_uiautomator('new UiSelector().text("%s")')

# description 方式

self.driver.find_element_by_android_uiautomator('new UiSelector().description("%s")')

# className 方式

self.driver.find_element_by_android_uiautomator('new UiSelector().className("%s")')

# index 方式

self.driver.find_element_by_android_uiautomator('new UiSelector().index("%s")')

# className + index 方式

self.driver.find_element_by_android_uiautomator('new UiSelector().className("%s").childSelector(new UiSelector().index("%d"))')

# 伪xpath方法定位

self.driver.find_element_by_android_uiautomator('new UiSelector().text("Custom View").fromParent(new UiSelector().text("Accessibility Service"))').click()

self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.ListView").childSelector(new UiSelector().text("Custom View"))').click()

#注意双引号的位置

原文链接:https://blog.csdn.net/Test_Sir_Cao/article/details/80776033

**二、元素定位**

**1.格式:find_element_by_定位方式(value)**

**通过id定位**

(取resource-id的值):

driver.find_element_by_id("com.wuba.zhuanzhuan:id/azo")

也可以直接用id后面的内容driver.find_element_by_id("azo")

**通过class_name定位**

(取class的内容)

driver.find_element_by_class_name("android.widget.RelativeLayout")

**通过xpath定位**

(取xpath得内容)

driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.XXX")

**通过text定位**

(需要使用uiautomator的定位方式,使用text的内容)

driver.find_elements_by_android_uiautomator("new UiSelector().text(\"+关注\")")

使用这里需要注意一下,通过text定位的结果是个list,不能直接click。所以如果要点击需要取数组的值,比如下面是点击找到的第一个元素

driver.find_elements_by_android_uiautomator("new UiSelector().text(\"+关注\")")[0].click()

**通过css_selector定位(webview)**

只适用于webview的html页面,继承自webdriver,与pc版本的UI测试一致

driver.find_element_by_css_selector()

**通过link_text定位****(webview)**

只适用于webview容器中的html页面,继承自webdriver,与pc版本的UI测试一致

driver.find_element_by_link_text()

**通过name定位**

web view容器中的html页面可以用name定位,native并没有name属性

driver.find_element_by_name()

**2.定位元素的另一种写法:find_element(by,value)**

find_element_by_方式(value)实际调用的都是find_element(by,value)

需要导入这个包:from [selenium.webdriver.common.by](http://selenium.webdriver.common.by/) import By

例如:定位id为ag2的元素

方式一:driver.find_element_by_id("ag2**”**)

方式二:driver.find_element([By.ID](http://by.id/),"ag2")

这个操作的好处是可以直接把操作的by和value放到一个元组里,然后调用通用方法来传参获得元素结果

cateid=(By.ID,"ag2")

driver.find_element(*cateid).click()

**by的操作可以是:**

By.ID 相当于by_id

By.CLASS_NAME 相当于by_class_name

By.XPATH 相当于by_xpath

By.NAME 相当于by_name

By.TAG_NAME 相当于by_tag_name

By.CSS_SELECTOR 相当于by_css_selector

By.LINK_TEXT 相当于by_link_text

**3.find_elements_by_定位方式(value)返回元素数组**

用法与find_element_by_方式(value)一致,但是返回一个数组。可以通过数组的索引来访问具体的某个结果

例如:通过class_name定位到多个元素,我想点击第一个元素

driver.find_elements_by_class_name("android.widget.RelativeLayout**”**)[0].click()

**4.返回元素数组的另一种写法:****find_elements(by,value)**

用法与find_element(by,value)一致,但是返回一个数组。可以通过数组的索引来访问具体的某个结果

例如:通过class_name定位到多个元素,我想点击第一个元素

driver.find_elements(By.CLASS_NAME,"android.widget.RelativeLayout**”**)[0].click()

**5.通过元素定位元素**

可以先找到某个元素,然后再进一步定位元素

find_element_by_class_xpath(“xxx”).find_element_by_name(“yyy")

**三、元素操作**

找到元素后可以对元素进行的操作,例如上面讲的进一步定位元素

**1.click()**

//点击操作

也可以用tab实现点击操作

driver.find_element_by_id("com.wuba.zhuanzhuan:id/ae8").click()

**2.clear()**

//清空输入框内容

driver.find_element_by_id("com.wuba.zhuanzhuan:id/ij").clear()

**3.send(xx)**

//输入框内输入内容

driver.find_element_by_id("com.wuba.zhuanzhuan:id/ij").send_keys("test content")

**4.text**

//获得元素的text内容

print(driver.find_element_by_xpath(" //android.widget.LinearLayout[1]//xxx").text)

**四、触摸操作**

**1.driver.tap([坐标],持续点击时间)**

除了定位到元素的点击外,也可以通过tab实现坐标的点击

driver.tap(driver.tap([(216,1776)],2))

**2.TouchAction(driver)**

TouchAction对象包含(tab)、press(短按)、move_to(滑动到某个坐标)等方法

通过TouchAction对象,添加tap、move_to等操作,然后perform()执行,可以实现解锁屏幕等功能

规范中的可用事件有:

* 短按 (press)

* 释放 (release)

* 移动到 (moveTo)

* 点击 (tap)

* 等待 (wait)

* 长按 (longPress)

* 取消 (cancel)

* 执行 (perform)

![image](https://upload-images.jianshu.io/upload_images/4101794-b622598565fed405.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

例如:一个多次滑屏的例子:

action=TouchAction(driver)

action.press(x=220,y=700).move_to(x=840, y=700).move_to(x=220, y=1530).move_to(x=840, y=1530).release().perform()

可以通过wait()等待操作

**3.MultiAction()//**多点触控

通过MultiAction().add()添加多个TouchAction操作,最后调用perform()一起执行这些操作

action0 = TouchAction().tap(el)

action1 = TouchAction().tap(el)

MultiAction().add(action0).add(action1).perform()

**4.driver.swipe(x1, y1, x2, y2,duration) **

**//从坐标(x1,x2)滑动到坐标(x2,y2),duration非必填项,滑动时间**

(滑动的坐标不能超过屏幕的宽高)

可以通过【driver.get_window_size()】命令获得窗口高和宽,结果为{'width': 1080, 'height': 1776}

一个鼠标向上下左右活动的例子如下:

#获得屏幕大小宽和高

def getSize(driver):

x = driver.get_window_size()['width']

y = driver.get_window_size()['height']

return (x, y)

#屏幕向上滑动

def swipeUp(driver,t=1000):

l = getSize(driver)

x1 = int(l[0] * 0.5) #x坐标

y1 = int(l[1] * 0.75) #起始y坐标

y2 = int(l[1] * 0.25) #终点y坐标

driver.swipe(x1, y1, x1, y2,t)

#屏幕向下滑动

def swipeDown(driver,t=1000):

l = getSize(driver)

x1 = int(l[0] * 0.5) #x坐标

y1 = int(l[1] * 0.25) #起始y坐标

y2 = int(l[1] * 0.75) #终点y坐标

driver.swipe(x1, y1, x1, y2,t)

#屏幕向左滑动

def swipLeft(driver,t):

l=getSize(driver)

x1=int(l[0]*0.75)

y1=int(l[1]*0.5)

x2=int(l[0]*0.05)

driver.swipe(x1,y1,x2,y1,t)

#屏幕向右滑动

def swipRight(driver,t=1000):

l=getSize(driver)

x1=int(l[0]*0.05)

y1=int(l[1]*0.5)

x2=int(l[0]*0.75)

driver.swipe(x1,y1,x2,y1,t)

#调用向下滑动的方法

swipeDown(driver)

**五、系统按键事件**

** press_keycode(AndroidKeyCode)**//发送按键事件

例如:点击home键,home键的KeyCode是3

driver.press_keycode(3)

`键名 描述 键值

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`

更多KeyCode可以查看下面的博客:

[http://blog.csdn.net/crisschan/article/details/50419963](http://blog.csdn.net/crisschan/article/details/50419963)

**六、driver的一些比较重要操作**

**1.reset()**

//重置app

这时候driver会重置,相当于卸载重装应用。所以本地缓存会失效

driver.reset()

**2.start_activity(包名,activity名)**

//启动app的某一个activity

例如:driver.start_activity("com.wuba.zhuanzhuan","./presentation.view.activity.LaunchActivity")

启动一个activity,这个activity必须是AndroidManifest.xml中有intent-filter的activity

这种启动activity和driver的reset()不同的是

**3.contexts**

//获得所有contexts

driver.contexts

结果如下:

['NATIVE_APP', 'WEBVIEW_com.android.browser']

NATIVE_APP:native的context

WEBVIEW_com.android.browser:webview的context,存放html的容器

**4.current_context**

//查看当前的context

driver.current_context

**5.switch_to.context(context名)**

//切换context

driver.switch_to.context("WEBVIEW_com.wuba.zhuanzhuan")

NATIVE时不能定位WEBVIEW的内容,在WEBVIEW的context时不能定位NATIVE的内容。

所以需要切换到对应的context中去进行操作

**6.setNetworkConnection(bitmask掩码)**

//设置网络类型

例如:设置网络类型为只开wifi

driver.set_network_connection(2)

**网络的bitmask掩码如下:**

| 值 (别名) | 数据连接 | Wifi 连接 | 飞行模式 |

| ------------------ | ---- | ---- | ------------- |

| 0 (什么都没有) | 0 | 0 | 0 |

| 1 (飞行模式) | 0 | 0 | 1 |

| 2 (只有Wifi) | 0 | 1 | 0 |

| 4 (只有数据连接) | 1 | 0 | 0 |

| 6 (开启所有网络) | 1 | 1 | 0 |

**7.scroll(起始元素,结束元素)**

driver.scroll(origin_el,destination_el)

**8.获得当前页面的所有元素**

driver.page_source

这可以用来判断元素是否存在,例如**(**assert "发布成功" in driver.page_source)

**9.补充一些driver启动时可能用到的项**

其实这些在上一篇启动里都有介绍,但是有些可能大家没注意到的点再列一下。这些点也是我在测试中实际遇到的点

**autoLaunch :**Appium是否要自动启动或安装app,默认true

desired_caps['autoLaunch'] = 'false'

有的时候我不想让appium每次都启动app,想自己去启动activity,那这个项这时就可以起作用了

**noReset:**在会话前是否重置app状态。默认是false

desired_caps['noReset'] = 'true'

**newCommandTimeout:**设置未接收到新命令的超时时间,默认60s

如果60s内没有接收到新命令,appium会自动断开连接,如果我需要很长时间做driver之外的操作,可能延长接收新命令的超时时间

desired_caps["newCommandTimeout"]=1800

python android自动化元素定位_appium+python android元素定位相关推荐

  1. python自动化元素定位_Appium+Python自动化 4 -appium元素定位

    appium定位app上的元素方式 在前面文章中有介绍,(通过UIautomator工具查看app元素) appium定位app上的元素,可以通过id,name,class这些属性定位到 1.id 定 ...

  2. python+selenium自动化(四)__八大元素定位之class_name、tag_name、partial_link_text、css_selector

    selenium八大元素定位(二) 上节讲了4种定位ID.NAME.LINK_TEXT.XPATH,这节继续学习剩下的4种元素定位方式 1.通过class_name定位 我们需定位上图中的" ...

  3. 如何用python实现自动化_如何使用Python实现自动化水军评论

    前言 玩博客一个多月了,渐渐发现了一些有意思的事,经常会有人用同样的评论到处刷,不知道是为了加没什么用的积分,还是纯粹为了表达楼主好人.那么问题来了,这种无聊的事情当然最好能够自动化咯,自己也来试了一 ...

  4. python windows自动化 爬虫_使用Python实现自动化截取Windows系统屏幕

    文章首发于我的技术博客:你可以在上面看到更多的Python教程和python爬虫 自动化截屏有什么用呢?为什么要实现自动化截屏呢?其实,在某些特殊的场景下,记录电脑使用者的操作还是很有必要的.比如,银 ...

  5. 用python做自动化测试仪器_使用python进行windows自动化测试(1)

    最近开始学习整理python在windows自动化测试中的使用,觉得挺有意思的 主要思路,在windows下,主要通过启进程,然后查找进程的句柄,然后再操作这个句柄,包括点击,填写文字,关闭,获取文字 ...

  6. python 手机自动化_Win10 下python_appium的Android手机自动化环境搭建

    前提: 已经安装好了Java环境,且配置了环境变量 已经安装python3.8.2,已经安装pycham. 一.安装appium_client ,pycham中也需要安装 二.安装node.js(需要 ...

  7. python安卓自动化实现方法_uiautomator +python 实现安卓UI自动化

    简单实例 注:安卓6.0以上的手机不会自动安装app-uiautomator.apk和app-uiautomator-test.apk,需要手动安装,否则报错ioerror RPC server no ...

  8. android自动化测试之robotium初探(三),Android自动化测试之Robotium--基础操作.pdf

    Android自动化测试第五课 Android 自劢化测试乊Robotium --基础操作 Karen 微信公众号:gloryroadtrain ThreadingTest 技术支持Q群: 一群:33 ...

  9. python接口自动化(九)--python中字典和json的区别(详解)

    简介 这篇文章的由来是由于上一篇发送post请求的接口时候,参数传字典(dict)和json的缘故,因为python中,json和dict非常类似,都是key-value的形式,为啥还要这么传参,在群 ...

最新文章

  1. 职业生涯中12个愚蠢想法
  2. 局域网共享文件夹设置
  3. xStream:Security framework of XStream not initialized, XStream is probably vulnerable.
  4. LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图
  5. 大数乘法与大数加法 java实现
  6. 剑指offer_输入一个字符串,按字典序打印出该字符串中字符的所有排列
  7. Spring bean注入之constructor-arg注入和property注入的区别
  8. 【学习笔记】傅里叶变换: 方形函数,三角函数
  9. 交互式数据可视化_我如何构建一个交互式仪表板Web应用程序以可视化拳击数据...
  10. 从微软的万物互联到腾讯的三网:当今世界就是一台计算机!
  11. 014基于深度学习的脑电癫痫自动检测系统-2018(300引用)
  12. linux修改X2APIC参数,Linux 開機參數 intremap=no_x2apic_optout
  13. linux下github使用教程,Linux下git操作GitHub步骤教程
  14. OpenVPN 技术支持
  15. 3GPP TS 23501-g51 中英文对照 | 4.2.10 Architecture Reference Model for ATSSS Support
  16. 以太网通信(1)UDP —— 数据发送
  17. Windows下DOS进入指定路径
  18. 大学生闲置物品交易平台UML建模
  19. 计算几何——求圆台内切球体积最大值
  20. 小明买12瓶汽水,喝完后3个空瓶可以换1瓶汽水,问小明一共可以喝多少瓶汽水?

热门文章

  1. 【高手进阶】玩转示波器的触发设置
  2. layui tree支持搜索
  3. 7-3 最长公共前后缀
  4. 好看的悬疑电影,最好是高智商的
  5. Python软件编程等级考试三级——20210905
  6. C#人脸识别入门篇(Step by step 人脸识别)
  7. php 扫码入库软件下载,php简易扫码付教育收费系统
  8. 付宇泽20190919-4 单元测试,结对
  9. C#使用正则表达式验证电话号码、手机号、身份证号代码
  10. 使用ffmpeg分割视频