selenium元素定位总结 - xpath定位高级用法

文章目录

  • 1.8种元素定位方法
  • 2.xpath定位的高级用法
    • 1. 绝对路径
    • 2.相对路径
    • 3. 索引定位
    • 4.使用XPATH的属性值定位元素
    • 5.使用XPATH的属性名称定位元素
    • 6.使用任意值来匹配属性及元素
    • 7.使用模糊的属性值匹配
      • starts-with()
      • ends-with()
      • contains()
      • text()
      • last()
    • 8.过虑某个元素
      • name()
    • 9.常用函数
      • parent 选取当前节点的父节点
      • ancestor 选取当前节点的所有先辈(父、祖父等)
      • descendant选取当前节点的所有后代元素(子、孙等)
      • descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身
      • preceding 选取文档中当前节点的开始标签之前的所有节点
      • preceding-sibling选取当前节点之前的所有同级节点
      • following 选取文档中当前节点的结束标签之后的所有节点(包括自己及自己的后代元素
      • following-sibling选取当前节点之后的所有同级节点
  • 3.xpath定位实例

1.8种元素定位方法

  • find_element_by_id:通过ID进行匹配查找,只返回匹配到的一个元素

  • find_element_by_name:通过name进行匹配查找,只返回匹配到的一个元素

  • find_element_by_xpath:通过xpath进行匹配查找,只返回匹配到的一个元素

  • find_element_by_link_text:通过链接内容进行匹配查找,只返回匹配到的一个元素

  • find_element_by_partical_link_text:通过部分链接内容进行匹配查找,只返回匹配到的一个元素

  • find_element_by_tag_name:通过标签名称进行匹配查找,只返回匹配到的一个元素

  • find_element_by_class_name:通过class名称进行匹配查找,只返回匹配到的一个元素

  • find_element_by_css_selector:通过CSS选择器进行匹配查找,只返回匹配到的一个元素

2.xpath定位的高级用法

表达式 描述
/ 从根节点选取,也就是当前节点的最顶层(默认情况下当前节点是 html 最顶层,若从某元素开始,当前节点为此元素)
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
. . 选取当前节点的父节点
@ 选取属性

1. 绝对路径

以 “/” 开头, 让xpath 从文档的根节点开始解析

driver.find_element_by_xpath(“html/body/div/form/input”)

2.相对路径

以"//" 开头, 让xpath 从文档的任何元素节点开始解析(也就是说每个节点都作为起点找一下

driver.find_element_by_xpath(“html/body/div/form/input”)

3. 索引定位

driver.find_element_by_xpath(“//input[1]”)

4.使用XPATH的属性值定位元素

driver.find_element_by_xpath(“//input[@id=‘username’]”)
driver.find_element_by_xpath(“//input[@type=‘submit’][@name=‘sub1’]”)
driver.find_element_by_xpath(“//input[@type=‘submit’ and @name=‘sub1’]”)
driver.find_element_by_xpath(“//input[@type=‘submit’ or @name=‘sub1’]”)

5.使用XPATH的属性名称定位元素

查找所有input标签中含有type属性的元素
driver.find_element_by_xpath(“//input[@type]”)
查找所有a标签中含有onclick属性的元素
driver.find_element_by_xpath(“//a[@onclick]”)

6.使用任意值来匹配属性及元素

匹配所有input元素中含有属性的值为readonly的元素
driver.find_element_by_xpath(“//input[@*=‘readonly’]”))

7.使用模糊的属性值匹配

starts-with()

匹配一个属性开始位置的关键字,是模糊定位的一种。

匹配id以submit开头的元素,如:id=‘submit’
driver.find_element_by_xpath(“//input[starts-with(@id,‘submit’)]”)

ends-with()

匹配一个属性结束位置的关键字,是模糊定位的一种。

匹配id以submit结尾的元素,如:id=‘submit’
driver.find_element_by_xpath(“//input[ends-with(@id,‘submit’)]”)

contains()

匹配一个属性值中包含的字符串,也是模糊定位的一种。

匹配id中含有submit的元素,如:id=‘submit’
driver.find_element_by_xpath(“//input[contains(@id,‘submit’)]”)

匹配name属性中包含na关键字的页面元素
driver.find_element_by_xpath(“//input[contains(@name,‘na’)]”)

text()

根据文本信息匹配元素位置。

表示div元素->form元素->input元素的最后一个子元素,得到id值为e2的E元素
driver.find_element_by_xpath(“//div[@class=‘class3’][contains(text(),‘div2’)]/…/text()”)

last()

函数位置定位。

表示div元素->form元素->input元素的最后一个子元素,得到id值为e2的E元素
driver.find_element_by_xpath(“/div/form/input[last()]”)

8.过虑某个元素

name()

获取标签名称。

表示过虑掉在 div id='query_reulst_box' 的下的 style 标签和 meta 标签
driver.find_element_by_xpath("//div[@id='query_reulst_box']/*[not(name()='style' and name()='meta')]//text())

9.常用函数

parent 选取当前节点的父节点

//*[@id=“content_views”]/p[51]/span[1]/parent::p

ancestor 选取当前节点的所有先辈(父、祖父等)

//*[@id=“content_views”]/p[51]/span[1]/ancestor-or-self::div

descendant选取当前节点的所有后代元素(子、孙等)

//*[@id=“content_views”]/descendant::span

descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身

//*[@id=“content_views”]/p[51]/descendant-or-self::p

preceding 选取文档中当前节点的开始标签之前的所有节点

//*[@id=“content_views”]/p[51]/preceding::p

preceding-sibling选取当前节点之前的所有同级节点

//*[@id=“content_views”]/p[51]/span[2]/preceding-sibling::span

following 选取文档中当前节点的结束标签之后的所有节点(包括自己及自己的后代元素

//*[@id=“content_views”]/p[51]/following::p

following-sibling选取当前节点之后的所有同级节点

//*[@id=“content_views”]/p[51]/span[2]/following-sibling::span

3.xpath定位实例

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上课啦title>
head>
<body>
<p id="abc">浔阳江头夜送客,枫叶荻花秋瑟瑟1p>
<p id="abd">浔阳江头夜送客,枫叶荻花秋瑟瑟2p>
<input name="a1">
<div>
    <select>
        <option>主人下马客在船,举酒欲饮无管弦option>
        <option>醉不成欢惨将别,别时茫茫江浸月option>
        <option>忽闻水上琵琶声,主人忘归客不发option>
    select>
div>
<a href="http://www.baidu.com">访问百度a>
<span>君既为府吏,守节情不移span>
<span class="a2">鸡鸣入机织,夜夜不得息span>
<div>
    <table>
        <tr>
            <td>
                头上玳瑁光,腰若流纨素
            td>
        tr>
        <tr>
            <td>
                出师未捷身先死,长使英雄泪满襟
            td>
        tr>
    table>
div>
body>
html>


# -*- coding: utf-8 -*-
# @project : day5
# @author: lw
# @file: study.py
# @ide: PyCharm
# @time: 2021/8/1 19:30
import time

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager

service = ChromeService(executable_path=ChromeDriverManager().install())

driver = webdriver.Chrome(service=service)
fileHtml1 = "file:///Users/liwei/Downloads/%E8%85%BE%E8%AE%AF%E8%AF%BE%E5%A0%8237-38%E6%9C%9F2020-7-8/day2/test.html"
driver.get(fileHtml1)

element_absolute = driver.find_elements("xpath", "/html/body/p")
print("Xpath 绝对径定位: ")
for element in element_absolute:
    print(element.text)

print("================================================")
print("Xpath 相对路径定位: ")
element_xiangdui = driver.find_elements("xpath", "//body/p")
for element in element_xiangdui:
    print(element.text)

print("================================================")
print("Xpath 索引定位: ")
element_index = driver.find_elements("xpath","//*[@id][2]")
for element in element_index:
    print(element.text)


print("================================================")
print("XPATH的属性名称元素: ")
element_attribute = driver.find_elements("xpath", "//*[@id]")
for element in element_attribute:
    print(element.text)

print("================================================")
print("XPATH的属性值定位元素: ")
element_attributeValue = driver.find_elements("xpath", "//*[@id='abc']")
for element in element_attributeValue:
    print(element.text)

print("================================================")
print("使用任意值来匹配属性及元素: ")
element_any = driver.find_elements("xpath", "//*[@*='a2']")
for element in element_any:
    print(element.text)

print("================================================")
print("使用模糊的属性值匹配: ")
element_starts = driver.find_elements("xpath", "//*[starts-with(@id,'a')]")
# end是新语法不是所有浏览器都支持
# element_ends = driver.find_elements("xpath", "//*[ends-with(@id,'d')]")
element_contains = driver.find_elements("xpath", "//*[contains(@id,'a')]")

for element in element_starts:
    print("starts-with(@id,'a')" + element.text)

# for element in element_ends:
#     print("ends-with(@id,'d')" + element.text)

for element in element_contains:
    print("contains(@id,'a')" + element.text)


print("================================================")
print("根据文本信息匹配元素位置: ")
element_text = driver.find_element("xpath", "//*[text()='访问百度']")
print(element_text.text)

print("================================================")
print("last()元素位置: ")
element_last = driver.find_element("xpath", "//*[@id][last()]")
print(element_last.text)

print("================================================")
print("name函数: ")
element_name = driver.find_elements("xpath","//*[not (name()='p' or name()='div')]//*[name()='select']")
for element in element_name:
    print(element.text)

print("================================================")
print("常见位置函数: ")
element_parent = driver.find_element("xpath", "//*[@id]/parent::body")
print("parent"+element_parent.tag_name)
element_ancestor = driver.find_element("xpath", "//td/ancestor::tbody")
print("ancestor"+element_ancestor.tag_name)
element_descendant = driver.find_element("xpath", "//div[1]/descendant::option")
print("element_descendant" + element_descendant.text)

'''
//div[1]/descendant::option[3]/preceding::option
//div[1]/descendant::option[3]/preceding-sibling::option
//div[1]/descendant::option[1]/following::option
//div[1]/descendant::option[1]/following-sibling::option

'''

driver.quit()

Xpath 绝对径定位:
浔阳江头夜送客,枫叶荻花秋瑟瑟1
浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
Xpath 相对路径定位:
浔阳江头夜送客,枫叶荻花秋瑟瑟1
浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
Xpath 索引定位:
浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
XPATH的属性名称元素:
浔阳江头夜送客,枫叶荻花秋瑟瑟1
浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
XPATH的属性值定位元素:
浔阳江头夜送客,枫叶荻花秋瑟瑟1
================================================
使用任意值来匹配属性及元素:
鸡鸣入机织,夜夜不得息
================================================
使用模糊的属性值匹配:
starts-with(@id,‘a’)浔阳江头夜送客,枫叶荻花秋瑟瑟1
starts-with(@id,‘a’)浔阳江头夜送客,枫叶荻花秋瑟瑟2
contains(@id,‘a’)浔阳江头夜送客,枫叶荻花秋瑟瑟1
contains(@id,‘a’)浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
根据文本信息匹配元素位置:
访问百度
================================================
last()元素位置:
浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
name函数:
主人下马客在船,举酒欲饮无管弦
醉不成欢惨将别,别时茫茫江浸月
忽闻水上琵琶声,主人忘归客不发
================================================
常见位置函数:
parentbody
ancestortbody
element_descendant主人下马客在船,举酒欲饮无管弦

Process finished with exit code 0

你可能感兴趣的:(selenium,selenium,测试工具)