Appium(六):元素定位
1. 元素定位
对于自动化测试来说,核心技能就是对象的定位了。不管是web页面上的按钮或输入框,还是移动app上的一个按钮或输入框,我们要想对其进行点击或输入操作,前提是要先找到这个对象。
webdriver提供了八种元素定位的方法:
- id
- name
- class name
- tag name
- link text
- partial link text
- xpath
- css selector
在python语言中对应的定位方法如下:
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
一组元素定位的方法如下:
find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()
Appium完全继承了WebDriver中所定义的这些方法,除此之外对其进行了扩展,以便适合移动端对象的定位与操作。
由Mobile JSON Wire Protocol协议中定义的方法,更适合移动设备上的控件定位。
- ios uiautomation:一个递归的、对应使用UIAutomation library搜索元素的字符串(IOS-only)。
- android uiautomator:一个递归的、对应使用UIAutomation Api搜索元素的字符串(Android-only)。
- accessibility id:一个递归的、对应本地Accessibility选项实现的Id/Name进行元素搜索的字符串。
对于python来说,在WebDriver的方法的基础上增加了下列方法:
find_element_by_accessibility_id()
find_elements_by_accessibility_id()
find_element_by_android_uiautomator()
find_elements_by_android_uiautomator()
但是我们对照查询到的元素,可以发现很多的定位方法无法实现。
点击审查元素,发现根本就没有name什么的,最多的还是class、id元素。
所以我们只需要学习id、class、xpath定位就可以完成定位元素的目的了。
1.1 id定位
经过我几次测试,发现app的id值有两个属性可以表示,分别是id和resource-id。
如果id只有一个,那么就使用find_element_by_id来查询。
# coding:utf-8
import time
from appium import webdriver # 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
# com.tencent.mobileqq
#界面名
desired_caps['appActivity'] = '.Settings' # 启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) driver.find_element_by_id('com.android.settings:id/search').click() time.sleep(5) driver.quit()
启动这个程序,我们可以看到点击了搜索按钮,进入了搜索界面。
而id值不是每个元素都会显示的,而resource-id可以查询到,但是在大多数时候resource-id是一系列元素的id,所以我们需要使用find_elements_by_id方法来查询id。
# coding:utf-8
import time
from appium import webdriver # 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
# com.tencent.mobileqq
#界面名
desired_caps['appActivity'] = '.Settings'
# 启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) titles = driver.find_elements_by_id("com.android.settings:id/title")
for title in titles:
print(title.text) time.sleep(5) driver.quit()
1.2 class定位
class一般都不止一个,所以应该需要遍历一遍得到的元素,然后缩小搜索条件来获得目标元素。
我们可以借助python中的pop()方法确定想要这一组元素中的第几个,并对它进行点击或输入操作。
pop(0) 或pop(-1):默认获得一组元素中的最后一个。
pop(n):获得一组元素中的第n-1个。
一个class元素,使用find_element_by_class_name来查询。
# coding:utf-8
import time
from appium import webdriver # 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
# com.tencent.mobileqq
#界面名
desired_caps['appActivity'] = '.Settings' # 启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) driver.find_element_by_id('com.android.settings:id/search').click()
driver.find_element_by_class_name("android.widget.EditText").send_keys("hello") time.sleep(5) driver.quit()
可以看到点击搜索按钮后出现后,在输入框输入了hello。
如果class元素有很多,就可以使用find_elements_by_class_name来查询。
# coding:utf-8
import time
from appium import webdriver # 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings' # 启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) text_views = driver.find_elements_by_class_name("android.widget.TextView")
for text_view in text_views:
print(text_view.text) time.sleep(5) driver.quit()
1.3 xpath
在webdriver上xpath定位是功能强大的一种定位方式。我个人惯用于此方法来定位web页面上的元素。但是在android上要定位的是控件,而非页面元素,xpath定位的写法也会有所不同。
# coding:utf-8
import time
from appium import webdriver # 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
# com.tencent.mobileqq
#界面名
desired_caps['appActivity'] = '.Settings' # 启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
driver.implicitly_wait(5)#隐式等待,下一章会讲解
driver.find_element_by_id("com.android.settings:id/search").click()
driver.find_element_by_class_name("android.widget.EditText").send_keys("hello")
driver.find_element_by_xpath("//*[@content-desc='收起']").click() time.sleep(5) driver.quit()
就目前而言吧,我觉得appium的xpath定位很不好使用,可能是因为还不够熟练的原因吧。
# coding:utf-8
import time
from appium import webdriver # 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
# com.tencent.mobileqq
#界面名
desired_caps['appActivity'] = '.Settings' # 启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) elements = driver.find_elements_by_xpath("//*[contains(@text,'设')]")
for element in elements:
print(element.text) time.sleep(5) driver.quit()
和webdriver一样,如果使用find_element_by_xx方法,如果传入一个没有的特征,会报NoSuchElementException的错误。如果使用find_elements_by_xx方法,如果传入一个没有的特征,不会报错,会返回一个空列表。
Appium(六):元素定位的更多相关文章
- 初探appium之元素定位(1)
无论是selenium还是appium,元素定位都是我们开始实现自动化面临的第一个问题.selenium还好,我们可以在浏览器的调试页面进行元素定位还是蛮方便的.那么appium怎么做呢? 我看到很多 ...
- Appium Android 元素定位方法 原生+H5
APPIUM Android 定位方式 1.定位元素应用元素 1.1通过id定位元素 Android里面定位的id一般为resrouce-id: 代码可以这样写: WebElement eleme ...
- Appium Desktop 元素定位和脚本录制功能
Appium Desktop除了可以做Server之外还可以进行元素定位和脚本录制功能,点击放大镜按钮,进入页面设置.开始配置Desired Capabilities. 配置Desired Capab ...
- Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解
如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 前面介绍过根据id,clas ...
- Appium + Python -------------元素定位
说在前面 1.https://github.com/appium/python-client/tree/master/test 里面有一些test ,可以看看,研究研究 2.学会使用 uiautom ...
- appium xpath元素定位
1.id定位 写法:driver.find_element_by_id("这里是resource-id") 2.name定位 name定位就是通过UI Automator工具查看的 ...
- Appium+Python 自动化-appium常用元素定位方法
https://www.cnblogs.com/rabbit-testing/p/8042733.html 大牛 https://blog.csdn.net/kaka1121/article/deta ...
- 【APP自动化】Appium Android 元素定位方法 原生+H5
参考资料: http://blog.csdn.net/vivian_ljx/article/details/54410024
- Appium学习笔记4_元素定位方法
Appium之元素定位,如果对Android上如何使用工具获取页面元素有问题的,请转战到这:http://www.cnblogs.com/taoSir/p/4816382.html. 下面主要是针对自 ...
- Python+Appium自动化测试(5)-appium元素定位常用方法
对于Android而言,查找appUI界面元素属性的工具有三种:appium desktop,uiautomatorviewer.bat,weditor.之前已经介绍过了weditor的使用,这里我将 ...
随机推荐
- HttpClientFactory 日志不好用,自己扩展一个?
前言 .NetCore2.1新推出HttpClientFactory工厂类, 替代了早期的HttpClient, 并新增了弹性Http调用机制 (集成Policy组件). 替换的初衷还是简单说下: ① ...
- JavaScript---1.计算机的编程基础
学习内容:编程语言.计算机基础 1编程语言 程序员通过编程语言来控制计算机 编程语言:机器语言(计算机只认识机器语言).汇编语言(直接对硬件操作,指令采用英文缩写的标识符,容易记忆).高级语言(C\C ...
- CCNA 之 四 管理和配置CISCO设备
管理和配置CISCO设备 路由器组件 cpu 执行操作系统的指令 随机访问存储器RAM - RAM中内容断电丢失 - 运行操作系统: - 运行配置文件: - IP 路由表: - ARP 缓存; - 数 ...
- java 数组注意细节,例子解析
1. int x[]; 或int [] x; 此时却无物理的存在数组.需:数组名= new 数组元素类型[size]: a = new int [10]; 2. 不能使用任何未初始化的数组. 默认的初 ...
- 特殊权限set_uid、set_gid、stick_bit、软链接、硬链接文件 使用介绍
第2周第4次课(3月29日) 课程内容:2.18 特殊权限set_uid2.19 特殊权限set_gid2.20 特殊权限stick_bit2.21 软链接文件2.22 硬链接文件 2.18 ...
- Nginx安装、默认虚拟主机、Nginx用户认证和域名重定向
6月7日任务 12.6 Nginx安装12.7 默认虚拟主机12.8 Nginx用户认证12.9 Nginx域名重定向 扩展nginx.conf 配置详解 http://www.ha97.com/51 ...
- netty的调优-及-献上写过注释的源码工程
Netty能干什么? Http服务器 使用Netty可以编写一个 Http服务器, 就像tomcat那样,能接受用户发送的http请求, , 只不过没有实现Servelt规范, 但是它也能解析携带的参 ...
- Python异常处理与上下文管理器
Python异常处理 异常与错误 错误 可以通过IDE或者解释器给出提示的错误opentxt('a.jpg','r') 语法层面没有问题,但是自己代码的逻辑有问题if age>18: print ...
- 使用modelarts部署bert命名实体识别模型
模型部署介绍 当我们通过深度学习完成模型训练后,有时希望能将模型落地于生产,能开发API接口被终端调用,这就涉及了模型的部署工作.Modelarts支持对tensorflow,mxnet,pytorc ...
- Reveal分析工具的使用
首先:在reveal官网http://revealapp.com/下载适用版本.试用版本是30天免费,可以选择破解.破解链接http://pan.baidu.com/s/1bnc5wwn?errno= ...