appium--元素定位

简介: appium--元素定位

前戏


appium的元素定位方式有:id、name、class、相对定位、Xpath定位、List定位、Uiautomator定位

 

send_keys()传入中文时需要在capability中配置如下内容

desired_caps['unicodeKeyboard']='True'

desired_caps['resetKeyboard']='True'

如果不加这两行,有中文的时候就输入不了

有时候加了这两行,输入中文时会出现乱码,是因为输入法的原因

使用appium做了输入操作之后,如果出现输入法无法唤起,可以在系统设置---语言和输入法---将当前的输入法替换为系统输入法或者其他输入法


id定位


id定位是我们最常用的定位方式,通过find_element_by_id()来定位,打开Uiautomator,resource-id的值就是id

代码实战

import pytest
from appium import webdriver
class Testcsca():
    def setup(self):
        caps = {}
        caps["platformName"] = "Android"
        # caps["deviceName"] = "127.0.0.1:62001"
        caps["deviceName"] = "CLB0219314000452"
        caps["appPackage"] = "com.jgw.csca"
        caps["appActivity"] = "com.jgw.csca.view.activity.LoginActivity"
        caps["platfromVersion"] = "9.0.0"
        caps["autoGrantPermissions"] = True  # 设置自动授权权限
        caps['unicodeKeyboard'] = True  # 输入中文时要加,要不然输入不了中文
        caps['resetKeyboard'] = True  # 输入中文时要加,要不然输入不了中文
        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(20)
    def test_login(self):
        self.driver.find_element_by_id('com.jgw.csca:id/et_name').send_keys('zouzou')
        self.driver.find_element_by_id('com.jgw.csca:id/et_pwd').send_keys('666')

 

name定位


name定位

根据name进行定位,对于android来说,就是text属性

driver.find_element_by_name('登录').click()

self.driver.find_element_by_name('登录').click()  # 这样会报错

由于text稳定性不是很好,所以appium1.5开始废弃了该方法,虽然这种方法不可用,但我们可以通过xpath来定位

self.driver.find_element_by_xpath("//*[contains(@text,'登录')]").click()  # 这样就可以正常点击了


class定位


classname定位是根据元素类型来进行定位,但是实际情况中很多元素的classname都是相同的,有多个只能定位到第一个输入框

import pytest
from appium import webdriver
class Testcsca():
    def setup(self):
        caps = {}
        caps["platformName"] = "Android"
        # caps["deviceName"] = "127.0.0.1:62001"
        caps["deviceName"] = "CLB0219314000452"
        caps["appPackage"] = "com.jgw.csca"
        caps["appActivity"] = "com.jgw.csca.view.activity.LoginActivity"
        caps["platfromVersion"] = "9.0.0"
        caps["autoGrantPermissions"] = True  # 设置自动授权权限
        caps['unicodeKeyboard'] = True  # 输入中文时要加,要不然输入不了中文
        caps['resetKeyboard'] = True  # 输入中文时要加,要不然输入不了中文
        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(20)
    def test_login(self):
        # 这样定位到的是输入框
        self.driver.find_element_by_class_name('android.widget.EditText').send_keys('111')
        # find_elements 定位多个元素,[1] 获取第二个元素,从0开始
        self.driver.find_elements_by_class_name('android.widget.EditText')[1].send_keys('222')


相对定位


相对定位是先找到该元素的有对应属性的父元素节点,然后基于父元素进行元素定位

 

Xpath定位


xpath定位是一种路径定位方式,主要是依赖于元素绝对路径或者相关属性来定位,但是绝对路径xpath执行效率比较低,一般使用比较少,通常使用xpath相对路径和属性定位

http://www.w3school.com.cn/xpath/xpath_syntax.asp

xpath路径表达式

contains(@resource-id,'user') 一部分就行

/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
nodename 选取此节点的所有子节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点

 

import pytest
from appium import webdriver
class Testcsca():
    def setup(self):
        caps = {}
        caps["platformName"] = "Android"
        # caps["deviceName"] = "127.0.0.1:62001"
        caps["deviceName"] = "CLB0219314000452"
        caps["appPackage"] = "com.jgw.csca"
        caps["appActivity"] = "com.jgw.csca.view.activity.LoginActivity"
        caps["platfromVersion"] = "9.0.0"
        caps["autoGrantPermissions"] = True  # 设置自动授权权限
        caps['unicodeKeyboard'] = True  # 输入中文时要加,要不然输入不了中文
        caps['resetKeyboard'] = True  # 输入中文时要加,要不然输入不了中文
        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(20)
    def test_login(self):
        # 没有contains时,属性和值之间用=
        self.driver.find_element_by_xpath('//*[@text="请输入用户名"]').send_keys('balabala')
        self.driver.find_element_by_xpath('//*[@resource-id="com.jgw.csca:id/et_pwd"]').send_keys('123456')
        # 有contains时,属性和值之间用,中间可以用and
        self.driver.find_element_by_xpath('//*[contains(@text,"登录") and contains(@index,"5")]').click()


List定位


List定位首先是使用find_elements_by_XX获取一组相同属性的元素,然后使用数组下标来区分标记不同元素进行相关操作。下标从0开始

self.driver.find_element_by_id('com.tal.csca:id/login_register_text').click()
self.driver.find_element_by_id('com.tal.csca:id/activity_register_userheader').click()
image = self.driver.find_elements_by_id('com.tal.csca:id/item_image')
image[7].click()
self.driver.find_element_by_id("com.tal.kaoyan:id/save").click()

 

点击头像这里的图片都是一个id,所以先定位到id,存放到一个列表里面,然后根据下标来确定


Uiautomator定位


Uiautomator元素定位是Android系统原生支持的定位方式,虽然与xpath相似,但是比它更好用,且支持元素的全部属性定位。定位原理是通过Android自带的Android Uiautomator的类库去查找元素。Appium元素定位方法其实也是基于Uiautomator来进行封装的

常用的定位方式有:

id:对应Android属性的resource_id

text:对应安卓的text

classname:Android属性的class

import pytest
from appium import webdriver
class Testcsca():
    def setup(self):
        caps = {}
        caps["platformName"] = "Android"
        # caps["deviceName"] = "127.0.0.1:62001"
        caps["deviceName"] = "CLB0219314000452"
        caps["appPackage"] = "com.jgw.csca"
        caps["appActivity"] = "com.jgw.csca.view.activity.LoginActivity"
        caps["platfromVersion"] = "9.0.0"
        caps["autoGrantPermissions"] = True  # 设置自动授权权限
        caps['unicodeKeyboard'] = True  # 输入中文时要加,要不然输入不了中文
        caps['resetKeyboard'] = True  # 输入中文时要加,要不然输入不了中文
        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(20)
    def test_login(self):
        # 根据text定位
        self.driver.find_element_by_android_uiautomator('new UiSelector().text("请输入用户名")').send_keys('666')
        # 根据id定位
        self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.jgw.csca:id/et_pwd")').send_keys('balabala')
        # 根据class定位
        self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button")').click()

相关文章
|
6月前
|
XML Java 测试技术
『App自动化测试之Appium应用篇』| 元素定位工具Appium-Inspector从简介、安装、配置到使用的完整攻略
『App自动化测试之Appium应用篇』| 元素定位工具Appium-Inspector从简介、安装、配置到使用的完整攻略
778 3
|
6月前
|
XML 测试技术 开发工具
『App自动化测试之Appium应用篇』| 元素定位工具uiautomatorviewer从简介、特点、启动到使用的完整过程
『App自动化测试之Appium应用篇』| 元素定位工具uiautomatorviewer从简介、特点、启动到使用的完整过程
231 4
|
6月前
|
移动开发 安全 测试技术
『App自动化测试之Appium应用篇』| 继承于selenium常用的元素定位方法有哪些?如何使用?
『App自动化测试之Appium应用篇』| 继承于selenium常用的元素定位方法有哪些?如何使用?
198 0
|
测试技术 Android开发 Python
|
Java 测试技术 API
Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解
Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解
244 0
Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解
|
测试技术 Android开发
Appium自动化(9) - appium元素定位的快速入门
Appium自动化(9) - appium元素定位的快速入门
175 0
Appium自动化(9) - appium元素定位的快速入门
|
开发框架 测试技术 索引
Python+Appium自动化测试(5)-appium元素定位常用方法(二)
appium继承了selenium框架中webdriver提供的元素定位方法,接下介绍几种常用的方法。
Python+Appium自动化测试(5)-appium元素定位常用方法(二)
|
测试技术 开发工具 Android开发
Python+Appium自动化测试(5)-appium元素定位常用方法(一)
对于Android而言,查找appUI界面元素属性的工具有三种:appium desktop,uiautomatorviewer.bat,weditor。之前已经介绍过了weditor的使用,这里我将通过使用uiautomatorview工具查看元素的属性值,来介绍Android app通过appium进行元素定位常用的几种方法。
Python+Appium自动化测试(5)-appium元素定位常用方法(一)
|
Android开发
Appium之主要的元素定位疑点难点
参考资料:Mushishi_xu - 博客园 http://www.cnblogs.com/Mushishi_xu/default.html?page=2 前言 测试APP时,有时候会遇到上下左右滑动的界面、遇到native 和 webview 切换的界面、弹框界面、元素坐标定位等等情况。
2772 0