首页 > 其他分享 >11.Selenium【元素的定位】xpath表达式定位

11.Selenium【元素的定位】xpath表达式定位

时间:2023-01-17 09:56:28浏览次数:46  
标签:11 定位 span xpath driver element find

一、前言

我们上节课讲了css选择器定位元素,其实他和xpath定位类似,只是写法有所区别。selenium定位元素的方法有很多种,像是通过id、name、class_name、tag_name、link_text等等,但是这些方法局限性太大,拿id属性来说,首先一定不会每个元素都有id属性,其次元素的id属性也不一定是固定不变的。所以这些方法了解一下即可,我们真正需要熟练掌握的是通过xpath和css定位,一般只要掌握一种就可以应对大部分定位工作了,我们用的最多的就是xpath。

二、学习目标

1.xpath结合属性定位

2.xpath文本定位

3.xpath层级定位

4.xpath索引定位

5.xpath模糊匹配

三、知识点

符号说明:

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:

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

1.【xpath结合属性定位】

  • 语法:

    driver.find_element_by_xpath(".//input[@id='kw']")                  #单个属性定位
    driver.find_element_by_xpath(".//input[@id='kw' and @name='wd']")   #多个属性定位
    
  • 参数:

    [] :表示要根据属性找元素

    @ :后边跟属性的key,表示要通过哪个属性定位

  • 返回值:

    返回元素对象

  • 代码示例:

    # 导入webdriver
    from selenium import webdriver
    #获取驱动路径
    driver_path = './chromedriver.exe'
    #创建一个浏览器对象
    driver = webdriver.Chrome(executable_path=driver_path)
    #设置全屏
    driver.maximize_window()
    #请求某个url
    driver.get('https://www.baidu.com/')
    
    #xpath结合属性定位
    element_input1 = driver.find_element_by_xpath(".//input[@id='kw']")
    element_input2 = driver.find_element_by_xpath(".//input[@id='kw' and @name='wd']")
    print(element_input1)
    print(element_input2)
    

2.【xpath文本定位】

说明:标签文本是><直接的字符串,他不是键值对!!!

  • 语法:

    driver.find_element_by_xpath(".//a[text()='新闻']") 
    
  • 参数:

    [] :表示要根据属性找元素

    text() :获取文本(注意没有指定属性@)

  • 返回值:

    返回元素对象

  • 代码示例:

    # 导入webdriver
    from selenium import webdriver
    #获取驱动路径
    driver_path = './chromedriver.exe'
    #创建一个浏览器对象
    driver = webdriver.Chrome(executable_path=driver_path)
    #设置全屏
    driver.maximize_window()
    #请求某个url
    driver.get('https://www.baidu.com/')
    
    #xpath文本定位
    element_input = driver.find_element_by_xpath(".//a[text()='新闻']")
    print(element_input)
    

3.【xpath层级定位】

我们在做项目的时候,需要定位的元素没有像id,name,class这种基本属性,但是相邻的标签中有,我们可以先定位到相邻标签,然后通过层级关系来定位我们要定位的元素。

  • 语法:

    element_input1 = driver.find_element_by_xpath(".//form[@id='form']/span/input")                     #由上到下的层级关系
    element_input2 = driver.find_element_by_xpath(".//input[@class='s_ipt']/parent::span")              #父子元素定位
    element_input3 = driver.find_element_by_xpath(".//input[@class='s_ipt']//preceding-sibling::span")  #哥哥元素定位
    element_input4 = driver.find_element_by_xpath(".//input[@class='s_ipt']//following-sibling::span")  #弟弟元素定位
    
  • 参数:

    parent::span :向父级定位,父级的标签名为span

    preceding-sibling::span :向哥哥级定位,哥哥级的标签名为span

    following-sibling::span :向弟弟级定位,弟弟级的标签名为span

  • 返回值:

    返回元素对象

  • 代码示例:

    # 导入webdriver
    from selenium import webdriver
    #获取驱动路径
    driver_path = './chromedriver.exe'
    #创建一个浏览器对象
    driver = webdriver.Chrome(executable_path=driver_path)
    #设置全屏
    driver.maximize_window()
    #请求某个url
    driver.get('https://www.baidu.com/')
    
    #xpath层级定位
    element_input1 = driver.find_element_by_xpath(".//form[@id='form']/span/input")                     #由上到下的层级关系
    element_input2 = driver.find_element_by_xpath(".//input[@class='s_ipt']/parent::span")              #父子元素定位
    element_input3 = driver.find_element_by_xpath(".//input[@class='s_ipt']//preceding-sibling::span")  #哥哥元素定位
    element_input4 = driver.find_element_by_xpath(".//input[@class='s_ipt']//following-sibling::span")  #弟弟元素定位
    print(element_input1)
    print(element_input2)
    print(element_input3)
    print(element_input4)
    

4.【xpath索引定位】

  • 语法:

    driver.find_element_by_xpath(".//div[@id='s-top-left']/a[1]")                     #根据索引选择标签
    driver.find_element_by_xpath(".//div[@id='s-top-left']/a[last()]")                #最后一个标签
    driver.find_element_by_xpath(".//div[@id='s-top-left']/a[last()-1]")              #倒数第二个标签
    
  • 参数:

    1 :指同名标签的第一个标签

    last() :指同名标签的最后一个标签

    last()-1 :指同名标签的倒数第二个标签

  • 返回值:

    返回元素对象

  • 代码示例:

    # 导入webdriver
    from selenium import webdriver
    #获取驱动路径
    driver_path = './chromedriver.exe'
    #创建一个浏览器对象
    driver = webdriver.Chrome(executable_path=driver_path)
    #设置全屏
    driver.maximize_window()
    #请求某个url
    driver.get('https://www.baidu.com/')
    
    #xpath索引定位
    element_input1 = driver.find_element_by_xpath(".//div[@id='s-top-left']/a[1]")                     #根据索引选择标签
    element_input2 = driver.find_element_by_xpath(".//div[@id='s-top-left']/a[last()]")                #最后一个标签
    element_input3 = driver.find_element_by_xpath(".//div[@id='s-top-left']/a[last()-1]")              #倒数第二个标签
    print(element_input1)
    print(element_input2)
    print(element_input3)
    

5.【xpath模糊匹配】

  • 语法:

    driver.find_element_by_xpath(".//span[start-with(@class, 'soutu-hover')]")  #匹配开头
    driver.find_element_by_xpath(".//span[ends-with(@class, 'hover-tip')]")     #匹配结尾,注:ends-with是xpath2.0的语法,可能你的浏览器还只支持1.0的语法
    driver.find_element_by_xpath(".//span[contains(text(), '图片')]")            #包含匹配
    
  • 参数:

    start-with():匹配开头部分字符

    ends-with():匹配结尾部分字符

    contains():包含匹配部分字符

  • 返回值:

    返回元素对象

  • 代码示例:

    # 导入webdriver
    from selenium import webdriver
    #获取驱动路径
    driver_path = './chromedriver.exe'
    #创建一个浏览器对象
    driver = webdriver.Chrome(executable_path=driver_path)
    #设置全屏
    driver.maximize_window()
    #请求某个url
    driver.get('https://www.baidu.com/')
    
    #xpath模糊定位
    element_input1 = driver.find_element_by_xpath(".//span[start-with(@class, 'soutu-hover')]")  #匹配开头
    element_input2 = driver.find_element_by_xpath(".//span[ends-with(@class, 'hover-tip')]")     #匹配结尾
    element_input3 = driver.find_element_by_xpath(".//span[contains(text(), '图片')]")            #包含匹配
    print(element_input1)
    print(element_input2)
    print(element_input3)
    

标签:11,定位,span,xpath,driver,element,find
From: https://www.cnblogs.com/ckxingchen/p/17057032.html

相关文章

  • 4.Selenium【元素的定位】id属性定位
    一、前言前面的小节中我们学习了如何针对页面进行自动化操作,从这节课开始,我们学习如何操作页面中的元素(按钮,输入框等)。如果有操作一个元素,必须分为两步:(1)定位元素信息,返回......
  • 5.Selenium【元素的定位】name属性定位
    一、前言上节课介绍了如何通过标签的id属性来定位,同样,如果标签中有name属性,我们也可以通过name属性来定位元素。二、学习目标1.通过name属性定位元素三、知识点1.【通......
  • 6.Selenium【元素的定位】class属性定位
    一、前言除了id和name以外,class通常也会存在于标签属性中,我们同样可以通过标签的class属性来定位元素。但是要注意的是,class属性的值一般在页面中不是唯一的,我们如果要定......
  • 7.Selenium【元素的定位】标签名定位
    一、前言与class属性一样,标签名同样不是唯一的,我们在使用标签名定位时,前提是已经知道当前页面中只有这一个该名字的标签,不能用重名的。二、学习目标1.通过标签名定位元......
  • CSS定位
     1.相对定位position:relative;相对于原来的位置进行指定的偏移,相对定位,它仍然在标准文档流中!原来的位置会被保留top:-20px;left:20px;bottom:-10px;right:20px; <......
  • C++11 智能指针 shared_ptr
    C++11智能指针shared_ptrWrittenon2023-01-16std::shared_ptr<T>共享智能指针,也被称为计数智能指针。共享智能指针会记录有多少个共享智能指针指向同一个对象,当......
  • keychron K3 键盘和 Windows11 操作系统的笔记本电脑通过蓝牙配对出现问题的解决方案
    最近一直使用良好的keychronk3键盘,忽然出现了一些问题。我用的是Windows11操作系统。keychronk3采用蓝牙模式连接。能够成功配对,但Connected状态只能持续1秒钟,随......
  • 230116_50_SpringBoot入门
    指定自定义的配置文件bill.propertiesbill.properitesname=billage=11happy=falsebirth=2021/12/2通过@PropertySource注解指定自定义的配置文件@PropertyS......
  • 算法学习笔记(11): 原根
    原根此文相对困难,请读者酌情食用在定义原根之前,我们先定义其他的一点东西阶通俗一点来说,对于\(a\)在模\(p\)意义下的阶就是\(a^x\equiv1\pmodp\)的最小正......
  • 手写笔记11:谈谈ArrayList?
    ......