selenium4自动化测试八大定位高级用法
大牛哥测试
编辑于 2023年04月24日 17:39

        Selenium提供了8种不同的定位方法,分别通过id、name、xpath、class name、tag name、link_text、partial link text及css selector进行定位。在Selenium4.0版本中,定位方法find_element_by_xx被丢弃,采用find_element()方法。具体的使用细节将在本节中详细介绍。

  • id定位HTML Tag的id属性值是唯一的,故不存在根据id定位多个元素的情况。以“login.html”页面用户名输入“大牛测试”为例。用户名 id属性值为“dntest”,如下图1-1所示:

图1-1

“find_element”方法来定位用户名文本框,需传入两个参数,By.ID即通过ID定位元素,另一个参数为id值,代码如下:

代码块
Python
自动换行
复制代码
#coding=utf-8
#大牛测试出品:qq2574674466
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
path =Service('D:\\dr\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
driver.get('file:///D:/selenium/book/login.html')
driver.find_element(By.ID,"dntest").send_keys("大牛测试")
复制成功
  • name 定位上图1-1所示,其name属性值为“daniu”,方法By.NAME表示通过name来定位,代码如下:

代码块
Python
自动换行
复制代码
#coding=utf-8
#大牛测试出品:qq2574674466
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
path =Service('D:\\dr\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
driver.get('file:///D:/selenium/book/login.html')
driver.find_element(By.NAME,"daniu").send_keys("大牛测试")
复制成功
  • class定位以login.html密码框为例,如图1-1所示,其class属性值为“passwd”,在“find_element”方法中参数使用By.CLASS_NAME,另一参数为“passwd”,代码如下:

代码块
Python
自动换行
复制代码
#coding=utf-8
#大牛测试出品:qq2574674466
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
path =Service('D:\\dr\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
driver.get('file:///D:/selenium/book/login.html')
driver.find_element(By.CLASS_NAME,"passwd").send_keys("testdaniu")
复制成功

注意:上例中,用户名也有class属性“f-text phone-input”,因有空格不能直接使用,可以取部分f-text或phone-input进行定位,代码如下:

代码块
Python
自动换行
复制代码
#大牛测试出品:qq2574674466
driver.find_element(By.CLASS_NAME," f-text").send_keys("testdaniu")
driver.find_element(By.CLASS_NAME,"phone-input").send_keys("testdaniu")
复制成功
  • link_text定位

       link_text是以超链接全部名字作为关键字来定位元素的。以login.html页面“上传资料页面”超链接为例如图1-2所示 :

图1-2

代码如下:

代码块
Python
自动换行
复制代码
#大牛测试出品:qq2574674466
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
path =Service('D:\\dr\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
#打开登录页面
driver.get('file:///D:/selenium/book/login.html')
#单击上传资料页面
driver.find_element(By.LINK_TEXT,"上传资料页面").click()
复制成功
  • partial_link_text定位

      即用超链接文字的部分文本来定位元素,类似数据库的模糊查询。以“上传资料页面”超链接为例,取“上传资料”便可执行,即取超链接全部文本的一个子集。代码如下:

代码块
Python
自动换行
复制代码
#大牛测试出品qq:2574674466
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
path =Service('D:\\dr\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
driver.get('file:///D:/selenium/book/login.html')
driver.find_element(By.PARTIAL_LINK_TEXT,"上传资料").click()
复制成功
  • css定位CSS定位的优点是速度快、语法简洁。图1-3中的内容出自W3School的CSS参考手册。CSS定位的选择器有十几种,在本节中主要介绍几种比较常用的选择器

图1-3

以class选择器为例,实现用户名框输入“大牛测试”,代码如下:

代码块
Python
自动换行
复制代码
#大牛测试出品qq:2574674466
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
path =Service('D:\\dr\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
#打开登录页面
driver.get('file:///D:/selenium/book/login.html')
#text与phone之间空格加入“.”
driver.find_element(By.CSS_SELECTOR,".f-text.phone-input").send_keys("大牛测试")
#用.f-text也可
driver.find_element(By.CSS_SELECTOR,".f-text").send_keys("大牛测试")
#用class=’f-text phone-input’text与phone之间空格不需处理
driver.find_element(By.CSS_SELECTOR,"[class='f-text phone-input']").send_keys("大牛测试")
复制成功

由上可知id定位语法结构为:#加id名。实现在用户名框输入“大牛测试”,代码如下:

代码块
Python
自动换行
复制代码
#大牛测试出品qq:2574674466
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
path =Service('D:\\dr\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
#打开登录页面
driver.get('file:///D:/selenium/book/login.html')
#用户名输入大牛测试
driver.find_element(By.CSS_SELECTOR,"#dntest").send_keys("大牛测试")
复制成功

通过常规的标签名称来定位,如用户名框标签为“input”,在标签内部又设置了属性值为“name=’wd’”,测试代码如下。

代码块
Python
自动换行
复制代码
#大牛测试出品qq:2574674466
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
path =Service('D:\\dr\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
#打开登录页面
driver.get('file:///D:/selenium/book/login.html')
#用户名输入大牛测试
driver.find_element(By.CSS_SELECTOR,"input[name='daniu']").send_keys("大牛测试")
复制成功

  • xpath 定位

1.XPath简介

XPath是XML Path语言的缩写,是一种用来确定XML文档中某部分位置的语言。它在XML文档中通过元素名和属性进行搜索,主要用途是在XML文档中寻找节点。XPath定位比CSS定位有更大的灵活性。XPath可以向前搜索也可以向后搜索,而CSS定位只能向前搜索,但是XPath定位的速度比CSS慢一些。

XPath语言包含根节点、元素、属性、文本、处理指令、命名空间等。以下文本为XML实例文档,用于演示XML的各种节点类型,便于理解XPath。

代码块
HTML
自动换行
复制代码
<?xml version = "1.0" encoding = "utf-8" ?>

<!-- 这是一个注释节点 -->

<animalList type="mammal">

    <animal categoruy = "forest">

        <name>Tiger</name>

        <size>big</size>

        <action>run</action>

    </animal>

</animalList>
复制成功

其中<animalList>为文档节点,也是根节点;<name>为元素节点;type=“mammal”为属性节点。

节点之间的关系:

父节点。每个元素都有一个父节点,如上面的XML示例中,animal元素是name、size,以及action元素的父节点。

子节点。与父节点相反,这里不再赘述。

兄弟节点,有些也叫同胞节点。它表示拥有相同父节点的节点。如上代码所示,name、size和action元素都是同胞节点。

先辈节点。它是指某节点的父节点,或者父节点的父节点,以此类推。如上代码所示,name元素节点的先辈节点有animal和animalList。

后代节点。它表示某节点的子节点、子节点的子节点,以此类推。如上代码所示,animalList元素节点的后代节点有animal、name等。

2.XPath语法

XPath来自于XML,又由于HTML语言的语法和XML比较接近,故XPath也支持定位HTML页面元素。下面以login.html登录为例,采用绝对路径与相对路径演示。网页元素如图1-4所示

图1-4

(1) 绝对路径即完整的路径,如login.html页面登录框,绝对路径为“html/body/form/input[1]”,完整代码如下:

代码块
Python
自动换行
复制代码
#大牛测试出品qq:2574674466
#coding=utf-8
from selenium import  webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
path =Service('D:\\dr\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
driver.get('file:///Users/tim/Desktop/selenium/book/login.html')
driver.find_element(By.XPATH,"html/body/form/input[1]").send_keys("大牛测试")
复制成功

(2) 相对路径方式,以相对路径 以//开头,从任何元素节点解析,“*”号表示通配符皮匹配任何元素节点,“.”为选取当前节点,“..” 选取当前节点的父节点,实现在login.html页面登录框输入“测试”,代码如下

代码块
Python
自动换行
复制代码
#大牛测试出品qq:2574674466
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
path =Service('D:\\dr\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
driver.get('file:///D:/selenium/book/login.html')
driver.find_element(By.XPATH,"//*[@id='dntest']").send_keys("测试")
#登录用户名标签是input
driver.find_element(By.XPATH,"//input[@id='dntest']").send_keys("测试")
#多个属性条件可用and 
driver.find_element(By.XPATH,"//*[@id='dntest'and @name='daniu']").send_keys("测试")
#or只需一个属性条件满足
driver.find_element(By.XPATH,"//*[@id='dntest' or @name='daniu']").send_keys("测试")
复制成功

除以上常规方法定位,部分复杂控件需要采用模糊定位,用 starts-with与contains

starat-with以某个属性值开始,如login.html用户名为例,id为dntest,可取部分id如dnt代码如下:

代码块
Python
自动换行
复制代码
driver.find_element(By.XPATH,"//input[starts-with(@id,'dnt')]").send_keys("大牛测试")
复制成功

contains包含某个属性值,如login.html用户名为例,可取部分id如nte,代码如下:

代码块
Python
自动换行
复制代码
driver.find_element(By.XPATH,"//input[contains(@id,'nte')]").send_keys("大牛测试")
复制成功
  • tag_name定位

tag_name定位即通过标签名称定位,常用于复合定位,如图1-5所示,定位标签“form”并打印标签属性值“name”。

图1-5

代码块
Python
自动换行
复制代码
#大牛测试出品qq:2574674466
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
path =Service('D:\\dr\\chromedriver.exe')
driver = webdriver.Chrome(service=path)
driver.get('file:///D:/selenium/book/login.html')
print(driver.find_element(By.TAG_NAME,"form").get_attribute("name"))
复制成功