首页 > 其他分享 >Selenium4自动化测试4--元素定位By.XPATH,元素定位最佳顺序

Selenium4自动化测试4--元素定位By.XPATH,元素定位最佳顺序

时间:2024-05-10 13:00:12浏览次数:20  
标签:XPATH 定位 XPath 元素 driver element

7-通过xpath定位,By.XPATH

     xpath是什么?XPath 是一门在 XML 文档中查找信息的语言xml是什么?XML(可扩展标记语言),主要用于传输数据为什么可以使用xpath定位html?

XPath(XML路径语言)是一种用于在XML文档中定位元素的语言,它可以用于定位HTML文档中的元素。尽管XML和HTML是两种不同的标记语言,但HTML文档实际上可以视为XML文档的一种特定形式。

HTML文档的结构和标签嵌套遵循XML的基本规则,因此XPath可以有效地用于在HTML文档中定位元素。XPath通过使用元素的标签名、属性、层级关系等来指定元素的位置,从而实现定位。

XPath定位HTML元素的基本原则是,将HTML文档视为XML文档,并使用XPath表达式来描述元素的位置关系。XPath表达式可以使用标签名、属性、父子关系、索引等来选择特定的元素或元素集合。

      Xpath可以通过相对路径与绝对路径去定位元素,绝对路径从 HTML 根节点开始算,相对路径从任意节点开始。

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 指定浏览器的位置,解决浏览器驱动和浏览器版本不匹配的问题
chrome_location = r'D:\pythonProject2023\SeleniumFirst\chrome-win64\chrome.exe'
options = webdriver.ChromeOptions()
options.binary_location = chrome_location
driver = webdriver.Chrome(options=options)
driver.get('https://www.baidu.com')
# 绝对路径定位 定位百度首页的新闻
driver.find_element(By.XPATH, '/html/body/div/div/div[3]/a').click()

#相对路径定位
# 使用id属性定位
driver.get('https://www.baidu.com')
driver.find_element(By.XPATH, '//input[@id="kw"]').send_keys("万笑佛博客园").click()

# 使用class属性定位
driver.get('https://www.baidu.com')
# class中间有空格,需要全部写上
driver.find_element(By.XPATH, '//a[@class="mnav c-font-normal c-color-t"]').send_keys("万笑佛博客园").click()

# 根据name属性定位
driver.get('https://www.baidu.com')
driver.find_element(By.XPATH, '//input[@name="wd"]').send_keys("万笑佛博客园").click()

# 多个属性组合定位 支持and or
driver.get('https://www.baidu.com')
driver.find_element(By.XPATH, '//input[@name="wd" and @class="s_ipt"]').send_keys("万笑佛博客园").click()

# 多组数据使用下标定位
driver.get('https://www.baidu.com')
# 定位百度首页地图
driver.find_element(By.XPATH, '//div[@id="s-top-left"]/a[3]').send_keys("万笑佛博客园").click()

# 由子元素定位父元素
driver.get('https://www.baidu.com')
# 定位输入框的父元素
driver.find_element(By.XPATH, '//input[@id="kw"]/..')

# 根据文本内容定位
driver.get('https://www.baidu.com')
# 定位百度首页网盘
driver.find_element(By.XPATH, '//a[contains(text(),"网盘")]')

# 其它定位方式,轴定位
driver.get('https://www.baidu.com')
# 最后一个子元素,last()
driver.find_element(By.XPATH, '//a[@class="mnav c-font-normal c-color-t"][last()]')

# 动态ID
#https://element.eleme.cn/#/zh-CN/component/cascader
driver.find_element(By.XPATH, '//span[text() = "默认 click 触发子菜单"]/following-sibling::div/div/input')




time.sleep(3)

 

四、元素定位最佳顺序

1-ID(唯一标识):如果元素具有唯一的ID属性,优先使用ID进行定位,因为它是最快和最可靠的定位方式。

2-CSS选择器:如果元素没有唯一的ID,可以考虑使用CSS选择器进行定位。CSS选择器具有灵活的语法,并且在性能上通常比XPath更高效。

3-类名(class):如果元素没有唯一的ID或合适的CSS选择器,可以使用元素的类名进行定位。尽量选择具有明确含义的类名,并避免选择过于通用的类名。

4-Name属性:如果元素具有唯一的name属性,可以使用name属性进行定位。但要注意,name属性并不是所有元素都具有的,所以不是一种通用的定位方式。

5-XPath:如果前面的方式都无法定位元素,可以使用XPath进行定位。XPath提供了强大的定位功能,但在性能上相对较低,因为XPath需要遍历整个文档,直到找到匹配的元素。暂无性能对比数据,我觉得好用就用,及时行乐。

6-标签名(TagName):如果元素无法使用上述方式进行定位,可以考虑使用标签名进行定位。但要注意,标签名定位方式通常会返回多个匹配的元素,需要结合其他条件来缩小范围。

元素定位建议

1-在定位列表的元素时,尽量根据文本信息定位而不是下标(比如百度首页的左上角,可能顺序会打乱,后台配置)

2-相对定位时,尽量选择不易改变的元素作为锚点,比如拥有id的元素或者一个目录。比如后台管理系统中的主菜单,比如H5页面的tab

3-如果关系好,可以让开发多加一些id,不要勉强。现在的前端开发都用的框架,html,css,js等都是由框架定义的了。

 

标签:XPATH,定位,XPath,元素,driver,element
From: https://www.cnblogs.com/yclh/p/18184096

相关文章

  • 347. 前 K 个高频元素
    给你一个整数数组nums和一个整数k,请你返回其中出现频率前k高的元素。你可以按任意顺序返回答案。示例1:输入:nums=[1,1,1,2,2,3],k=2输出:[1,2]示例2:输入:nums=[1],k=1输出:[1]classSolution{public:vector<int>topKFrequent(vector<int......
  • 代码随想录算法训练营第第二天 | 977.有序数组的平方 、27. 移除元素
    977.有序数组的平方题目建议:本题关键在于理解双指针思想题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep/***@param{number[]}nu......
  • 215. 数组中的第K个最大元素
    给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。你必须设计并实现时间复杂度为O(n)的算法解决此问题。示例1:输入:[3,2,1,5,6,4],k=2输出:5示例2:输入:[3,2,3,1,2,4,5,5,6......
  • C++ 数组元素操作
    数组元素的移除核心思路:创建一个新的内存空间存储移除后的数组,再将原数组delete释放,再将指针指向新数组。cout<<"-----------------------------数组元素的移除-------------------------"<<endl;//cout<<deleteArrByIndex(0,arr11)<<endl;//示例数组int*p......
  • TLP元素与PCIE数据流
    不同于并行总线,PCIe这样的串行总线不使用总线上的控制信号来表示某时刻链路上正在发生什么。相反地,PCIe链路上的发送方发出的比特流必须要有一个预期的大小,还要有一个可供接收方辨认的格式,这样接收方才能理解比特流的内容。此外,PCIe在传输数据包时并不使用任何直接握手机制(imme......
  • 多数元素
    publicintMajorityElement(int[]nums){Dictionary<int,int>dic=newDictionary<int,int>();foreach(intnuminnums){if(!dic.ContainsKey(num)){dic.A......
  • 代码随想录算法训练营第第一天 | 704. 二分查找 、27. 移除元素
    704、二分查找题目链接:https://leetcode.cn/problems/binary-search/文章讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715`varsearch=function(nums,target){letleft=0;letright=nums.length;letmi......
  • 34. 在排序数组中查找元素的第一个和最后一个位置
    给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你必须设计并实现时间复杂度为O(logn)的算法解决此问题。示例1:输入:nums=[5,7,7,8,8,10],target=8......
  • 代码随想录算法训练营第一天 | 704.二分查找 27.移除元素
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/文档讲解:https://programmercarl.com/0704.二分查找.html视频讲解:https://www.bilibili.com/video/BV1fA4y1o715左闭右开时间复杂度O(logn)空间复杂度O(1)classSolution{public:intsearch(......
  • Selenium4自动化测试2--元素定位By.ID,By.CLASS_NAME,By.TAG_NAME
    三、元素定位方式1-通过id定位,By.IDid属性在HTML中是唯一的,因此使用id定位可以确保找到页面上唯一的元素。由于id是唯一的,浏览器在查找元素时可以快速定位到目标元素,提高了定位的效率。 importtime#pipinstallseleniumfromseleniumimportwebdriverfromselenium......