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

ui自动化中,selenium进行元素定位,以及CSS,xpath定位总结

几种定位方式

简单代码

from selenium import webdriver
import time# 创建浏览器驱动对象
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()            # 参数写浏览器驱动文件的路径,若配置到环境变量就不用写了
# 访问网址
driver.get("https://www.baidu.com/")#找到输入搜素框
inpEle = driver.find_element(By.ID,"kw")
inpEle.send_keys("海康交通大数据")# 找到搜索按钮
sEle = driver.find_element(By.ID,"su")
sEle.click()# 退出浏览器
# driver.quit()

By中有8个,定位方式

  •         使用class_name 时 如果遇到多个class值有多个情况的,选择其中之一
  •         link_text 是用在a标签的
  •         xpath , 两个// ,表示找后代,相对路径,  / 表示找儿子, 全路径

id ,class_name, name 底层都是css

如下图的源码可知: id ,class_name, name 底层都是css

find_element 和 find_elements 区分

通过find_element 来找   

  • 找不到会报错
  • 如果能匹配多个,匹配到第一个就找一个

find_elements, 返回的是列表

写法变形(后面框架要用到)

本来是这么写的

变成这么写, 把元素独立出来。就可以单独维护

ele = ('id','kw')driver.find_element(*ele)

css-selector 定位

1234  (直接连起来是and关系, 如果是  用(逗号)分割,就是or关系 ),and时顺序是1234

  • 1.根据标签   P
  • 2.根据id      #id    (12结合写法    P#id)
  • 3.根据class   .class1.class2
    • 如果是xpth和 css 属性值写法,属性值要把 空格带上,写完整 【属性=“值 值”】时
    • 另外补充:如果是By.CLASS_NAME ,定位方式, 多个class,也只能写一个
  • 4.根据属性 ["属性"=“属性值”]
    • 不常规 [属性] (补充:不写值,表示有此属性的)
    • 常用 input[id="username"] + 加上标签更容易唯一 属性可以模糊匹配属性值如下图
    • input[class="class1 class2"])
    • 还能模糊,包含[*=],开头是[^=],结尾是[$=]
  • 根据路径
    • 空格 后代                 如:#kw p 找后代的p标签 空格 (表示在某一节点 后代里去找 p)
    • > 找儿子                   如:#a1 > p 儿子选择器 > 大于 (补充 >* 表示所有儿子, 空格* 表示所有后代)
    • + 找二弟 (找相邻弟弟) 如 :#ab1 + li 选择相邻弟弟 + (补充:+p 表示紧挨着的是p才能找到,p如果没有紧挨着还找不到)
    • ~ 找同级弟弟 如:#ab2 ~ li 选择所有亲弟弟 ~ (补充 ~ * 表示所有的弟弟)
  • 伪类选择器:(常用的三个)
    • :nth-child(n) 表示找结果的第几个:如:p:nth-child(1) # 第一个p
    • :first-child 结合 > ,可以用来查某个标签儿子中的大儿子 div>:first-child
    • :last-child
    • 补充:
    • :nth-of-type(1) 表示某种类型的第一个?
    • :not(p) 不要某种标签 (括号里可以写标签,或者.classsname, # id )

用css定位时补充:假如id为数字开头

        #id #id值,这种不行

        [id="31qvvq"] # css的属性值定位是可以的

Xpath定位

/ 一个表示一层一层往下找 (儿子中找)

// 两个表示从后代找 (后代中找)

只有两种情况,我会用xpath

       a. 想用多个属性,    //input[@id='kw' and @class]

         b .想用文本来取时  //*[text(),"文本"] //*[contains(text(),"文本")]

相关文章:

  • 记录移动端项目iOS端相对于安卓的各种兼容性问题
  • Llama模型家族之Stanford NLP ReFT源代码探索 (二)Intervention Layers层
  • Vim 快捷键
  • Java进阶_接口
  • MySQL周内训参照1、ER实体关系图与数据库模型图绘制
  • wma和mp3哪个音质好?让我告诉你哪个更胜一筹
  • CAN总线终端电阻作用
  • Redis基本操作介绍
  • CATIA入门操作案例——创成式曲面设计案例,吹风机的绘制,多截面曲面的绘制,曲面偏移和修剪
  • SQLserver前五讲课堂笔记
  • GaussDB的数种形态
  • 谷粒商城实战(033 业务-秒杀功能4-高并发问题解决方案sentinel 1)
  • idea如何使用git reset进行回退以及如何使用git stash将暂存区文件储藏,打包后重新恢复暂存区文件
  • 【EBS】通过SQL查找所有的定时请求
  • 【HarmonyOS】逻辑类中调用通用弹窗的处理
  • @jsonView过滤属性
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • eclipse(luna)创建web工程
  • HTML5新特性总结
  • Java IO学习笔记一
  • JavaScript 基本功--面试宝典
  • java小心机(3)| 浅析finalize()
  • laravel 用artisan创建自己的模板
  • leetcode388. Longest Absolute File Path
  • php中curl和soap方式请求服务超时问题
  • use Google search engine
  • VUE es6技巧写法(持续更新中~~~)
  • 初识 beanstalkd
  • 二维平面内的碰撞检测【一】
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 力扣(LeetCode)22
  • 事件委托的小应用
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 小程序 setData 学问多
  • 小程序01:wepy框架整合iview webapp UI
  • 用quicker-worker.js轻松跑一个大数据遍历
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • postgresql行列转换函数
  • Spring Batch JSON 支持
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (k8s)kubernetes 部署Promehteus学习之路
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (二)学习JVM —— 垃圾回收机制
  • (接口封装)
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • .NET Core 2.1路线图
  • .NET DataGridView数据绑定说明
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)