一,定位原则

  • 稳定
  • 简单灵活
  • 唯一

WebDriver提供了两种方式来定位页面元素,分别是find_element_by_XXX和find_elements_by_XXX。第一种方式的结果是在正常情况下返回一个页面元素的对象,一旦出现异常就会报错。第二种方式的结果是在正常情况下返回页面元素的多个对象,如果没有任何一个DOM元素能匹配,则此返回列表为空。

二,8大元素定位方法

id name classname tagName(前4个是通过CSS Seletor原理) link_text partial_link_text Css xpath

优先使用id,name,classname,tagename唯一定位

  • find_elemet_by_id("id属性值")  # 参数少,直观 VS  find_element(by=By.ID, value='kw')
  • find_element_by_name("name属性值")
  • find_elemnt_by_classname("class属性值")
  • find_element_by_tagname("tag标签")
  • find_element_by_link_text(" ")
  • find_element_by_partial_link_text(" ")
  • find_element_by_css_selector()
  • find_element_by_xpath()

还有一种是find_element(by=By.ID, value="id"),其实查看find_element_by_id()的源码,可以看到该方法其实是调用find_element()方法。

三,css vs xpath

  • CSS对于简单的定位更加简介;
  • CSS对于主流浏览器,效率更高;
  • 对于复杂的定位,使用xpath更简洁;
  • xpath基本上都能定位的到,功能更强大

四,xpath定位

1.xpath基本概念和语法(https://www.runoob.com/xpath/xpath-syntax.html)

节点名

  • 非常广泛

从根节点开始选取,根节点是 /

  • 绝对路径
  • 路径很长,需要从根节点开始一级一级往下写,例如/html/head/title
  • 从根节点开始往下查找,直到找到所有符合要求的节点

相对路径

  • //是相对路径,会找出所有这个元素,然后再根据具体的元素属性定位一个
  • 例如,//h2/a

选取当前节点

  • 一个点指获取当前节点是 /.
  • 两个点指选取上一级节点 /..,即父节点
  • //是指从全文上下文中搜索//后面的节点,而.//则是指从前面的节点的子节点中进行查找

使用@选取属性

  • 标签名[@属性名=“属性值”]
  • 例如,//span[@class="js-label"]
  • //a[@class]将所有带有class属性的a标签返回

contains包含关系

  • 例如,//a[contains(@name,'trnews')]

使用text文本text()

  • 例如,//span[contains(text(), "java测试")]
  • //span[text()=" java测试"](精准匹配)

多条件定位

  • 当某个属性不足以唯一区别某一个元素时,可以采取多个条件组合的方式
  • and(与)
  • 例如,//input[@name and @class="s_ipt"]
  • or(或)
  • 例如,//input[@id="kw" or @id="su"]

层级定位

  • 子标签不唯一,但父标签唯一,可以协助父标签一起定位
  • 例如,//a[@title="Python"]/span[@class="js-label"]

通配符定位节点

  • 例如,//*匹配所有节点
  • 例如,//*[@id="su"]
  • 匹配所有拥有属性节点的元素//*[@*]

轴定位(能够找到一个唯一的中心点)(参考文档:https://www.w3school.com.cn/xpath/xpath_axes.asp)

  • 应用场景:当某个元素的各个属性及其组合都不足以定位时,可以利用其兄弟节点或者父节点等各种可以定位的元素进行定位。
  • parent 父节点名
  • ancestor 祖先节点,包含父节点
  • preceding 当前元素节点之前的所有节点
  • preceding-sibling 当前节点之前的兄弟节点(哥哥)
  • following 当前节点结束标签之后的所有节点(儿子)
  • following-sibiling 当前节点结束标签之后的兄弟节点,而不包含其他子节点(弟弟)
  • 例如,//dd[@data="1992"]/following-sibling::dd[contains[@class, "batscore"]]/span

按照位置索引获取节点获取同一个节点下面的所有同类型的子节点

  • 从1开始,最后一个是last()
  • //div[@data-report-module="middle-course"]/ul/li[1]
  • //div[@data-report-module="middle-course"]/ul/li[last()]
  • //div[@data-report-module="middle-course"]/ul/li[last()-1]
  • //div[@data-report-module="middle-course"]/ul/li[position()>4]

五,CSS定位(参考文档:https://www.cnblogs.com/longronglang/p/9144661.html)

1,常见符号

  • #表示 id选择器
  • .表示 class选择器
  • >表示子元素,层级
  • 一个空格也表示子元素,但是是所有的后代子元素,相当于 xpath 中的相对路径

2,属性定位

百度输入框的的html代码,<input id="kw" class="s_ipt" type="text" autocomplete="off" maxlength="100" name="wd"/>

  • css可以通过元素的id、class、标签这三个常规属性直接定位到
  • css用#号表示id属性,如:#kw
  • css用.表示class属性,如:.s_ipt
  • css直接用标签名称,无任何标示符,如:input

3,其他属性

1.css除了可以通过标签、class、id这三个常规属性定位外,也可以通过其它属性定位

2.以下是定位其它属性的格式
[name=wd] [autocomplete='off'][maxlength='255']

4,标签

css页可以通过标签与属性的组合来定位元素
input.s_ipt

input#kw

input[id='kw']

5,层级关系

//form的id属性
form#form>span>input
//form的class属性
form.fm>span>input

6,索引

css也可以通过索引nth-child(1)来定位子元素,直接翻译过来就是第几个小孩
总结:选择标签后,找第几个小孩即可
Select控件第三个Opel
#select>select>option:nth-child(3)
CheckBox第一个Volvo
#checkbox>input:nth-child(1)

7,逻辑运算

css同样也可以实现逻辑运算,同时匹配两个属性,这里跟xpath不一样,无需写and关键字
[type='checkbox'][name='checkbox1']

css语法远远不止上面提到的,还有更多更强大定位策略,有兴趣的同学可以继续深入研究

selenium元素定位学习笔记的更多相关文章

  1. Selenium3 + Python3自动化测试系列二——selenium元素定位

    一.selenium元素定位 Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准去抓取到对应元素 才能进行后续的自动化控制,我在这里将对selenium8种元 ...

  2. selenium元素定位之css选择器

    在selenium元素定位时会用到css选择器选取元素,虽说xpath在定位元素时能解决大部分问题,但使用css选择器选取元素也是一种不错的选择. css相较与xpath选择元素优点如下: 表达式更加 ...

  3. selenium元素定位陷阱规避

    为什么selenium可以在各个浏览器上运行?因为selenium在与各个浏览器驱动执行前,会先把脚本转化成webdriver, webdriver wire协议(一种json格式的协议),这样就与脚 ...

  4. 自动化测试基础篇--Selenium元素定位

    摘自https://www.cnblogs.com/sanzangTst/p/7457111.html 一.Selenium元素定位的重要性: Web自动化测试的操作:获取UI页面的元素,对元素进行操 ...

  5. UI自动化学习笔记- Selenium元素定位及元素操作

    一.元素定位 1. 如何进行元素定位? 元素定位就是通过元素的信息或元素层级结构来定位元素的 2.定位工具 浏览器开发者工具 3.元素定位方式 Selenium提供了八种定位元素方式 id name ...

  6. [Selenium With C#学习笔记] Lesson-02 Web元素定位

    使用Selenium来做自动化测试,一般的流程是:查找定位元素--->操作元素--->断言,那么第一步我们需要能够完成查找并定位元素,Selenium目前提供了8种基本定位方法,可根据实际 ...

  7. 我是这么学习Selenium元素定位操作的

    写在前面 做web自动化测试都有体会,本质也就是通过操作页面元素对象来模拟用户操作行为,那么首先我们先找到这些元素对象,然后才能进行一系列操作. 我们得先告诉自动化工具或者说代码要操作那个元素,毕竟代 ...

  8. python学习之——selenium元素定位

    web自动化测试按步骤拆分,可以分为四步操作:定位元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告. 其中定位元素尤为关键,此篇是使用webdriver通过页面各个 ...

  9. python selenium 元素定位(三)

    上两篇的博文中介绍了python selenium的环境搭建和编写的第一个自动化测试脚本,从第二篇的例子中看出来再做UI级别的自动化测试的时候,有一个至关重要的因素,那就是元素的定位,只有从页面上找到 ...

随机推荐

  1. GuestOS? HostOS?

    起因 今天在网上看到一篇文章  有几个陌生的关键词不太熟悉,就随笔记一下. 名词解释 # OS :操作系统 # VM(虚拟机)    里的OS 称为        GuestOS # 物理机      ...

  2. C#中SQL Server的几点注意事项

     背景 在C#中处理sql会遇到一些奇怪的问题,在这里做一个小的总结,内容会随着经历不断积累. 内容 1.DataTime?和DataTime的区别. DataTime?定义的数据为可空类型,允许其为 ...

  3. 详解JVM中的内存模型是什么?

    强烈推荐 不管是找工作还是提升水平,都建议读一下<深入理解Java虚拟机>这本书,详细讲解了JVM中的内存管理.类加载过程.垃圾回收以及最重要的性能调优实战. 本博客也是参考了这本书,有不 ...

  4. 掌控安全sql注入靶场pass-05

    1.判断注入点 1 and 1=1 1 and 1=2 考虑存在布尔盲注 布尔盲注解释 当不能像前面那样直接在网页中显示我们要的数据时就需要用到盲注,来得到数据库之类的名字.基于布尔的盲注就是通过判断 ...

  5. [LeetCode] 203. 移除链表元素(链表基本操作-删除)、876. 链表的中间结点(链表基本操作-找中间结点)

    题目 203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 题解 删除结点:要注意虚拟头节点. 代码 class Solution { public ListNode removeEle ...

  6. JavaScript闭包函数的理解

    闭包就是一个函数能够访问其函数外部作用域中的变量,即在外面可以调用函数中的函数的变量,其实他就是将函数内外部连接起来的桥梁 闭包三大特点: 1. 函数嵌套函数 2. 内部函数可以访问外部函数的变量 3 ...

  7. 【小白学PyTorch】12 SENet详解及PyTorch实现

    文章来自微信公众号[机器学习炼丹术].我是炼丹兄,有什么问题都可以来找我交流,近期建立了微信交流群,也在朋友圈抽奖赠书十多本了.我的微信是cyx645016617,欢迎各位朋友. 参考目录: @ 目录 ...

  8. 数组如何在ElasticSearch中索引

    一.简介 在ElasticSearch里没有专门的数组类型,任何一个字段都可以有零个和多个值.当字段值的个数大于1时,字段类型就变成了数组. 下面以视频数据为例,介绍ElasticSearch如何索引 ...

  9. spring ioc 源码分析之-- beanDefinition的加载过程以及ComponentScan,@componet,@import @Bean等注解解析过程

    背景:我们启动主启动类后,相应的bean就被扫描进来了,原理是啥? 实现该功能的主要核心类就是:ConfigurationClassPostProcessor,我们看看他的继承体系: 它实现了Bean ...

  10. python下正则表达式的随笔记录

    使用了下正则的表达式: 目的:取出字符串中{}中的内容 最后使用的正则表达式为 {(.*?)} 先看   .*?  : 首先  .  是用来匹配字符串,但是只能匹配一次. 所以加上  *  ,可以让 ...