版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CCGGAAG/article/details/86325903
一、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()方法,所以我们可以直接使用这两个方法即可。
使用这两个方法,其实还有几种不同的写法,这里介绍三种,看哪个顺手就用哪种写法:
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类,直接使用程序中已经封装好的字符串类型。
我们在具体使用时是这样的展示形式:
示例: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")))
三种定位传递方式结果:
获取了所有a标签,并打印a标签的内容和链接属性