Appium(四)常用的8种元素定位方式之 xpath、List、UIAutomator 定位

2021年9月19日 3点热度 0条评论 来源: 披挂出征

接上一篇:https://blog.csdn.net/xiao66guo/article/details/98736536

5、xpath 定位

         xpath 定位其实就是一中路径定位方式,它主要是依赖于元素的绝对路径或者一些相关属性来进行定位的,但是绝对路径 xpath 的执行效率比较低(尤其是当元素路径比较深的时候),一般使用的比较少。通常使用的是 xpath 的相对路径和属性定位。

         在xpath中,有 7 中类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或成为根节点)。    

5.1  xpath 的路径表达式

表达式 描述
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不用考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
nodename 选取此节点的所有子节点
@ 选取属性

5.2  xpath 通配符

通配符 描述
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点

5.3  xpath 语法参考

xpath 语法与教程参考

5.4  xpath 案例:

使用 xpath 定位元素来进行登录操作

from capability import *

driver.find_element_by_xpath('//android.widget.EditText[@text="手机号/email"]').clear()
driver.find_element_by_xpath('//android.widget.EditText[@text="手机号/email"]').send_keys('手机号/邮箱')
driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="1"]').send_keys('密码')
driver.find_element_by_xpath('//*[@class="android.widget.CheckBox"]').click()
driver.find_element_by_xpath('//*[@class="android.widget.TextView" and @index="2"]').click()

6、List 定位

       List 定位首先是使用 find_elements_by_XX 来获取一组相同的class属性的元素,而后在使用数组下标来区分表级不同元素进行相关的操作。

  • List 定位综合案例

启动 豌豆荚app ,进入登录页面输入用户名和密码后进行用户头像更新

  • 测试场景
  1. 启动豌豆荚app
  2. 点击左上角主菜单导航—>管理—>右上角 设置
  3. 点击登录,进入到登录页面
  4. 输入用户名、密码并点击页面下方同意复选框,点击登录
  5. 点击头像—>账号管理—>再次点击头像—>修改个人资料
  6. 点击头像—>选择 从图库中选择—>进入图库—>选择头像
  7. 点击保存按钮进行保存操作
  • wdj_list.py
// capability 的文件内容可以看上一篇文章哈

from capability import driver
// 登录
def login():
    // 点击左上角的主菜单导航按钮
    driver.find_element_by_id('com.wandoujia.phoenix2:id/w4').click()
    driver.implicitly_wait(1)

    // 点击
    driver.find_element_by_id('com.wandoujia.phoenix2:id/pp_item_setting').click()

    // 点击又上角的设置按钮
    driver.find_element_by_id('com.wandoujia.phoenix2:id/ow').click()
    
    // xpath 定位
    driver.find_element_by_id('com.wandoujia.phoenix2:id/l_').clear()
    driver.find_element_by_xpath('//android.widget.EditText[@text="手机号/email"]').send_keys('2932104943@qq.com')
    driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="1"]').send_keys('2932104943qq')
    driver.find_element_by_xpath('//*[@class="android.widget.CheckBox"]').click()
    driver.find_element_by_xpath('//*[@class="android.widget.TextView" and @index="2"]').click()

// 更换头像
def revise_user_photo():
    // 点击头像——>账号管理
    driver.find_element_by_id("com.wandoujia.phoenix2:id/nr").click()
    // 点击头像——>修改个人资料
    driver.find_element_by_id("com.wandoujia.phoenix2:id/ll").click()
    // 点击头像——>选择头像列表
    driver.find_element_by_id("com.wandoujia.phoenix2:id/ll").click()
    // 点击从图片库中选择
    driver.find_element_by_xpath('//*[@class="android.widget.TextView" and @index="1"]').click()
    /* 在图库中选择图片     
        List定位:
        一定注意,这里选择是的 find_elements_by_id ,element 后面有一个 s 代表有多个的意思    
    */
    items_list = driver.find_elements_by_id('com.android.documentsui:id/icon_thumb')
    items_list[0].click()
    driver.implicitly_wait(1)
    // 点击保存
    driver.find_element_by_class_name('android.widget.Button').click()

if __name__ == '__main__':
    login()
    revise_user_photo()
  • List 定位综合案例效果图

  • 遇到的问题

selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the 
given search parameters.

# 解决方法,就是检查下元素的 id 值有没有写错

7、UIAutomator 定位

      UIAutomator 元素定位就是 Android 系统原生的定位方式,看起来和 xpath 很类似,但比起它更加好用,且还支持元素全部属性定位,它的这个定位是通过 Android 自带的 Android uiatuomator 的类库去查找元素的。Appium 元素定位的方法其实也是基于 UIAutomator 来进行封装的。

      使用的方法: find_element_by_android_uiautomator() 可以运用UIAutomator 元素定位。

  • UIAutomator 定位的方式:

  1. id 定位
  2. text 定位
  3. class name 定位

①   id 定位:是根据元素的 resource-id 属性来进行定位的,使用 UiSelector().resourceId() 这个方法即可实现

from capability import *
/*
   使用UIAutomator中的 id 定位方式
*/
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/w5")').click()
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/pp_item_setting")').click()
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/ow")').click()

②  text 定位:是根据元素的 text 属性值来进行定位的,使用 new UiSelector() 即可实现

/*
   使用UIAutomator中的 id 定位方式,先清除输入框中内容
*/
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/l_")').clear()

/*
   使用UIAutomator中的 text 定位方式
*/
driver.find_element_by_android_uiautomator('new UiSelector().text("手机号/email")').send_keys('手机号或者邮箱')

③  class name 定位:与 Appium class 定位方式一样,都是根据元素的 class 属性值来进行定位的

driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/la")').send_keys('2932104943qq')
/*
   使用UIAutomator中的 class name 定位方式
*/
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.CheckBox")').click()
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.wandoujia.phoenix2:id/mf")').click()

8、H5元素定位需要等下哈

 

 

    原文作者:披挂出征
    原文地址: https://blog.csdn.net/xiao66guo/article/details/99303335
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。