在之前章节,我们已接触了webdriver中的8种基础定位方法,但是当我们在pycharm中打出:driver.find时,代码提示中其实是有18个被选项的,这里我们来讲讲剩余这10种定位方法都是什么,以及它们之间存在的关系。

首先有两个万能定位方法:

find_element()寻找符合条件的第一个元素

find_elements()寻找所有符合条件的元素

剩余八种,其实和之前介绍的是一样的,只不过element变为了:elements,意思是查找所有符合条件的元素

find_elements_by_id()
find_elements_by_name()
find_elements_by_tag_name()
find_elements_by_class_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_css_selector()
find_elements_by_xpath()
find_element()定位方法详解-3种写法
关于元素定位的方法,以后都主要推荐使用find_element() 和find_elements(),为什么呢,我们进入源码后发现,所有的定位方法,在源码中其实都是引用的find_element()和find_elements()方法,所以我们可以直接使用这两个方法即可。
Web自动化测试:webdriver所有定位方式详解_第1张图片

引用By方法传递定位类型
这个方法是根据源码中的传递方式来写的,我们由上图可以发现,在webdriver中的参数传递用到了By,也就是要先引用这个类,具体方法如下:

使用时先在页面开始引入By方法:

from selenium.webdriver.common.by import By
代码中通过By.##这种形式来确定定位的类型

示例:driver.find_element(By.NAME, "kw1")
而具体的引用类型如下所示:

By.ID
By.XPATH
By.LINK_TEXT
By.PARTIAL_LINK_TEXT
By.NAME
By.TAG_NAME
By.CLASS_NAME
By.CSS_SELECTOR

使用字符串传递定位类型

这个方法其实是更深一步的用法,我们进入By这个类的源码时,会发现By所引用的八种定位类型,其实都是对应的字符串,也就是说我们其实可以不使用By类,直接使用程序中已经封装好的字符串类型。

Web自动化测试:webdriver所有定位方式详解_第2张图片
具体使用时是这样的展示形式:

示例:driver.find_element("name", "kw1")
而字符串引用类型和By方法类型对照如下

使用元组传递定位类型以及路径
这种方法主要适用于自己封装的框架中,如果不使用元组传值,我们每次要传递两个参数:定位类型、定位路径,使用元组后可以把定位类型和路径先放在元组里,然后在使用的时候直接传递元组就好了;虽然看起来好像麻烦了,但是在实际的框架中,相当于一个数据和逻辑的分离,能更方便的维护数据。

具体写法如下:

element_loc = ("name", "kw1")

driver.find_element(*element_loc)
实例讲解:
在这里我们还是以百度贴吧为例子,我们演示下三种定位传递的方式,都可以成功定位;然后是获取一组元素,例如获取贴吧首页中所有的链接内容和链接地址。

代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()

# 打开百度贴吧首页
driver.get("https://tieba.baidu.com/")

# 贴吧首页搜索栏输入信息(使用3种不同方式)
element_loc = ("name", "kw1")
driver.find_element(By.NAME, "kw1").send_keys("1.使用By.NAME---")
driver.find_element("name", "kw1").send_keys("2.使用字符串:name---")
driver.find_element(*element_loc).send_keys("3.传递元组")

# 获取一组元素
# 获取所有a标签元素**
a_tag_list = driver.find_elements(By.TAG_NAME, "a")
for tags in a_tag_list:

打印出来满足条件的元素内容以及元素中的href属性

print((tags.text, tags.get_attribute("href")))

三种定位传递方式结果:Web自动化测试:webdriver所有定位方式详解_第3张图片