当前位置: 首页 > news >正文

CSS选择器进行定位

  CSS选择器可以说是我们最常用也是最重要的一种元素定位方式,他可以通过元素的标签,ID,class等属性进行定位,在Selenium中通过By.CSS_SELECTOR,进行元素定位也就是:

driver.find_elements(By.CSS_SELECTOR,"")

  通过这种方式就可以获取到我们想要获取的元素,这里并不是一定要使用elements也可以是element只要是根据你要获取元素的数量决定。

  它可以替代通过id等属性进行定位元素,接下来我们通过一些案例进行讲述,假设我们要获取div标签下的所有内容:

elements = driver.find_elements(By.CSS_SELECTOR,"div")
for element in elements:print(element.get_attribute("outerHTML"))

  这样运行的结果为:

 

  当然如果我们相通过div的id属性来确定元素位置,我们可以直接使用id进行定位(通常情况下我们认为id是唯一的):

elements = driver.find_elements(By.CSS_SELECTOR,"#t1")
for element in elements:print(element.get_attribute("outerHTML"))

  通过这个我们会发现我们在CSS选择器时使用id进行定位,与单纯的使用By.ID的写法有所不同,我们需要再id前面加上“#”来声明它是个id,class也是一样,“.class名”通过这种方式可以通过classname进行元素的定位:

选择 子元素 和 后代元素:

  这是CSS选择器的一个非常重要的方式来进行元素的定位:

<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>

  以这段html为例,这个id为container是id为layer1和layer2的父元素,同理inner11是layer1的子元素,但是这两个id都为container的后代元素,而layer1和layer2为container的直接子元素(这一点我们后续要用到),inner11是layer1的直接子元素。

  如果我们想要通过这种方式确定元素的位置需要遵守一定的规则如果是直接子元素需要使用“>”进行指定比如“#container > #layer1”,如果通过后代元素来确定位置,使用空格“ ”,例如“#container inner11”表示inner11为container的后代(无论隔了多少代,总之表示它的后代),接下来我们通过一些用例来检验我们的说明是否正确:

elements = driver.find_elements(By.CSS_SELECTOR,"#container > #layer1")
for element in elements:print(element.get_attribute("outerHTML"))

  结果为:

 

   如果使用空格后代元素,来确定元素的位置:

elements = driver.find_elements(By.CSS_SELECTOR,"#container  #inner11")
for element in elements:print(element.get_attribute("outerHTML"))

  结果为:

 

  

   

http://www.dtcms.com/a/275469.html

相关文章:

  • OneCode 3.0 DDD领域模型开放接口:基于DSMFactory的架构解析与实践指南
  • OBOO鸥柏丨满天星(MTSTAR)多媒体信息发布系统技术解析
  • Vscode中使用C++代码进行debug
  • Javaweb- 11 MVC架构模式
  • [BJDCTF2020]ZJCTF,不过如此
  • HarmonyOS从入门到精通:动画设计与实现之六 - 动画曲线与运动节奏控制
  • Leetcode百题斩-二分搜索
  • 【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序
  • linux_线程概念
  • 死锁的概念 ⚠️
  • 告别频繁登录!Nuxt3 + TypeScript + Vue3实战:双Token无感刷新方案全解析
  • TinyBERT:知识蒸馏驱动的BERT压缩革命 | 模型小7倍、推理快9倍的轻量化引擎
  • python-for循环
  • 【Elasticsearch】昂贵算法与廉价算法
  • UI前端大数据可视化实战策略分享:如何设计符合用户认知的数据可视化流程?
  • 让 VSCode 调试器像 PyCharm 一样显示 Tensor Shape、变量形状、变量长度、维度信息
  • 「日拱一码」025 机器学习——评价指标
  • Android音视频探索之旅 | C++层使用OpenGL ES实现音频渲染
  • 单片机学习笔记.根据芯片数据手册写驱动程序(这里使用的是普中开发版,以DS1302为例)
  • 创建Spring Boot项目
  • 解决‘vue‘ 不是内部或外部命令,也不是可运行的程序
  • 前端开发的「设计鸿沟」:为什么我学了CSS却做不出好看的网页?
  • 用YOLOv5系列教程(1)-用YOLOv5轻松实现设备状态智能监控!工业级教程来了
  • 【工具】什么软件识别重复数字?
  • C++结构体的定义与使用
  • 机器学习(ML)、深度学习(DL)、强化学习(RL)关系和区别
  • Redis 基本操作笔记
  • 关于wpf的自适应
  • 基于 Redisson 实现分布式系统下的接口限流
  • [特殊字符] 深入掌握 dsquery:Active Directory 高效查询与安全运维指南