web自动化测试第13步:元素定位(2)(webdriver的所有定位方式详解)

一、webdriver中所有的定位方法介绍

      在第二节里,我们就接触了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自动化测试第13步:元素定位(2)(webdriver的所有定位方式详解)_第1张图片

使用这两个方法,其实还有几种不同的写法,这里介绍三种,看哪个顺手就用哪种写法:

2.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

2.2.使用字符串传递定位类型

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

web自动化测试第13步:元素定位(2)(webdriver的所有定位方式详解)_第2张图片

我们在具体使用时是这样的展示形式:

示例:driver.find_element("name", "kw1")

而字符串引用类型和By方法类型对照如下

By引用写法 对应字符串写法
By.ID "id"
By.XPATH "xpath"
By.LINK_TEXT "link text"
By.PARTIAL_LINK_TEXT "partial link text"
By.NAME "name"
By.TAG_NAME "tag name"
By.CLASS_NAME "class name"
By.CSS_SELECTOR "css selector"

2.3.使用元组传递定位类型以及路径

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

具体写法如下:

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自动化测试第13步:元素定位(2)(webdriver的所有定位方式详解)_第3张图片

获取了所有a标签,并打印a标签的内容和链接属性

web自动化测试第13步:元素定位(2)(webdriver的所有定位方式详解)_第4张图片

你可能感兴趣的:(webdriver,selenium,UI自动化,元素定位,find_element,web自动化测试)