热门标签 | 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;


总结


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
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社区 版权所有