Selenium的八种定位方式

1. 通过 ID 定位

ID 是最直接和高效的方式来定位元素,因为每个页面中的 ID 应该是唯一的。

from selenium import webdriver

driver = webdriver.Chrome(executable_path='path/to/chromedriver')
driver.get('https://example.com')

# 通过 ID 定位
element = driver.find_element(by=By.ID, value='element_id')
print(element.text)

2. 通过 Name 定位

Name 属性也可以用来定位元素,特别是在表单中非常有用。

# 通过 Name 定位
element = driver.find_element(by=By.NAME, value='element_name')
print(element.text)

3. 通过 Class Name 定位

Class 名称通常用于样式和脚本中,也可以用来定位元素。注意,一个页面中可能有多个元素共享同一个 class 名称。

# 通过 Class Name 定位
element = driver.find_element(by=By.CLASS_NAME, value='element_class')
print(element.text)

4. 通过 Tag Name 定位

Tag Name 可以用来定位特定类型的 HTML 元素。

# 通过 Tag Name 定位
element = driver.find_element(by=By.TAG_NAME, value='div')
print(element.text)

5. 通过 Link Text 定位

Link Text 用于定位包含特定文本的链接。

# 通过 Link Text 定位
element = driver.find_element(by=By.LINK_TEXT, value='Link Text')
print(element.text)

6. 通过 Partial Link Text 定位

Partial Link Text 用于定位包含部分特定文本的链接。

# 通过 Partial Link Text 定位
element = driver.find_element(by=By.PARTIAL_LINK_TEXT, value='Part of Link Text')
print(element.text)

7. 通过 XPath 定位

XPath 是一种强大的定位方式,可以用来定位页面上的任何元素,特别是当其他方法不够灵活时。

# 通过 XPath 定位
element = driver.find_element(by=By.XPATH, value='//input[@id="element_id"]')
print(element.text)

8. 通过 CSS Selector 定位

CSS 选择器是一种非常灵活的方式,可以用来定位页面上的任何元素。

# 通过 CSS Selector 定位
element = driver.find_element(by=By.CSS_SELECTOR, value='#element_id')
print(element.text)

9.注意事项

  • 多元素定位:上述方法都返回单个元素。如果你想找到所有匹配的元素,可以使用 find_elements 方法。
  • 等待时间:有时候页面加载较慢,元素可能还没有完全加载出来。在这种情况下,可以使用显式等待或隐式等待来确保元素已经准备好。

1--显式等待示例

 
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 显式等待直到某个条件满足
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'element_id'))
)
print(element.text)

2--隐式等待示例

# 设置隐式等待时间
driver.implicitly_wait(10)  # 单位为秒

# 然后继续你的操作
element = driver.find_element(by=By.ID, value='element_id')
print(element.text)

 

 

10.定位的简单使用

# 元素定位
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

# 获取浏览器实例
# 获取谷歌浏览器的驱动
webObj = webdriver.Edge()

baiDuUrl ="https://www.baidu.com/"
# 打开百度
webObj.get(baiDuUrl)

time.sleep(5)

# 通过id定位
findElementById = webObj.find_element(By.ID, "kw")

print("获取元素的父元素")
print(findElementById.parent)

# 通过CSS选择器定位
# 使用class选择器
findELementByCssSelectorClass =  webObj.find_element(By.CSS_SELECTOR,".s-p-top")
# 获取元素的位置
print("获取元素的位置信息")
print(findELementByCssSelectorClass.location)
#  使用id选择器
fintELementByCssSelectId = webObj.find_element(By.CSS_SELECTOR,"#result_logo")
# 获取元素的文本
print(fintELementByCssSelectId.text)


# 通过name定位‘
# 使用name属性定位
findElementByName = webObj.find_element(By.NAME,"tn")
# 输入元素的文本
print(findElementByName.text)


# 通过class定位
# 使用 class和findElements获取元素
findElementByClasss = webObj.find_elements(By.CLASS_NAME,"rsv_pq")
# 循环遍历输出这些元素
print("-----------------------------------------")
for element in findElementByClasss:
    print(element.text)

print("-----------------------------------------")


# 使用Link Text定位
# LinkText这个是精准定位
print("# LinkText这个是模糊定位")
settingInfo =  webObj.find_element(By.LINK_TEXT,"新闻")
print("获取元素的文本信息",settingInfo.text)
# 使用PartialLinkText定位
print("# PartialLinkText这个是模糊定位")
settingInfo2 = webObj.find_element(By.PARTIAL_LINK_TEXT,"贴")
print("获取元素的文本信息",settingInfo2.text)


# 通过xpath定位
# 使用class定位
print("使用xpath定位百度的换一换")
findElementByXpath = webObj.find_element(By.XPATH, "//*[@id='hotsearch-refresh-btn']/span")
print("获取元素的文本信息",findElementByXpath.text)

time.sleep(10)

 

效果图

bc605ccf98884a1498abb6b845c65c26.png

2e3fff3dc3e74ab9928b2ca773189cd9.png

11.xpath的语法

基本语法

  1. 1--绝对路径:从根节点开始,使用 /

    /html/body/div
  2. 2--相对路径:从当前节点开始,使用 //

    //div

节点选择

  1. 1--选择特定标签名的节点

    //tag_name
  2. 2--选择具有特定属性的节点

    //tag_name[@attribute_name='value']
  3. 3--选择具有多个属性的节点

    //tag_name[@attribute_name1='value1' and @attribute_name2='value2']
  4. 4--选择包含特定文本的节点

    //tag_name[text()='text_value']
  5. 5--选择包含部分文本的节点

    //tag_name[contains(text(), 'partial_text')]
  6. 6--选择包含部分属性值的节点

    //tag_name[contains(@attribute_name, 'partial_value')]

节点轴

  1. 1--选择子节点

    //parent_tag/child_tag
  2. 2--选择任意后代节点

    //ancestor_tag//descendant_tag
  3. 3--选择父节点

    //child_tag/..
  4. 4--选择兄弟节点

    • 1----下一个兄弟节点:

      //current_tag/following-sibling::next_tag
    • 2----上一个兄弟节点:

      //current_tag/preceding-sibling::prev_tag

节点位置

  1. 1--选择第一个节点

    //tag_name[1]
  2. 2--选择最后一个节点

    //tag_name[last()]
  3. 3--选择倒数第二个节点

    //tag_name[last()-1]
  4. 4--选择前两个节点

    //tag_name[position() <= 2]
  5. 5--选择奇数位置的节点

    //tag_name[position() mod 2 = 1]

组合表达式

  1. 1--选择多个条件的节点

    //tag_name[@attribute_name='value1' or @attribute_name='value2']
  2. 2--选择多个路径的节点

    //tag_name1 | //tag_name2

示例

假设我们有一个简单的 HTML 页面:

<!DOCTYPE html>
<html>
<head>
    <title>Example Page</title>
</head>
<body>
    <h1>Welcome to Example Page</h1>
    <p id="intro">This is an example paragraph.</p>
    <form>
        <label for="username">Username:</label>
        <input type="text" id="username" name="username">
        <label for="password">Password:</label>
        <input type="password" id="password" name="password">
        <button type="submit">Login</button>
    </form>
</body>
</html>

常见 XPath 表达式示例

  1. 1--通过 ID 定位

    //*[@id='username']
  2. 2--通过标签名和属性定位

    //input[@type='text']
  3. 3--通过标签名和多个属性定位

    //input[@type='text' and @name='username']
  4. 4--通过文本内容定位

    //button[text()='Login']
  5. 5--通过包含部分文本的属性定位

    //input[contains(@name, 'user')]
  6. 6--通过父节点定位子节点

    //form/input[@name='username']
  7. 7--通过索引定位

    //form/input[1]
  8. 8--通过任意层级的后代节点定位

    //form//input[@name='password']

 

 

12.css选择器定位

基本语法

  1. 1--选择特定标签名的节点

    tag_name
  2. 2--选择具有特定类名的节点

    .class_name
  3. 3--选择具有特定 ID 的节点

    #id_name
  4. 4--选择具有特定属性的节点

    [attribute_name]
  5. 5--选择具有特定属性值的节点

    [attribute_name='value']
  6. 6--选择包含部分属性值的节点

    [attribute_name*='value']
  7. 7--选择以特定值开头的属性值的节点

    [attribute_name^='value']
  8. 8--选择以特定值结尾的属性值的节点

    [attribute_name$='value']

组合选择器

  1. 1--选择后代节点

    ancestor_selector descendant_selector
  2. 2--选择子节点

    parent_selector > child_selector
  3. 3--选择相邻兄弟节点

    previous_sibling_selector + next_sibling_selector
  4. 4--选择一般兄弟节点

    previous_sibling_selector ~ next_sibling_selector

伪类选择器

  1. 1--选择第一个子节点

    :first-child
  2. 2--选择最后一个子节点

    :last-child
  3. 3--选择第 n 个子节点

    :nth-child(n)
  4. 4--选择第 n 个类型节点

    :nth-of-type(n)
  5. 5--选择包含特定文本的节点

    :contains('text')

示例代码

假设我们有一个简单的 HTML 页面:

<!DOCTYPE html>
<html>
<head>
    <title>Example Page</title>
</head>
<body>
    <h1>Welcome to Example Page</h1>
    <p id="intro">This is an example paragraph.</p>
    <form>
        <label for="username">Username:</label>
        <input type="text" id="username" name="username">
        <label for="password">Password:</label>
        <input type="password" id="password" name="password">
        <button type="submit">Login</button>
    </form>
</body>
</html>

常见 CSS 选择器示例

  1. 1--通过 ID 定位

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome(executable_path='path/to/chromedriver')
    driver.get('https://example.com')
    
    # 通过 ID 定位
    element = driver.find_element(by=By.CSS_SELECTOR, value='#username')
    print(element.get_attribute('name'))  # 输出: username
  2. 2--通过类名定位

    # 通过类名定位
    element = driver.find_element(by=By.CSS_SELECTOR, value='.class_name')
    print(element.text)
  3. 3--通过标签名和属性定位

    # 通过标签名和属性定位
    element = driver.find_element(by=By.CSS_SELECTOR, value='input[type="text"]')
    print(element.get_attribute('id'))  # 输出: username
  4. 4--通过标签名和多个属性定位

    # 通过标签名和多个属性定位
    element = driver.find_element(by=By.CSS_SELECTOR, value='input[type="text"][name="username"]')
    print(element.get_attribute('id'))  # 输出: username
  5. 5--通过包含部分属性值的节点定位

    # 通过包含部分属性值的节点定位
    element = driver.find_element(by=By.CSS_SELECTOR, value='input[name*="user"]')
    print(element.get_attribute('id'))  # 输出: username
  6. 6--通过父节点定位子节点

    # 通过父节点定位子节点
    element = driver.find_element(by=By.CSS_SELECTOR, value='form > input[name="username"]')
    print(element.get_attribute('id'))  # 输出: username
  7. 7--通过索引定位

    # 通过索引定位
    element = driver.find_element(by=By.CSS_SELECTOR, value='form input:nth-of-type(1)')
    print(element.get_attribute('id'))  # 输出: username
  8. 8--通过文本内容定位

    # 通过文本内容定位
    element = driver.find_element(by=By.CSS_SELECTOR, value='button:contains("Login")')
    print(element.text)  # 输出: Login

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922734.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL底层概述—1.InnoDB内存结构

大纲 1.InnoDB引擎架构 2.Buffer Pool 3.Page管理机制之Page页分类 4.Page管理机制之Page页管理 5.Change Buffer 6.Log Buffer 1.InnoDB引擎架构 (1)InnoDB引擎架构图 (2)InnoDB内存结构 (1)InnoDB引擎架构图 下面是InnoDB引擎架构图&#xff0c;主要分为内存结构和磁…

丹摩|丹摩智算平台深度评测

1. 丹摩智算平台介绍 随着人工智能和大数据技术的快速发展&#xff0c;越来越多的智能计算平台涌现&#xff0c;为科研工作者和开发者提供高性能计算资源。丹摩智算平台作为其中的一员&#xff0c;定位于智能计算服务的提供者&#xff0c;支持从数据处理到模型训练的全流程操作…

基于企业微信客户端设计一个文件下载与预览系统

在企业内部沟通与协作中&#xff0c;文件分享和管理是不可或缺的一部分。企业微信&#xff08;WeCom&#xff09;作为一款广泛应用于企业的沟通工具&#xff0c;提供了丰富的API接口和功能&#xff0c;帮助企业进行高效的团队协作。然而&#xff0c;随着文件交换和协作的日益增…

LLM的原理理解6-10:6、前馈步骤7、使用向量运算进行前馈网络的推理8、注意力层和前馈层有不同的功能9、语言模型的训练方式10、GPT-3的惊人性能

目录 LLM的原理理解6-10: 6、前馈步骤 7、使用向量运算进行前馈网络的推理 8、注意力层和前馈层有不同的功能 注意力:特征提取 前馈层:数据库 9、语言模型的训练方式 10、GPT-3的惊人性能 一个原因是规模 大模型GPT-1。它使用了768维的词向量,共有12层,总共有1.…

大模型系列11-ray

大模型系列11-ray PlasmaPlasmaStore启动监听处理请求 ProcessMessagePlasmaCreateRequest请求PlasmaCreateRetryRequest请求PlasmaGetRequest请求PlasmaReleaseRequestPlasmaDeleteRequestPlasmaSealRequest ObjectLifecycleManagerGetObjectSealObject ObjectStoreRunnerPlas…

开源动态表单form-create-designer 扩展个性化配置的最佳实践教程

在开源低代码表单设计器 form-create-designer 的右侧配置面板里&#xff0c;field 映射规则为开发者提供了强大的工具去自定义和增强组件及表单配置的显示方式。通过这些规则&#xff0c;你可以简单而高效地调整配置项的展示&#xff0c;提升用户体验。 源码地址: Github | G…

美创科技入选2024数字政府解决方案提供商TOP100!

11月19日&#xff0c;国内专业咨询机构DBC德本咨询发布“2024数字政府解决方案提供商TOP100”榜单。美创科技凭借在政府数据安全领域多年的项目经验、技术优势与创新能力&#xff0c;入选收录。 作为专业数据安全产品与服务提供商&#xff0c;美创科技一直致力于为政府、金融、…

地平线 bev_cft_efficientnetb3 参考算法-v1.2.1

01 概述 在自动驾驶感知算法中 BEV 感知成为热点话题&#xff0c;BEV 感知可以弥补 2D 感知的缺陷构建 3D “世界”&#xff0c;更有利于下游任务和特征融合。 地平线集成了基于 bev 的纯视觉算法&#xff0c;目前已支持 ipm-based 、lss-based、 transformer-based&#xff…

C#里怎么样检测文件的属性?

C#里怎么样检测文件的属性? 对于文件来说,在C#里有一种快速的方法来检查文件的属性。 比如文件是否已经压缩, 文件是否加密, 文件是否是目录等等。 属性有下面这么多: 例子演示如下: /** C# Program to View the Information of the File*/ using System; using Syste…

最新‌VSCode保姆级安装教程(附安装包)

文章目录 一、VSCode介绍 二、VSCode下载 下载链接&#xff1a;https://pan.quark.cn/s/19a303ff81fc 三、VSCode安装 1.解压安装文件&#xff1a;双击打开并安装VSCode 2.勾选我同意协议&#xff1a;然后点击下一步 3.选择目标位置&#xff1a;点击浏览 4.选择D盘安装…

传输控制协议(TCP)和用户数据报协议(UDP)

一、传输控制协议&#xff08;TCP&#xff09; 传输控制协议&#xff08;Transmission Control Protocol&#xff0c;TCP&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由 IETF 的 RFC 793 定义。 它通过三次握手建立连接&#xff0c;确保数…

linux从0到1——shell编程9

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

nature communications论文 解读

题目《Transfer learning with graph neural networks for improved molecular property prediction in the multi-fidelity setting》 这篇文章主要讨论了如何在多保真数据环境&#xff08;multi-fidelity setting&#xff09;下&#xff0c;利用图神经网络&#xff08;GNNs&…

基于Qt/C++/Opencv实现的一个视频中二维码解析软件

本文详细讲解了如何利用 Qt 和 OpenCV 实现一个可从视频和图片中检测二维码的软件。代码实现了视频解码、多线程处理和界面更新等功能&#xff0c;是一个典型的跨线程图像处理项目。以下分模块对代码进行解析。 一、项目的整体结构 项目分为以下几部分&#xff1a; 主窗口 (M…

【Elasticsearch入门到落地】2、正向索引和倒排索引

接上篇《1、初识Elasticsearch》 上一篇我们学习了什么是Elasticsearch&#xff0c;以及Elastic stack(ELK)技术栈介绍。本篇我们来什么是正向索引和倒排索引&#xff0c;这是了解Elasticsearch底层架构的核心。 上一篇我们学习到&#xff0c;Elasticsearch的底层是由Lucene实…

鸿蒙主流路由详解

鸿蒙主流路由详解 Navigation Navigation更适合于一次开发,多端部署,也是官方主流推荐的一种路由控制方式,但是,使用起来入侵耦合度高,所以,一般会使用HMRouter,这也是官方主流推荐的路由 Navigation官网地址 个人源码地址 路由跳转 第一步-定义路由栈 Provide(PageInfo) pag…

java使用itext生成pdf

一、利用Adobe Acrobat DC软件创建pdf模板 备好Adobe Acrobat DC软件 1.excel/jpg/png文件转pdf文件 右击打开我们要转换的文件 2.然后点击 添加 域 3.可以看到域的名字 4.调整字体大小/对齐方式等 5.保存 二&#xff0c;代码部分 首先 上依赖 <dependency><group…

生成对抗网络模拟缺失数据,辅助PAMAP2数据集仿真实验

PAMAP2数据集是一个包含丰富身体活动信息的数据集&#xff0c;它为我们提供了一个理想的平台来开发和测试HAR模型。本文将从数据集的基本介绍开始&#xff0c;逐步引导大家通过数据分割、预处理、模型训练&#xff0c;到最终的性能评估&#xff0c;在接下来的章节中&#xff0c…

全面解析:HTML页面的加载全过程(一)--输入URL地址,与服务器建立连接

用户输入URL地址&#xff0c;与服务器建立连接 用户在浏览器地址栏输入一个URL 浏览器开始执行以下三步操作操作&#xff1a;url解析、DNS查询、TCP连接 第一步&#xff1a;URL解析 什么是URL&#xff1f; URL(Uniform Resource Locator&#xff0c;统一资源定位符)是互联网…

STM32总体架构简单介绍

目录 一、引言 二、STM32的总体架构 1、三个被动单元 &#xff08;1&#xff09;内部SRAM &#xff08;2&#xff09;内部闪存存储器 &#xff08;3&#xff09;AHB到APB的桥&#xff08;AHB to APBx&#xff09; 2、四个主动&#xff08;驱动&#xff09;单元 &#x…