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值,代码如下:
#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来定位,代码如下:
#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”,代码如下:
#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进行定位,代码如下:
#大牛测试出品: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
代码如下:
#大牛测试出品: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定位
即用超链接文字的部分文本来定位元素,类似数据库的模糊查询。以“上传资料页面”超链接为例,取“上传资料”便可执行,即取超链接全部文本的一个子集。代码如下:
#大牛测试出品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选择器为例,实现用户名框输入“大牛测试”,代码如下:
#大牛测试出品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名。实现在用户名框输入“大牛测试”,代码如下:
#大牛测试出品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’”,测试代码如下。
#大牛测试出品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。
<?xml version = "1.0" encoding = "utf-8" ?>
<!-- 这是一个注释节点 -->
<animalList type="mammal">
<animal categoruy = "forest">
<name>Tiger</name>
<size>big</size>
<action>run</action>
</animal>
&lt;/animalList&gt; 其中<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]”,完整代码如下:
#大牛测试出品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(&#39;D:\\dr\\chromedriver.exe&#39;)
driver = webdriver.Chrome(service=path)
driver.get(&#39;file:///Users/tim/Desktop/selenium/book/login.html&#39;)
driver.find_element(By.XPATH,&quot;html/body/form/input[1]&quot;).send_keys(&quot;大牛测试&quot;)
(2) 相对路径方式,以相对路径 以//开头,从任何元素节点解析,“*”号表示通配符皮匹配任何元素节点,“.”为选取当前节点,“..” 选取当前节点的父节点,实现在login.html页面登录框输入“测试”,代码如下
#大牛测试出品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(&#39;D:\\dr\\chromedriver.exe&#39;)
driver = webdriver.Chrome(service=path)
driver.get(&#39;file:///D:/selenium/book/login.html&#39;)
driver.find_element(By.XPATH,&quot;//*[@id=&#39;dntest&#39;]&quot;).send_keys(&quot;测试&quot;)
#登录用户名标签是input
driver.find_element(By.XPATH,&quot;//input[@id=&#39;dntest&#39;]&quot;).send_keys(&quot;测试&quot;)
#多个属性条件可用and
driver.find_element(By.XPATH,&quot;//*[@id=&#39;dntest&#39;and @name=&#39;daniu&#39;]&quot;).send_keys(&quot;测试&quot;)
#or只需一个属性条件满足
driver.find_element(By.XPATH,&quot;//*[@id=&#39;dntest&#39; or @name=&#39;daniu&#39;]&quot;).send_keys(&quot;测试&quot;) 除以上常规方法定位,部分复杂控件需要采用模糊定位,用 starts-with与contains
starat-with以某个属性值开始,如login.html用户名为例,id为dntest,可取部分id如dnt代码如下:
driver.find_element(By.XPATH,&quot;//input[starts-with(@id,&#39;dnt&#39;)]&quot;).send_keys(&quot;大牛测试&quot;) contains包含某个属性值,如login.html用户名为例,可取部分id如nte,代码如下:
driver.find_element(By.XPATH,&quot;//input[contains(@id,&#39;nte&#39;)]&quot;).send_keys(&quot;大牛测试&quot;)
tag_name定位
tag_name定位即通过标签名称定位,常用于复合定位,如图1-5所示,定位标签“form”并打印标签属性值“name”。

图1-5
#大牛测试出品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(&#39;D:\\dr\\chromedriver.exe&#39;)
driver = webdriver.Chrome(service=path)
driver.get(&#39;file:///D:/selenium/book/login.html&#39;)
print(driver.find_element(By.TAG_NAME,&quot;form&quot;).get_attribute(&quot;name&quot;))