一、常用识别元素的工具

uiautomator:Android SDK自带的一个工具,在tools目录下
monitor:Android SDK自带的一个工具,在tools目录下
Appium Inspector:Appium自带的一个功能,只有mac下可以使用该功能

二、元素定位

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")

print('=========定位多个包含‘测试账号’的元素,取第一个===========')
driver.find_elements_by_xpath("//*[contains(@text, '测试账号')]")[0].click()
print('===========直接定位包含‘测试账号’的元素==========')
driver.find_element_by_xpath("//*[contains(@text, '静雅课堂')]").click()print('===========获取页面内指定元素的总数,并点击最后一个===========')
arr = driver.find_elements_by_xpath("//*[contains(@resource-id, 'com.tencent.mm:id/oe')]")
arr[arr.__len__() - 1].click()

通过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 import By

例如:定位id为ag2的元素
方式一:driver.find_element_by_id("ag2)
方式二:driver.find_element(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")

selenium 通过文字定位元素

全部文字:
java:driver.findElement(By.xpath("//*[text()=’文字’]");
python:browser.find_element_by_xpath("//*[text()='文字']").click()
部分文字:
java:driver.findElement(By.xpath("//a[contains(text(), ’文字’)]");
python:browser.find_element_by_xpath("//*[contains(text(),'文字')]").click()

三、元素操作

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

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)

例如:一个多次滑屏的例子:
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

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

1.reset()
//重置app,这时候driver会重置,相当于卸载重装应用。所有本地缓存会失效
driver.reset()

2.start_activity(包名,activity名)
//启动app的某一个activity
例如:driver.start_activity("com.wuba.zhuanzhuan","./presentation.view.activity.LaunchActivity")

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

==================================================

常用补充:

time.sleep(8)#休眠8秒

Android定位元素与操作相关推荐

  1. 【移动测试Android】元素定位|基本操作|手势操作

    [移动测试Android]元素定位|一些基本操作 元素定位 元素定位工具 UIAutomatorView appium desktop inspector weditor 基本操作 基础api 输入文 ...

  2. python android自动化元素定位_linux下Appium+Python移动应用自动化测试实战---3.手把手教你定位元素编写测试用例...

    linux下Appium+Python移动应用自动化测试实战-3.手把手教你定位元素编写测试用例 前言 有很多童鞋环境搭建好了却没有进行下一步,是因为缺少step by step的资料. 互联网上ap ...

  3. 自动化无法定位的原因_Appium Android 自动化测试 -- 元素定位

    自动化测试元素定位是难点之一,编写脚本时会经常卡在元素定位这里,有时一个元素能捣鼓一天,到最后还是定位不到. Appium 定位方式和 selenium 一脉相承,selenium 中的定位方式App ...

  4. python android自动化元素定位_appium+python android元素定位

    image ## text属性的方法 `driver.find_element_by_android_uiautomator(``'new UiSelector().text("Custom ...

  5. 相对定位android,appium相对位置定位元素----父节点/兄弟节点定位

    appium相对位置定位元素----父节点/兄弟节点定位 发布时间:2020-06-30 05:51:41 来源:51CTO 阅读:5620 作者:niedongri 讲一下定位手机app上元素时定位 ...

  6. [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. android 获取元素的下标_Appium中定位方式by_android_uiautomator

    在appium定位方式中可以通过by_android_uiautomator方法定位元素. 基本语法:driver.find_element_by_android_uiautomator(" ...

  8. [python爬虫] Selenium常见元素定位方法和操作的学习介绍(转载)

    转载地址:[python爬虫] Selenium常见元素定位方法和操作的学习介绍 一. 定位元素方法 官网地址:http://selenium-python.readthedocs.org/locat ...

  9. android界面元素识别,Android 10不能使用uiautomatorviewer定位元素的终极解决方法

    Android app 元素定位除了使用Appium Inspector 外,还可以使用Android SDK 里tools中的uiautomatorviewer 工具.但今天打算使用 uiautom ...

最新文章

  1. 2020 AI前沿交流大会 | 聚焦CV/NLP最新学术及工业界实践
  2. 免费教材丨第48期:业界大牛中文教学视频《深度学习:进阶》第25-28讲
  3. 上周新闻回顾:Vista麻烦不断 Office波澜再起(2.26-3.4)
  4. Apache多站点设定
  5. SCCM 2012 Part 2 部署前AD准备
  6. Windows上部署Ngnix
  7. PyTorch基础-使用卷积神经网络CNN实现手写数据集识别-07
  8. 正确关闭WCF代理对象
  9. w ndows7端口在哪里,win7电脑遇到端口被占用的情况该如何查看并将其关闭
  10. Linux将数据从小存储通过FTP发送到大存储中
  11. 卷积神经网络CNN:Tensorflow实现(以及对卷积特征的可视化)
  12. html转邮件html格式转换,如何把电子邮件格式改成HTML格式
  13. Linux交换分区 swap分区
  14. 厦大C语言上机 1360 算日期
  15. micropython移植教程_移植MicroPython到NUCLEO_L476RG开发板
  16. python + opencv 创建简单渐变色
  17. 自动抓取app数据的攻与防
  18. python calu_Python中*args,**kwargs的使用
  19. 极客 android,一款开源的Android极客应用(来一起学习kotlin)
  20. 1分钟让别人喜欢你(三)

热门文章

  1. Android开源项目汇总【转】
  2. AutoCAD快速入门(十四):夹点编辑
  3. MySQL调优系列:慢查询记录
  4. 最近淘宝联盟出cpc广告,如何通过审核呢?
  5. jira 切换 语言_JIRA中的标记语言的语法参考
  6. 使用PyCharm批量爬取小说
  7. warning: NUL character seen; rest of line ignored *** missing separator. Stop.
  8. RT系统+STM32+SYN8266播报+红外定时器
  9. 机械臂颜色识别案例 | 路上捡到一台机械臂,给它点颜色瞧瞧?
  10. 5-33 有理数加法