CSS选择器-上篇

Selenium WebDriver提供By.CSS_SELECTOR定位元素方法 `By.CSS_SELECTOR` 是 Selenium WebDriver 提供的一种定位元素的方法,它允许使用 CSS 选择器来定位页面上的元素。 阅读详情

 

前面我们看到了根据 id、class属性、tag名 选择元素。

如果我们要选择的 元素 没有id、class 属性,或者有些我们不想选择的元素 也有相同的 id、class属性值,怎么办呢?

这时候我们通常可以通过 CSS selector 语法选择元素。

 

CSS Selector 语法选择元素原理

HTML中经常要 为 某些元素 指定 显示效果,比如 前景文字颜色是红色, 背景颜色是黑色, 字体是微软雅黑等。

那么CSS必须告诉浏览器:要 选择哪些元素 , 来使用这样的显示风格。

比如 ,下图中,为什么狮子老虎山羊会显示为红色呢?

image

因为蓝色框里面用css 样式,指定了class 值为animal的元素,要显示为红色。

其中 蓝色框里面的 .animal 就是 CSS Selector ,或者说 CSS 选择器。

CSS Selector 语法就是用来选择元素的。

既然 CSS Selector 语法 天生就是浏览器用来选择元素的,selenium自然就可以使用它用在自动化中,去选择要操作的元素了。

只要 CSS Selector 的语法是正确的, Selenium 就可以选择到该元素。

CSS Selector 非常强大,学习Selenium Web自动化一定要学习CSS Selector

 

通过 CSS Selector 选择单个元素的方法是

find_element_by_css_selector(CSS Selector参数)

选择所有元素的方法是

find_elements_by_css_selector(CSS Selector参数)

单个元素和所有元素的区别也是element多了一个s的事

CSS Selector 选择元素非常灵活强大, 大家可以从下面的例子看出来。

 

根据 tag名、id、class 选择元素

CSS Selector 同样可以根据tag名、id 属性和 class属性 来 选择元素,

根据 tag名 选择元素的 CSS Selector 语法非常简单,直接写上tag名即可,

比如 要选择 所有的tag名为div的元素,就可以是这样

elements = wd.find_elements_by_css_selector('div')

等价于

elements = wd.find_elements_by_tag_name('div')

 


 

根据id属性 选择元素的语法是在id号前面加上一个井号: #id值

比如 打开这个网址 http://f.python3.vip/webauto/sample1.html

有下面这样的元素:

<input  type="text" id='searchtext' />

就可以使用 #searchtext 这样的 CSS Selector 来选择它。

比如,我们想在 id 为 searchtext 的输入框中输入文本 你好 ,完整的Python代码如下

from selenium import webdriver

wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')

wd.get('http://f.python3.vip/webauto/sample1.html')

element = wd.find_element_by_css_selector('#searchtext')
element.send_keys('你好')

 

根据class属性 选择元素的语法是在 class 值 前面加上一个点: .class值

比如 这个网址 http://f.python3.vip/webauto/sample1.html

要选择所有 class 属性值为 animal的元素 动物 除了这样写

elements = wd.find_elements_by_class_name('animal')

还可以这样写

elements = wd.find_elements_by_css_selector('.animal')

因为是选择 所有符合条件的 ,所以用 find_elements 而不是 find_element


 

选择 子元素 和 后代元素

 

HTML中, 元素 内部可以 包含其他元素, 比如 下面的 HTML片段

<div id='container'>
    
    <div id='layer1'>
        <div id='inner11'>
            <span>内层11</span>
        </div>
        <div id='inner12'>
            <span>内层12</span>
        </div>
    </div>

    <div id='layer2'>
        <div id='inner21'>
            <span>内层21</span>
        </div>
    </div>
    
</div>

下面的一段话有些绕口, 请 大家细心 阅读:

id 为 container 的div元素 包含了 id 为 layer1 和 layer2 的两个div元素。

这种包含是直接包含, 中间没有其他的层次的元素了。 所以 id 为 layer1 和 layer2 的两个div元素 是 id 为 container 的div元素 的 直接子元素

而 id 为 layer1 的div元素 又包含了 id 为 inner11 和 inner12 的两个div元素。 中间没有其他层次的元素,所以这种包含关系也是 直接子元素 关系

id 为 layer2 的div元素 又包含了 id 为 inner21 这个div元素。 这种包含关系也是 直接子元素 关系

 

而对于 id 为 container 的div元素来说, id 为 inner11 、inner12 、inner22 的元素 和 两个 span类型的元素 都不是它的直接子元素, 因为中间隔了几层。

虽然不是直接子元素, 但是 它们还是在 container 的内部, 可以称之为它 的 后代元素

后代元素也包括了直接子元素, 比如 id 为 layer1 和 layer2 的两个div元素 也可以说 是 id 为 container 的div元素 的 直接子元素,同时也是后代子元素

 

如果 元素2 是 元素1 的 直接子元素, CSS Selector 选择子元素的语法是这样的

元素1 > 元素2

中间用一个大于号 (我们可以理解为箭头号)

注意,最终选择的元素是 元素2, 并且要求这个 元素2 是 元素1 的直接子元素

 

也支持更多层级的选择, 比如

元素1 > 元素2 > 元素3 > 元素4

就是选择 元素1 里面的子元素 元素2 里面的子元素 元素3 里面的子元素 元素4 , 最终选择的元素是 元素4
 

如果 元素2 是 元素1 的 后代元素, CSS Selector 选择后代元素的语法是这样的

元素1   元素2

中间是一个或者多个空格隔开

最终选择的元素是 元素2 , 并且要求这个 元素2 是 元素1 的后代元素。


也支持更多层级的选择, 比如

元素1   元素2   元素3  元素4

最终选择的元素是 元素4

 

根据属性选择


id、class 都是web元素的 属性 ,因为它们是很常用的属性,所以css选择器专门提供了根据 id、class 选择的语法。

那么其他的属性呢?

比如 <a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a> 里面根据 href选择,可以用css 选择器吗?

当然可以!

css 选择器支持通过任何属性来选择元素,语法是用一个方括号 [] 。

比如要选择上面的a元素,就可以使用 [href="http://www.miitbeian.gov.cn"] 。这个表达式的意思是,选择 属性href值为 http://www.miitbeian.gov.cn 的元素。

完整代码如下

from selenium import webdriver

wd = webdriver.Chrome(r'e:\chromedriver.exe')

wd.get('http://f.python3.vip/webauto/sample1.html')

# 根据属性选择元素
element = wd.find_element_by_css_selector('[href="http://www.miitbeian.gov.cn"]')

# 打印出元素对应的html
print(element.get_attribute('outerHTML'))

当然,前面可以加上标签名的限制,比如 div[class='SKnet'] 表示 选择所有 标签名为div,且class属性值为SKnet的元素。

属性值用单引号,双引号都可以。

根据属性选择,还可以不指定属性值,比如 [href] , 表示选择 所有具有属性名为href 的元素,不管它们的值是什么。

 

CSS 还可以选择 属性值 包含 某个字符串 的元素

比如, 要选择a节点,里面的href属性包含了 miitbeian 字符串,就可以这样写

a[href*="miitbeian"]

 

还可以 选择 属性值 以某个字符串 开头 的元素

比如, 要选择a节点,里面的href属性以 http 开头 ,就可以这样写

a[href^="http"]

 

还可以 选择 属性值 以某个字符串 结尾 的元素

比如, 要选择a节点,里面的href属性以 gov.cn 结尾 ,就可以这样写

a[href$="gov.cn"]

 

如果一个元素具有多个属性

<div class="misc" ctype="gun">沙漠之鹰</div>

CSS 选择器 可以指定 选择的元素要 同时具有多个属性的限制,像这样 div[class=misc][ctype=gun]

验证 CSS Selector


那么我们怎么验证 CSS Selector 的语法是否正确选择了我们要选择的元素呢?

当然可以像下面这样,写出Python代码,运行看看,能否操作成功

element = wd.find_element_by_css_selector('#searchtext')
element.input('输入的文本')

如果成功,说明选择元素的语法是正确的。

 

但是这样做的问题就是:太麻烦了。

当我们进行自动化开发的时候,有大量选择元素的语句,都要这样一个个的验证,就非常耗时间。

 

由于 CSS Selector 是浏览器直接支持的,可以在浏览器 开发者工具栏 中验证。

比如我们使用Chrome浏览器打开 http://f.python3.vip/webauto/sample1.html

按F12 打开 开发者工具栏

如果我们要验证 下面的表达式

#bottom > .footer2  a

能否选中 这个元素

<a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a>

可以这样做:

点击 Elements 标签后, 同时按 Ctrl 键 和 F 键, 就会出现下图箭头处的 搜索框

白月黑羽Python3教程

我们可以在里面输入任何 CSS Selector 表达式 ,如果能选择到元素, 右边的的红色方框里面就会显示出类似 2 of 3 这样的内容。

of 后面的数字表示这样的表达式 总共选择到几个元素

of 前面的数字表示当前黄色高亮显示的是 其中第几个元素

上图中的 1 of 1 就是指 : CSS 选择语法 #bottom > .footer2 a

在当前网页上共选择到 1 个元素, 目前高亮显示的是第1个。

如果我们输入 .plant 就会发现,可以选择到3个元素

白月黑羽Python3教程

 

【Web自动化测试】Selenium 定位方式3-css_selector 阅读详情

相关推荐

CSS语言的正则表达式

正则表达式是一种用于字符串匹配和搜索的工具,它使用特定的语法规则来描述字符串的模式。正则表达式广泛应用于文本处理、数据验证、搜索和替换等领域。在CSS中,虽然我们不能直接使用正则表达式,但我们可以理解其背后的选择器逻辑。CSS选择器是指用于选择要应用样式的HTML元素的模式。元素选择器:通过标签名选择元素类选择器:通过类名选择元素ID选择器:通过ID选择元素群组选择器:通过逗号分隔多个选择器。

2501_90231118的博客 567

Python-selenium学习笔记-css选择元素

方法名:find_element(By.CSS_SELECTOR, "元素名")find_elements找所有执行结果:代表寻找第一个类名为plant的元素,若要结果:子元素是被的元素后代元素是的元素元素1>元素2最终选择的元素是元素2, 且要求元素2是元素1的直接子元素也可以支持的选择,如:元素1>元素2>元素3>元素4最终选择元素4, 且元素4是元素3的直接子元素,元素3是元素2的直接子元素,元素2是元素1的直接子元素若只需要是元素1 元素2 元素3 元素4最终选择的是元素4。

qq_45645552的博客 2139

【CSS】选择器

CSS 简介+选择器详细知识点

isun1的博客 1401

Selenium四 find_element_by_css_selector()的几种方法

find_element_by_css_selector()的两种方法   方式一  后代或平级关系来选择元素 : 父元素: (#)表示通过  id     属性来定位元素 (.)表示通过 class  属性来定位元素 子元素(后代关系)    #choose_car option    含空格的,后面的元素不必是前面元素的直接子元素,只要在父元素的里面    .s_ipt_wr sp...

雪国的花儿’s Blog 4万+

《Cesium 基础知识点》- 申请 Cesium Ion 密钥

一、访问 https://cesium.com/ion/signin/tokens 二、登录/注册 三、申请 四、使用 // 密钥 let defaultAccessToken = 'your token string'; // 设置 Cesium.Ion.defaultAccessToken = defaultAccessToken; // 初始化 let viewer = new Cesium.Viewer('cesiumContainer', {}); ...

前端技术 2570

ADS仿真功率放大器实例学习笔记

ADS仿真功率放大器实例学习笔记

qq_36521926的博客 1万+

CSS的选择器

6种选择器:基本选择器、复合选择器、关系选择器、属性选择器、伪类选择器、伪元素选择器。

weixin_65317510的博客 6901

从RTL到GDSII:DC综合里那些没人告诉你的时钟约束冷知识(附真实工程示例)

本文深入探讨数字IC设计中DC综合阶段的时钟约束冷知识,包括无毛刺时钟切换、寄存器分频时钟约束、虚拟时钟应用等关键技巧。通过真实工程示例,揭示常见约束误区及解决方案,帮助工程师提升时序收敛效率。特别针对input_delay和output_delay在多时钟域场景下的设置陷阱提供实用指南。

weixin_29306317的博客 429

CSS选择器

CSS选择器 简单介绍一下CSS选择器 在 CSS 中,选择器是选取需设置样式的元素的模式。 传统CSS 2.1选择器 标签选择器 id选择器 class选择器(类选择器) 复合选择器 伪类 CSS 3新增选择器 元素关系选择器 序号选择器 属性选择器 CSS 3新增伪类 伪元素 标签选择器 标签选择器也称为元素选择器、类型选择器,它直接使用元素的标签名当作选择器,将选择页面上所有该种标签。 标签选择器将选择页面上所有的该种标签,无论这个标签所处的位置的深浅。 标签选择

qq_46883835的博客 5040

批量读取_MCGS触摸屏如何实现批量读取modbus数据的方法?

前两天,在一个QQ群里,有同行的朋友问,在MCGS中如何实现批量读取数据,因为他当时面临设备,通讯协议才是MODBUS RTU,同时厂家说地址不能分开读,必须是连续的。鉴于他提供的消息是能够设置的地方都试过了。为此,我直接告诉通过脚本,批量读取的方案。那么这个方案究竟如何实现?且看我下面慢慢道来。一、工具1.modsim:仿真PLC或者第三方设备。2.MCGS组态软件3.串口软件:在电脑中生成两不...

weixin_32511509的博客 8160

【PCIe 总线及设备入门学习专栏 6.2 -- PCIe VDM (Vendor Defined Messages)】

在PCIe协议中,Vendor Defined Messages (VDMs) 是一种允许厂商定义和传输特定功能的消息类型。这种机制扩展了标准 PCIe 消息的功能,可以用于实现供应商自定义的功能,例如固件更新、设备配置和诊断信息传输。PCIe VDM 是通过实现的,它遵循 PCIe 协议栈的结构,包括事务层、数据链路层和物理层。

CodingCos的博客 1895

CSS 选择器 — 重学CSS

在之前的 《实战中学习浏览器工作原理》中我们已经对选择器有了一些全新视角的认知。这里我们站在 CSS 的角度一起学习选择器。

三钻 - 之前端到全栈之路 2383

FM1288回声消除芯片调试方案 - 综述

专栏文章概览

优快云mianfeixiazai001的博客 1714

HTML — CSS选择器

CSS选择器用于定位HTML元素并应用样式,但不能以列表形式呈现其完整分类。选择器通过特定语法规则匹配元素,例如元素选择器(如p)直接选中标签,类选择器(如.class)通过class属性匹配,而ID选择器(如#id)基于唯一标识定位。此外,属性选择器(如[type="text"])按属性筛选,伪类选择器(如:hover)响应状态变化,组合选择器(如div > p)则通过层级关系精确控制。每种选择器需独立使用或组合嵌套,无法简单罗列为列表,因其语法和逻辑依赖具体应用场景。

2403_89893216的博客 2479

基于 DnLUT 超高效的彩色图像去噪(CVPR 2025),本地部署 DnLUT 模型,图像去噪算法训练和推理,全网最详细教程

基于 DnLUT 超高效的彩色图像去噪(CVPR 2025),本地部署 DnLUT 模型,图像去噪算法训练和推理,全网最详细教程

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 363

124、LLC谐振变换器的矩阵变压器设计

摘要 本文分享了LLC谐振变换器中矩阵变压器的实战设计经验。针对大功率LLC单颗变压器的痛点(绕组层数多、散热不均、漏感一致性差),作者提出将大变压器拆分为多个小变压器单元(建议6个),通过原边串联、副边并联的方式实现功率分配。详细解析了磁芯选型、匝比计算、绕组结构、漏感控制和散热设计等关键参数,特别强调了小磁芯优势、等效匝比计算误区以及三明治绕法的重要性。文中还总结了调试过程中的谐振频率偏移和均流问题解决方案,并给出了矩阵数量选择、磁芯材质、绝缘材料等实用建议。作者指出,矩阵变压器在2kW以上LLC应用中

Jack010169的博客 170

css选择器总结

1.css选择器 1.1css基础选择器 标签选择器 类选择器 id选择器 配符选择器 1.2css复合选择器 后代选择器 子选择器 并集选择器 交集选择器 后续兄弟选择器 紧邻兄弟选择器 伪类选择器 :focus伪类选择器 :enabled伪类 :not()伪类 1.3css选择器总结 2.css3新增选择器 2.1属性选择器 2.2结构伪类选择器 2.3伪元素选择器css选择器分为基础选择器和复合选择器。标签选择器,类选择器,id选择器,通配符选择器。 缺点:不能设计差异化样式,只能选择全部的当前标签。

qq_73986726的博客 1757

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

css选择器

1.1相邻兄弟选择器CSS2作⽤给指定选择器后⾯紧跟的那个选择器选中的标签设置属性注意点1.相邻兄弟选择器必须通过连接2.相邻兄弟选择器只能选中紧跟其后的那个标签不能选中被隔开的标签1.2通⽤兄弟选择器CSS3作⽤给指定选择器后⾯的所有选择器选中的所有标签设置属性注意点:1.通⽤兄弟选择器必须⽤连接2.通⽤兄弟选择器选中的是指定选择器后⾯某个选择器选中的所有标签⽆论有没有被隔开都可以选中。

weixin_67252311的博客 2026

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【CSS】认识CSS选择器及各选择器对应的用法

CSS(Cascading Style Sheet),层叠样式表。它与 HTML(超文本标记语言)一起使用,用于控制页面的样式。CSS 能够对网页中元素位置的排版进行像素级精确控制,实现美化页面的效果。能够做到页面的样式和结构分离。CSS 可以理解为“东方四大邪术”之化妆术。对页面的展示进行“化妆”。

StuLearn-LJC的博客 1288

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【13种css选择器】学css选择器,这一篇就够了

组合选择器就是将各种基本选择器通过一定规则连接起来变成一个复杂的多功能选择器 基本的,单一的选择器,相当于你会不同的法术。在CSS中,不同的选择器有不同的权重,当多个样式规则应用到同一个元素时,CSS会按照权重的高低来决定最终的样式。常规的css,就是把这些规则应用到selector指定的元素上,组合选择器可以实现很多比较高级的功能。id为eg的元素里所有的p元素背景颜色为蓝色,哪怕嵌套一百层p标签,也还是蓝色。id为eg的元素里,紧接着p元素的第一个p元素。id为eg的元素里,紧接着p元素的所有p元素。

杜永康的博客 2924

CSS选择器之CSS基础选择器

CSS选择器作用:找到特定的html页面元素 CSS基础选择器 1.标签选择器(元素选择器)--是指用HTML标签名作为选择器,按标签名分类,为页面中某一类标签指定统一的CSS样式,语法如下: 标签名{属性1:属性值1; 属性2:属性值2; 属性3:属性值3;} 作用:标签选择器可以把某一类表圈全部选择出来,比如所有的div标签和所有的span标签 优点:是能快速为页面中同类型的标签统一样式 缺点:不能设计差异化样式 ...

LiuYQing的博客 1970
上一篇: 自动化操控元素
下一篇: CSS-Selector---下篇
raw_recruit0302
博客等级 码龄8年 30粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值