Selenium web UI自动化测试——八大定位方式

在做UI自动化测试时,最重要也最基础的应该是定位控件了,web端有八大定位方式,如下:
在这里插入图片描述

1. driver.find_element_by_id

  • 查看控件id的方法: 进入web,鼠标右键,点击“检查”,调出开发者模式,步骤如下:

在这里插入图片描述

  • 想要查看方法的源码:按住ctrl,再鼠标点击该方法名
  • 通过id定位,id在web端是唯一的

代码如下:

from selenium import webdriver  #从selenium库中导入webdriver模块,selenium底层核心就是webdriver
driver = webdriver.Chrome()  #初始化webdriver(类)的对象,叫driver,初始化后,可以通过对象名.方法名去调用类的方法
driver.get('http://101.133.169.100/yuns/index.php')  #打开项目地址
driver.maximize_window()    #窗口最大化
driver.find_element_by_id('cart_num').click()  #通过id定位控件,并点击这个控件

2. driver.find_element_by_name

在这里插入图片描述

  • 通过name定位,name基本上是唯一的,但也可能不唯一
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://101.133.169.100/yuns/index.php')
driver.maximize_window()
driver.find_element_by_name('key').send_keys('乔丹')   #通过name定位,并输入“乔丹”

3. driver.find_element_by_class_name

在这里插入图片描述

#通过class定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://101.133.169.100/yuns/index.php')
driver.maximize_window()
driver.find_element_by_class_name('but1').click()  #通过class定位
  • 注意

class属性中间有空格时,叫做复合类,复合类一般不建议通过class属性来定位,因为会报错。
解决方法:只写复合类属性的某一部分(不能有空格),但与其他class属性重复的概率就会增加
在这里插入图片描述
在这里插入图片描述

4. driver.find_element_by_xpath

  • 有些控件无法通过id/name/class/link_text定位,可使用xpath定位,是一个路径形态,包括绝对路径(从根节点html开始一层一层往下)和相对路径。使用这种方式,所有控件都可以定位到。
  • 按ctrl+F调出搜索框,在搜索框中输入定位路径
4.1 绝对路径
  • 绝对路径以/开始,层级和层级之间用/分隔,如果该路径下有多个并列的结果,可以添加[数字(从1开始)],让定位的路径唯一化。
    -xpath的下标从1开始
  • 检查定位的路径是否唯一:鼠标放在搜索框,点击回车,定位的高亮光标不会来回切换,则路径是唯一的。

在这里插入图片描述
在这里插入图片描述

Xpath写好之后并验证唯一之后再写进代码。

#通过xpath绝对路径定位
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://101.133.169.100/yuns/index.php')
driver.maximize_window()
driver.find_element_by_xpath('/html/body/div/div/div/div/form/input[1]').click()

绝对路径比较复杂,一般写xpath不太会使用绝对路径,一般使用相对路径。

4.2 相对路径
  • 如果要定位的控件本身没有任何特有属性,但它的父级有id/name/class等属性,此时可以不从根节点开始查找,而是使用相对路径(从它的父级开始查找,如果父级仍然没有特殊属性,可以再往父级的父级找,依次类推)。
  • 相对路径以//开始,如//div[@class=’schbox’]/form/input[1],首先要找的是class属性为schbox的那个div,然后再找这个div下的form下的第1个input

在这里插入图片描述

#通过xpath相对路径定位
#注意单双引号的使用
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://101.133.169.100/yuns/index.php')
driver.maximize_window()
driver.find_element_by_xpath("//div[@class='schbox']/form/input[1]").send_keys('阿迪达斯')
  • 如果定位的控件有自带属性,也可以使用相对路径
    ① 属性唯一:直接@属性,如//input[@class=‘but1’],//input[@placeholder=‘请输入你要查找的关键字’]
    ② 属性不唯一:可以加and,可以加多个and,如//input[@type=‘text’ and @class=‘but1’ and @name=‘key’]
  • 可以不写标签名称input,可以写*,如//*[@class=‘but1’],*是一个正则匹配,不论是什么类型的标签,只要满足后面的限制条件,即class属性是but1即可
  • contains(包含)的用法
    contains是一个关键字,如//input[contains(@placeholder,‘请输入你’)],表示要查找placeholder属性包含“请输入你”的控件,包含内容需要是连续的

5. driver.find_element_by_css_selector

5.1 绝对路径

与xpath绝对路径类似,不过是以>分隔,也可以用空格分隔(不建议,可能会出现跨级查找),不建议使用css的绝对路径查找,因为语法会比较复杂。如:html>body>div>div>div>div>form>input:nth-child(1)
在这里插入图片描述

5.2 相对路径
  • 可以使用控件类型[属性名=’属性内容’],如input[placeholder=‘请输入你要查找的关键字’]
  • 需要使用多个属性来定位:input[name=‘key’][class=‘but1’]
  • 特殊写法:
    定位的控件有class属性,可以用.class属性值定位到,如.but1;也可以在前面添加控件类型,如input.but1
    定位的控件有id属性,可以用#id属性值定位,如#cart_num;也可以在前面添加控件类型,如i#cart_num

在这里插入图片描述

通过控件的上级定位:

写法1:div.schbox>form>input:nth-child(1)  #顺数第一个input,数字可以变
写法2:div[class='schbox']>form>input:nth-child(1)
写法3:form>input:first-child   #要找form下的第一个input,没有second用法
写法4:form>input:last-child   #要找form下的最后一个input
写法5:form>input:nth-last-child(1)  #倒数第1个input

在这里插入图片描述

与xpath的区别,xpath中是把相同标签类型的一起排序,而在css中是同等级的一起排序,以百度为例
在这里插入图片描述

6. driver.find_element_by_link_text

  • a标签,href属性对应了一个链接地址,点击后会跳转到对应界面,对于这种控件可以通过link_text定位
  • 传入的属性是页面可见的文字,最好是双击然后复制到代码里去(自己输入如果输入不准确会定位失败)
  • 从页面来看,就是可点击并跳转的文字,都是可以通过link_text定位的

在这里插入图片描述

#通过link_text定位,适用于a标签,href属性带链接地址的控件
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://101.133.169.100/yuns/index.php')
driver.maximize_window()
driver.find_element_by_link_text('9.9抢大牌').click()

7. driver.find_element_by_partial_link_text

  • 与by_link_text要求的控件要求一样,但只需要传入部分文字,部分文字需要是唯一且连续的
  • 如果匹配到的控件不是唯一的,会定位到第一个匹配到的控件
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://101.133.169.100/yuns/index.php')
driver.maximize_window()
driver.find_element_by_partial_link_text('抢大牌').click() #部分文字匹配

8. driver.find_element_by_tag_name

  • 一般不用tag_name去定位控件,因为一个页面相同标签类型的控件有很多,结果会不精确
driver.find_elements_by_tag_name('input')  #找到当前页面可见的所有input控件
driver.find_element_by_tag_name('input')  #找到当前页面可见的第1个input
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓晓白的软件测试进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值