本文主要是讲解在web页面中如何定位元素,这是进行自动化操作的前提。

前言

我们主要是要做web自动化,通常一个web页面上有输入框、按钮、文字链接、图片等元素,自动化测试要做的就是模拟鼠标和键盘来操作这些元素,如单击、输入、鼠标悬停等。操作这些元素的前提是要定位它们,就是找到它们的位置,所以下面可以利用WebDriver采用几种不同的方式去进行元素定位。

元素定位方法以及Python中对应的方法

id定位 find_element_by_id()
name定位 find_element_by_name()
tag定位 find_element_by_tag_name()
class定位 find_element_by_class_name()
link_text定位 find_element_by_link_text()
partial link定位 find_element_by_partial_link_text()
XPath定位 find_element_by_xpath()
CSS_selector定位 find_element_by_css_selector()

各定位方法具体介绍

id定位

(HTML规定,id在HTML文档中必须是唯一的)
首先打开百度的页面

接着按F12,在elements页签可以看到html代码

现在以百度输入框这个页面元素为例子,要想定位到2这个输入框的位置,要先点1,然后进入到定位模式,这个时候点2,就会在3那里发现输入框2的定位信息,我们可以看到id = “kw”,所以相应的定位方法是find_element_by_id(“kw”),即我们可以通过这个方法找到这个输入框,那么接下来就可以在框里输入一些文字等信息了

同样的方法,我们也可以定位到“百度一下”这个元素,先点1,再点“百度一下”,它的定位信息也会出来,我们可以看到id = “su”,所以相应的定位方法是find_element_by_id(“su”),即我们可以通过这个方法找到这个框,那么接下来就可以进行通过点击这个“百度一下”去进行搜索了

name定位

HTML规定,name用来指定元素的名称,因此它的作用更像是人的姓名
还是以百度的输入框为例,从上面的图中可以看到,name = “wd”,所以相应的方法是:find_element_by_name(“wd”)

class定位

HTML规定,class用来指定元素的类名
还是以百度的输入框为例,从上面的图中可以看到,class = “s_ipt”,所以相应的方法是:find_element_by_class_name(“s_ipt”)

tag定位

HTML通过tag来定义不同页面的元素,比如,标签一般用来定义输入框,标签用来定义超链接等,但是,因为一个标签往往用来定义一类功能,所以通过标签识别单个元素的概率很低,基本上不会用这个方式去进行元素定位
还是以百度的输入框为例,从上面的图中可以看到,tag = “input”,所以相应的方法是:find_element_by_tag_name(“input”)

link定位

它是专门用来定位文本链接的,就是页面上有文本链接(元素标签对之间的文字信息),可以用link来进行定位

从上面的图中可以看到,link= “国家卫健委再次回应春节返乡问题”,所以相应的方法是:find_element_by_link_text(“国家卫健委再次回应春节返乡问题”),定位后,就可以进行操作了

partial link 定位

partial link定位是对link定位的一种补充,有些文字链接比较长,这个时候我们可以取文字链接的部分文字进行定位,只要这部分文字可以唯一地标识这个链接即可
还是以上面的图为例:partial_link= “国家卫健委再次” (这里可以随意截取文字,只要能唯一匹配到整个语句就好),所以相应的方法是: find_element_by_partial_link_text(“国家卫健委再次回”),定位后,就可以进行操作了

XPath定位

XPth定位有几种方式:绝对路径定位,元素属性定位,层级与属性定位,使用运算符,使用contains 方法,使用text()方法
1.绝对路径定位
主要是用标签名的层级关系来定位元素的绝对路径,最外层为html,在body文本内,一级一级往下查找,如果一个层级下有多个相同的标签名,那么就按上下顺序确定是第几个,例如,div[2]就表示当前层级下第二个div标签
如下图,以百度一下的输入框的定位为例,绝对路径是:’/html/body/div/div/div[5]/div/div/form/span/input’
绝对路径比较复杂,而且页面元素的位置可能会变,所以平时最好不要用绝对路径来进行定位

2.元素属性定位
从上图我们可以看到输入框那一行的代码是:<input name = "wd" class = "s_ipt" id = "kw" maxlength = "255" value = " " autocomplete = "off"> ,这里面有一些元素属性,我们可以利用这些元素属性来对输入框这个元素进行定位,有两种写法:(一种是写input,另一种是写*)
一种是:

find_element_by_xpth("//input[@id='kw']"),      find_element_by_xpth("//input[@name='wd']"),  find_element_by_xpth("//input[@class='s_ipt']"),      find_element_by_xpth("//input[@maxlength='255']"),    find_element_by_xpth("//input[@autocomplete='off']")

另外一种是:
find_element_by_xpth("//*[@id='kw']"),      find_element_by_xpth("//*[@name='wd']"),  find_element_by_xpth("//*[@class='s_ipt']"),      find_element_by_xpth("//*[@maxlength='255']"),    find_element_by_xpth("//*[@autocomplete='off']")


3.层级与属性结合定位
如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以查找其上一级元素,如果它的上一级元素有可以唯一标识属性的值,就可以拿来使用,如下图,还是以百度输入框为例,如果这个元素没有可以利用的属性来进行定位,那我们可以找它的上一级或者上上级,直到找到可以利用的元素属性,然后写一下相对路径即可
比如可以写:find_element_by_xpath("//span[@class=‘bg s_ipt_wr’]/input")(这一个好像有一点问题)或者 find_element_by_xpath("//form[@class=‘fm’]/span/input")(这个没有问题)
4.使用运算符
如果一个属性不能唯一区分一个元素,那么可以使用逻辑运算符连接多个属性来查找元素
例如:,这个地方如果觉得一个属性不能唯一区分一个元素,那就可以用多个属性去确定
对应的方法是:find_element_by_xpath("//input[@id=‘kw’ and @class=‘s_ipt’]")

5.使用contains方法
contains 方法用于匹配一个属性中包含的字符串,比如百度输入框的span标签的class属性为:“bg s_ipt_wr”,那定位的时候用contains方法可以只取class属性值的部分
对应的方法是:find_element_by_xpath("//span[contains(@class,‘s_ipt_wr’)]/input")

6.使用text方法
text()方法用于匹配显示文本信息
如下图,对于文本信息
对应的方法是:find_element_by_xpath("//span[text()=‘医院拒诊中高风险地区患者被约谈’]")
当然,contains方法和text()方法是可以结合一起使用的
对应的方法是:find_element_by_xpath("//span[contains(text(),‘医院拒诊中’)]") (亲测有效)

CSS_selector定位

CSS是一种语言,用来描述HTML和XML文档的表现,CSS使用选择器为页面元素绑定属性,它的定位速度比XPath快,但是难度比较大
语法如下:

选择器                           例子                                           描述
.class                         .s_ipt                     class选择器,选择class = "s_ipt"的所有元素
#id                              kw                       id选择器,选择id = "kw"的所有元素*                               *                        选择所有元素
element                          p                        选择所有<p>元素
element>element               div>input                   选择父元素为<div>的所有<input>元素
element+element               div+input                   选择同一级中紧接在<div>元素之后的所有<input>元素
[attribute=value]            [target=_blank]              选择target="_blank"的所有元素

1.通过class定位
还是以百度一下的输入框为例
方法是:find_element_by_css_selector(".s_ipt")
find_element_by_css_selector()方法用于在CSS中定位元素,点号(.)表示通过class来定位元素

2.通过id定位
还是以百度一下的输入框为例
方法是:find_element_by_css_selector("#kw")
find_element_by_css_selector("#su")
#表示通过id来定位元素

3.通过标签名定位(不好用)
还是以百度一下的输入框为例
方法是:find_element_by_css_selector(“input”)
在CSS中,用标签名定位元素时,不需要任何符号标识,直接使用标签名即可,这个虽然简单,但是很难定位到元素,因为,很多标签名是一样的,单靠这个无法定位

4.通过标签层级关系定位(这个确实找到了)
还是以百度一下的输入框为例
方法是:find_element_by_css_selector(“span > input”)
这种写法表示有父元素,父元素的标签名是span,查找span中所有标签名为input的子元素

5.通过属性定位
还是以百度一下的输入框为例
方法是:find_element_by_css_selector("[autocomplete=‘off’]")
find_element_by_css_selector("[name=‘wd’]")
find_element_by_css_selector("[id=‘kw’]")
在CSS中可以用元素的任意属性进行定位,只要这些属性可以唯一标识这个元素,然后对于属性值,可以加单引号,也可以不加,上面我都加了

6.组合定位(可行)
还是以百度一下的输入框为例
方法是:find_element_by_css_selector(“form.fm > span > input.s_ipt”)
find_element_by_css_selector(“form#form > span > input#kw”)
其实这个是比标签层级定位更加详细一点,form.fm也可以不写.fm,form#form可以不写#form

7.其他的定位方法
find_element_by_css_selector("[class *= s_ipt_wr]") 查找class属性包含"s_ipt_wr"字符串的所有元素

find_element_by_css_selector("[class ^= bg]") 查找class属性以"bg"字符串开头的所有元素

find_element_by_css_selector("[class$= wrap]") 查找class属性以"wrap"字符串结尾的所有元素

find_element_by_css_selector(“form > input:nth-child(2)”) 查找form标签下第二个input标签的元素

以上在web页面中如何定位元素的各种方式和方法基本就介绍完了,感觉是比较详细了,而且我都基本亲自操作验证了一遍,如果后面有缺漏或者有新的方法,那我会再进行补充和修改。

参考书目:《Selenium 3 自动化测试实战基于Python语言》

WebDriver定位元素的方法相关推荐

  1. python selenium定位元素方法,python + selenium 练习篇 - 定位元素的方法

    1.利用ID定位元素(能直接通过ID来定位的元素比较少) # coding=utf-8 from selenium import webdriver driver = webdriver.Chrome ...

  2. python网页元素定位_用Selenium进行网页元素定位以及常用的定位元素的方法

    用Selenium进行网页元素定位 一.前提条件: 下载.安装Selenium 二.编写定位网页元素的脚本(这里以定位百度网页的元素举例) 1.新建文本文档(可以用任意的文本编辑器,我这里用的是Pyc ...

  3. python + selenium 练习篇 - 定位元素的方法

    1.利用ID定位元素(能直接通过ID来定位的元素比较少) # coding=utf-8 from selenium import webdriver driver = webdriver.Chrome ...

  4. selenium定位元素的方法_selenium定位元素之冻结窗口

    我们在使用selenium进行元素定位的时候,会发现有很多需要操作的元素是随着鼠标移动与移出才会显示与隐藏,不能通过页面窗口实时看到自己的定位是否准确.这就给我们定位工作带来了一些困扰. 这种情况下我 ...

  5. selenium定位元素的方法

    1.id定位: find_element_by_id() 从上面定位到的搜索框属性中,有个id="kw"的属性,我们可以通过这个id定位到这个搜索框 代码: # coding = ...

  6. python xpath定位元素方法_二、appium+python xpath、android_uiautomator定位元素的方法

    1.继承webdriver的几个常见的定位方法 a.find_element_by_id("id") b.find_element_by_name() #text值,appium ...

  7. [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. selenium之find_element_by_xpath定位元素

    selenium之find_element_by_xpath定位元素 一 方法 selenium为定位元素提供了较多方法,大致分为单元素定位和多元素定位. # 查找单个元素:find_element_ ...

  9. Selenium3自动化测试【21】find_element定位元素

    前面连载的内容,我们介绍了如下8种定位元素的方法. find_element_by_id:通过元素的ID属性值来定位元素: find_element_by_name:通过元素的name属性值来定位元素 ...

最新文章

  1. 为Qt扩展QextSerialPort类
  2. 消息队列—经典5连问—你能抗几道?
  3. 你和PPT高手之间,就只差一个iSlide
  4. AI吉尼斯:那些你不知道的人工智能之“最”
  5. 002_FastDFS单机部署
  6. 实现Runnable接口的形式创建线程
  7. .NET 的一点历史往事:和 Java 的恩怨
  8. 本地线程分配缓冲_线程本地分配缓冲区
  9. 库-libuv:概述
  10. 苹果电脑更改sd卡只读_SD卡变为只读系统
  11. ICCV2021 Oral | UNO:用于“新类发现”的统一目标函数,简化训练流程!已开源!...
  12. 20191025:(leetcode)摆动序列
  13. 简述导线平差计算的五个步骤_附合导线平差计算过程说明
  14. android手机无法开机自动启动,安卓手机无法开机的6种解决方法
  15. 单侧CPK的计算方式
  16. Subversion vs Subclipse
  17. Oracle常用文档整理
  18. 为什么程序员喜欢这些键盘?
  19. opencv 编程总结与备忘
  20. 真香!用Python检测和识别车牌(附代码)

热门文章

  1. mac修改mysql端口
  2. 什么都能播放的媒体播放器——Potplayer
  3. #萌新日志#4.使用Python定时发送微信消息
  4. PW5410A原厂低噪声DC-DC升压开关电容倍压器
  5. 简单文件数据库-模拟图书馆管理系统
  6. Java解析eml邮件格式文件
  7. 保护个人隐私视频文件加密方法两小招
  8. Vue CLI3 移动端适配 【px2rem 或 postcss-plugin-px2rem】
  9. Linux下安装SVN服务端的方法步骤
  10. 企业数据中心如何挑选机柜