Selenium的八种定位方式

1. 通过 ID 定位

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

from selenium import webdriverdriver = 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 timefrom 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 Bydriver = 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

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

logback动态获取nacos配置

文章目录 前言一、整体思路二、使用bootstrap.yml三、增加环境变量四、pom文件五、logback-spring.xml更改总结 前言 主要是logback动态获取nacos的配置信息,结尾完整代码 项目springcloudnacosplumelog&#xff0c;使用的时候、特别是部署的时候&#xff0c;需要改环境&#…

OpenMM的安装与使用

技术背景 OpenMM是一款基于Python开发的开源分子动力学模拟软件&#xff0c;这几年因为AlphaFold的缘故&#xff0c;使得这个软件的热度有了不少提升。并且可以使用GPU硬件加速&#xff0c;所以性能上也不赖。这里介绍一下该软件的基本安装和使用方法&#xff0c;并附带一个真空…

Linux各种并发服务器优缺点

本文旨在介绍针对“无并发C/S模型”改进的方法总结以及各种改进方法的优缺点&#xff0c;具体函数的实现并不介绍。 1. 无并发C/S模型 创建服务器流程分析&#xff1a; socket()创建服务器的监听套接字bind()将服务器给服务器的监听套接字绑定IP地址和Port端口号listen()设置…

cookie反爬----普通服务器,阿里系

目录 一.常见COOKIE反爬 普通&#xff1a; 1. 简介 2. 加密原理 二.实战案例 1. 服务器响应cookie信息 1. 逆向目标 2. 逆向分析 2. 阿里系cookie逆向 1. 逆向目标 2. 逆向分析 实战&#xff1a; 无限debugger原理 1. Function("debugger").call() 2. …

网络无人值守批量装机-cobbler

网络无人值守批量装机-cobbler 一、cobbler简介 ​ 上一节中的pxe+kickstart已经可以解决网络批量装机的问题了,但是环境配置过于复杂,而且仅针对某一个版本的操作系统进批量安装则无法满足目前复杂环境的部署需求。 ​ 本小节所讲的cobbler则是基于pxe+kickstart技术的二…

推荐一款开源电子书阅读器Koodo Reader

Koodo Reader 是一个开源的电子书阅读器&#xff0c;支持多达15种主流电子书格式&#xff0c; 内置笔记、高亮、翻译功能&#xff0c;助力高效书籍阅读和学习。 官网地址&#xff1a;https://www.koodoreader.com/zh 一、下载软件 下载地址&#xff1a;https://dl.koodoreader.…

FreeRTOS——互斥信号量

一、为什么需要互斥信号量 前面的学习中&#xff1a; 调度锁、临界段不可避免的破坏了实时性&#xff0c;还有二值信号量存在这样的隐患——“优先级翻转” 优先级翻转 简单来说&#xff0c;就是由于信号量被低优先级任务占用&#xff0c;即使遇到高优先级任务&#xff0c;它…

AIGC学习笔记(6)——AI大模型开发工程师

文章目录 AI大模型开发工程师005 OpenAI大模型案例实践1 AI 翻译助手需求分析项目起源市场价格和市场前景基于大模型的翻译软件核心功能设计 2 AI 翻译助手架构设计架构设计代码结构设计 3 AI 翻译助手核心功能文档解析文档操作PDF文档操作表格操作图片操作 Prompt封装 4 AI 翻…

程序语言语法上手题目合集

程序语言语法上手题目合集 1跑步2猜年龄3Vigenre 密码 1跑步 2.跑步 - 蓝桥云课 枚举日期&#xff0c;判断是否符合条件即可。 参考程序&#xff1a; #include<stdio.h> int y2022,m1,d1; int week6; int month[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};int judg…

C#调用C++ DLL方法之P/Invoke

关于P/Invoke Platform Invoke (P/Invoke) 是 .NET 提供的一种服务&#xff0c;允许托管代码&#xff08;如 C#&#xff09;调用非托管代码&#xff08;如 C/C 编写的 DLL 函数&#xff09;。通过 P/Invoke&#xff0c;可以在 .NET 应用程序中使用现有的非托管代码库&#xff…

Centos Stream 9安装Jenkins-2.485 构建自动化项目步骤

官网&#xff1a;https://www.jenkins.io/ 1 下载 环境准备&#xff1a; 版本支持查询&#xff1a;https://pkg.jenkins.io/redhat-stable/ 安装JDK17&#xff1a;https://blog.csdn.net/qq_44870331/article/details/140784297 yum -y install epel-release wget upgradew…

青训营刷题笔记16

问题描述 小R从班级中抽取了一些同学&#xff0c;每位同学都会给出一个数字。已知在这些数字中&#xff0c;某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。 测试样例 样例1&#xff1a; 输入&#xff1a;array [1, 3, 8, 2, 3, 1, 3, 3, 3] 输出…

Go语言链接Redis数据库

1.使用go get命令安装go-redis/v8库&#xff1a; 我这里使用的vscode工具安装&#xff1a; go get github.com/go-redis/redis/v82.创建Redis客户端实例 使用以下Go代码连接到Redis服务器并执行命令&#xff1a; package mainimport ("context""fmt"&q…

Mybatis 核心配置文件

MyBatis的全局配置文件mybatis-config.xml&#xff0c;配置内容如下&#xff1a; properties&#xff08;属性&#xff09; settings&#xff08;全局配置参数&#xff09; typeAliases&#xff08;类型别名&#xff09; typeHandlers&#xff08;类型处理器&#xff09; obj…

09 —— Webpack搭建开发环境

搭建开发环境 —— 使用webpack-dev-server 启动Web服务&#xff0c;自动检测代码变化&#xff0c;有变化后会自动重新打包&#xff0c;热更新到网页&#xff08;代码变化后&#xff0c;直接替换变化的代码&#xff0c;自动更新网页&#xff0c;不用手动刷新网页&#xff09; …

TCP vs UDP:如何选择适合的网络传输协议?

在网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种非常重要的传输层协议。它们各有特点&#xff0c;适用于不同类型的应用场景。本文将详细探讨TCP和UDP协议的结构、优缺点及应用&…

网络安全之内网安全

下面给出了应对企业内网安全挑战的10种策略。这10种策略即是内网的防御策略&#xff0c;同时也是一个提高大型企业网络安全的策略。 1、注意内网安全与网络边界安全的不同 内网安全的威胁不同于网络边界的威胁。网络边界安全技术防范来自Internet上的攻击&#xff0c;主要是防…

7-2 扑克牌花色

作者 李祥 单位 湖北经济学院 给 52 张扑克牌面编号如下&#xff1a; 编号牌面编号牌面编号牌面编号牌面0♠A13♥A26♣A39♦A1♠214♥227♣240♦22♠315♥328♣341♦33♠416♥429♣442♦44♠517♥530♣543♦55♠618♥631♣644♦66♠719♥732♣745♦77♠820♥833♣846♦88♠9…

windows 中docker desktop 安装

前提条件&#xff1a; 安装wsl2 1. 下载 Docker Desktop 访问 Docker Desktop 官方下载页面。 https://www.docker.com/products/docker-desktop/ 根据你的操作系统架构&#xff08;一般为 Windows x86_64&#xff09;下载安装程序。 选择标准&#xff1a; AMD64 是行业…

初学 flutter 环境变量配置

一、jdk&#xff08;jdk11&#xff09; 1&#xff09;配置环境变量 新增&#xff1a;JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增&#xff1a;%JAVA_HOME%\bin2&#xff09;验证是否配置成功&#xff08;cmd运行命令&#xff09; java java -version …