热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

selenium定位方式3css_selector

关于页面元素定位,可以根据id、class、name属性以及link_text。其中id属性是最理想的定位方式,class与name属性,

关于页面元素定位,可以根据 id、class、name 属性以及 link_text。

其中 id 属性是最理想的定位方式,class 与 name 属性,有时候也还行。

但是,如果要定位的元素,没有上述的属性,或者通过上述属性找到多个元素,该怎么办?

Selenium 提供了2种可以唯一定位的方式:


  1. find_element_by_css_selector
  2. find_element_by_xpath

find_element_by_css_selector


原理

HTML 中经常要为页面上的元素指定显示效果,比如前景文字颜色是红色,背景颜色是黑色, 字体是微软雅黑,输入框的宽与高等。

以上这一切,都是靠 css 来告诉浏览器:要选择哪些元素, 显示怎样的风格。

如下图,豆瓣上“登陆豆瓣”的按钮,就是 css 告诉浏览器:.account-anonymous .account-form-field-submit .btn 这个按钮,背景颜色是浅绿色,高是34px

其中,.account-anonymous .account-form-field-submit .btn 就是 css selector ,也称为 css 选择器。

css selector 语法就是用来选择元素的。

既然 css selector 语法 天生就是浏览器用来选择元素的,Selenium 自然就可以将它运用到自动化中,来定位要操作的元素了。

只要 css selector 的语法是正确的, Selenium 就可以定位到指定的元素。


根据标签(tag)名定位

HTML 中,以下都属于标签:

<a>a>
<div>div>
<h1>h1>
<script>script>
<body>body>
<span>span>
<footer>footer>
<input>
<form>form>
<button>button>

验证与搜索方式&#xff1a;


  1. F12 打开 开发者工具栏
  2. Ctrl 键 和 F 键&#xff0c; 显示搜索框

应用&#xff1a;

# find_element_by_css_selector 的应用&#xff1a;根据标签&#xff08;tag&#xff09;名定位
from selenium import webdriver # 导入 webdriver 模块driver &#61; webdriver.Chrome() # 调用 Chrome 浏览器
driver.get(&#39;https://www.douban.com/&#39;) # 打开豆瓣
element &#61; driver.find_element_by_css_selector("a") # 根据 a 标签定位元素
print(element.text) # 打印 定位元素 的文本driver.quit() # 关闭浏览器

根据 id 定位

根据 id 属性选择元素的语法是&#xff0c;在 id 前面加上一个 “#” 号&#xff1a; #id值

应用&#xff1a;

# find_element_by_css_selector 的应用&#xff1a;根据 id 定位
from selenium import webdriver # 导入 webdriver 模块
from time import sleep # 导入 sleep 模块&#xff0c;可以使程序强制休眠driver &#61; webdriver.Chrome() # 调用 Chrome 浏览器
driver.maximize_window() # 窗口最大化
driver.get(&#39;https://www.baidu.com/&#39;) # 打开 百度
sleep(2) # 强制休眠 2 秒
element &#61; driver.find_element_by_css_selector("#kw") # 根据 id 定位元素
element.send_keys("自动化测试") # 输入内容
sleep(3) # 强制休眠 3 秒
driver.quit() # 关闭浏览器

根据 class 定位

根据 class 属性选择元素的语法是&#xff0c;在 class 值前面加上一个"."&#xff1a; .class值

应用&#xff1a;

# find_element_by_css_selector 的应用&#xff1a;根据 class 定位
from selenium import webdriver # 导入 webdriver 模块
from time import sleep # 导入 sleep 模块&#xff0c;可以使程序强制休眠driver &#61; webdriver.Chrome() # 调用 Chrome 浏览器
driver.maximize_window() # 窗口最大化
driver.get(&#39;https://www.baidu.com/&#39;) # 打开 百度
sleep(2) # 强制休眠 2 秒
element &#61; driver.find_element_by_css_selector(".s-top-login-btn") # 根据 class 定位元素
element.click() # 点击定位元素
sleep(3) # 强制休眠 3 秒driver.quit() # 关闭浏览器

根据子元素与后代元素定位

HTML中&#xff0c; 元素内部可以包含其他元素&#xff0c; 比如 下面的 HTML片段&#xff1a;

<div id&#61;&#39;container&#39;><div id&#61;&#39;layer1&#39;> <div id&#61;&#39;inner11&#39;> <span id&#61;&#39;span1&#39;>内层11span> div><div id&#61;&#39;inner12&#39;><span>内层12span>div>div><div id&#61;&#39;layer2&#39;><div id&#61;&#39;inner21&#39;><span>内层21span>div>div>
div>

子元素

如果 元素2 是 元素1 的 直接子元素&#xff0c; css selector 选择直接子元素的语法是&#xff1a;

/* 一个层级 */
元素1 > 元素2
/* 多个层级 */
元素1 > 元素2 > 元素3 > 元素4
/* layer1 是 container 的直接子元素 */
#container > #layer1
/* inner11 是 layer1 的直接子元素&#xff0c;是 container 的后代元素 */
#layer1 > #inner11
#container > #layer1 > #inner11
/* span1 是 inner11 的直接子元素&#xff0c;是 layer1 与 container 的后代元素 */
#inner11 > #span1
#layer1 > #inner11 > #span1
#container > #layer1 > #inner11 > #span1

实际应用&#xff1a;

# find_element_by_css_selector 的应用&#xff1a;根据 子元素 定位
from selenium import webdriver # 导入 webdriver 模块
from time import sleep # 导入 sleep 模块&#xff0c;可以使程序强制休眠driver &#61; webdriver.Chrome() # 调用 Chrome 浏览器
driver.maximize_window() # 窗口最大化
driver.get(&#39;https://www.baidu.com/&#39;) # 打开 百度
sleep(2) # 强制休眠 2 秒
element &#61; driver.find_element_by_css_selector(".s_ipt_wr > #kw") # 根据 子元素 定位元素
element.send_keys("自动化测试") # 输入内容
sleep(3) # 强制休眠 3 秒driver.quit() # 关闭浏览器

后代元素

如果元素2是元素1的后代元素&#xff08;后代元素包含子元素&#xff09;&#xff0c; css selector 选择后代元素的语法是:

/* 一个层级 */
元素1 元素2
/* 多个层级 */
元素1 元素2 元素3 元素4
/* layer1 是 container 的直接子元素 */
#container #layer1
/* inner11 是 layer1 的直接子元素&#xff0c;是 container 的后代元素 */
#layer1 #inner11
#container #inner11
/* span1 是 inner11 的直接子元素&#xff0c;是 layer1 与 container 的后代元素 */
#inner11 #span1
#layer1 #span1
#container #span1

实际应用&#xff1a;

# find_element_by_css_selector 的应用&#xff1a;根据 后代元素 定位
from selenium import webdriver # 导入 webdriver 模块
from time import sleep # 导入 sleep 模块&#xff0c;可以使程序强制休眠driver &#61; webdriver.Chrome() # 调用 Chrome 浏览器
driver.maximize_window() # 窗口最大化
driver.get(&#39;https://www.baidu.com/&#39;) # 打开 百度
sleep(2) # 强制休眠 2 秒
element &#61; driver.find_element_by_css_selector("#form #kw") # 根据 后代元素 定位元素
element.send_keys("自动化测试") # 输入内容
sleep(3) # 强制休眠 3 秒
driver.quit() # 关闭浏览器

根据属性定位

在 HTML 中&#xff0c;idclass 是常用的属性&#xff0c;当然&#xff0c;一个标签内可以包含多个属性&#xff0c;同时属性名称也可以是自定义的&#xff0c;如下面的 HTML 代码段所示&#xff1a;

<li id&#61;"quick-entrance"><a href&#61;"https://www.lagou.com/s/subscribe.html" data-lg-webtj-_address_id&#61;"1nny" data-lg-webtj-_seq&#61;"1" rel&#61;"nofollow">职位订阅a>
li>

css selector 支持通过任何属性来选择元素&#xff0c;语法是用一个方括号 []

/* li 标签含有的属性&#xff1a;id */
[id&#61;"quick-entrance"]
/* 加上标签名限制 */
li[id&#61;"quick-entrance"]
/* a 标签含有的属性&#xff1a;href、data-lg-webtj-_address_id、data-lg-webtj-_seq、rel */
a[href&#61;"https://www.lagou.com/s/subscribe.html"]
a[data-lg-webtj-_address_id&#61;"1nny"]
a[data-lg-webtj-_seq&#61;"1"]
a[rel&#61;"nofollow"]

另外&#xff0c;css selector 根据属性值定位&#xff0c;还支持模糊匹配&#xff1a;


  • 包含关系 *&#61;&#xff1a;a[href*&#61;"lagou.com/s/"]
  • 匹配开头 ^&#61;&#xff1a;a[href^&#61;"https://www.lagou"]
  • 匹配结尾 $&#61;&#xff1a;a[href$&#61;"lagou.com/s/subscribe.html"]

如果一个元素具有多个属性&#xff0c;css selector 还可以同时限制多个属性&#xff1a;


  • a[rel&#61;"nofollow"][data-lg-webtj-_seq&#61;"1"]

实际应用&#xff1a;

# find_element_by_css_selector 的应用&#xff1a;根据 属性 定位
from selenium import webdriver # 导入 webdriver 模块
from time import sleep # 导入 sleep 模块&#xff0c;可以使程序强制休眠driver &#61; webdriver.Chrome() # 调用 Chrome 浏览器
driver.maximize_window() # 窗口最大化
driver.get(&#39;https://www.baidu.com/&#39;) # 打开 百度
sleep(2) # 强制休眠 2 秒
element &#61; driver.find_element_by_css_selector("input[id&#61;&#39;kw&#39;]") # 根据 属性 定位元素
# element &#61; driver.find_element_by_css_selector("input[class&#61;&#39;s_ipt&#39;]") # 根据 属性 定位元素
# element &#61; driver.find_element_by_css_selector("input[name&#61;&#39;wd&#39;]") # 根据 属性 定位元素
element.send_keys("自动化测试") # 输入内容
sleep(3) # 强制休眠 3 秒
driver.quit() # 关闭浏览器

联合使用

css selector 支持选择语法的联合使用。如下面的 HTML 代码段&#xff1a;

<div id&#61;&#39;bottom&#39;><div class&#61;&#39;footer1&#39;><span class&#61;&#39;copyright&#39;>版权span><span class&#61;&#39;date&#39;>发布日期&#xff1a;2018-03-03span>div><div class&#61;&#39;footer2&#39;><span>备案号<a href&#61;"http://www.miitbeian.gov.cn">苏ICP备88885574号a>span>div>
div>

/*
选择语法联合使用
定位目标&#xff1a;版权
*/

/*第一种方法 标签&#43;class&#43;子元素*/
div.footer1 > span.copyright
/*第二种方法 属性&#43;后代元素*/
div[id&#61;&#39;bottom&#39;] span[class&#61;&#39;copyright&#39;]
/*第三种方法 属性&#43;后代元素*/
#bottom .copyright
.footer1 .copyright

根据次序选择子节点


父元素的第n个子节点

使用 nth-child(n)&#xff0c;可以指定选择父元素的第几个子节点


注意&#xff1a;

  • 这里的排序&#xff0c;是所有的子元素一起排序&#xff0c;而不是按标签分类后再排序

  • 下标的开始值是 1



父元素的倒数第n个子节点

使用 nth-last-child(n)&#xff0c;可以倒过来&#xff0c;选择的是父元素的倒数第几个子节点


父元素的第几个某类型的子节点

使用 nth-of-type(n)&#xff0c;可以指定选择的元素是父元素的第几个某类型的子节点


父元素的倒数第几个某类型的子节点

使用 nth-last-of-type(n)&#xff0c;可以倒过来&#xff0c; 选择父元素的倒数第几个某类型的子节点


奇数节点和偶数节点

如果要选择的是父元素的偶数节点&#xff0c;使用 nth-child(even)

如果要选择的是父元素的奇数节点&#xff0c;使用 nth-child(odd)

如果要选择的是父元素的某类型偶数节点&#xff0c;使用 nth-of-type(even)

如果要选择的是父元素的某类型奇数节点&#xff0c;使用 nth-of-type(odd)


根据兄弟节点选择


相邻兄弟节点选择

使用方法&#xff1a;标签类型1 &#43; 标签类型2&#xff0c;两者为兄弟标签&#xff08;同级标签&#xff09;&#xff0c;定位到紧跟 标签类型1 后的第1个 标签类型2 的元素&#xff0c;如下图所示&#xff1a;


后续所有兄弟节点选择

使用方法&#xff1a;标签类型1 ~ 标签类型2&#xff0c;选择 标签类型1 后续兄弟节点中所有的 标签类型2 的元素&#xff0c;如下图所示&#xff1a;


总结


推荐阅读
  • JavaScript实现表格数据的实时筛选功能
    本文介绍如何使用JavaScript实现对表格数据的实时筛选,帮助开发者提高用户体验。通过简单的代码示例,展示如何根据用户输入的关键字动态过滤表格内容。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 本文将介绍网易NEC CSS框架的规范及其在实际项目中的应用。通过详细解析其分类和命名规则,探讨如何编写高效、可维护的CSS代码,并分享一些实用的学习心得。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
author-avatar
愤然尔立_980
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有