selenium库的使用(三):定位元素

selenium提供了多种方法来定位页面中的一个或多个元素,使用哪种方法视情况而定

定位单个元素

方法

以下方法只返回第一个符合的元素

通过元素的id定位

1
2
# 如 <h1 id="yu">雨园博客</h1>
driver.find_element_by_id('yu')

通过元素的name属性值定位

1
2
# 如 <h1 name="yu">雨园博客</h1>
driver.find_element_by_name('yu')

通过元素的名称定位

1
2
# 如 <h1 id="yu">雨园博客</h1>
driver.find_element_by_tag_name('h1')

通过元素的class属性定位

1
2
# 如 <h1 class="yu">雨园博客</h1>
driver.find_element_by_class_name('yu')

通过元素的链接文本定位超链接

1
2
3
4
5
6
# 如 <a href="https://www.gaoyuanqi.cn">雨园博客</a>

# 完全匹配
driver.find_element_by_link_text('雨园博客')
# 部分匹配(文本需连续)
driver.find_element_by_partial_link_text('雨园')

通过Xpath定位

1
driver.find_element_by_xpath('xpath表达式')

通过CSS选择器定位

1
driver.find_element_by_css_selector('CSS选择器')

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')

# 等待2s
time.sleep(2)

# 通过元素的class属性定位
webelement = driver.find_element_by_class_name('gu_shi')
# 打印结果
print(webelement)

# 退出驱动并关闭浏览器
driver.quit()

输出

1
<selenium.webdriver.remote.webelement.WebElement (session="803331c45df05cdb589b0373d6b585ca", element="8a927650-a9af-4a34-9e42-d070d737917a")>

这是一个 WebElement 类对象,该对象的属性和方法可以提取定位元素的文本值、属性值

定位多个元素

方法

只比 find_element 多了一个 s ,将符合的所有元素以列表返回

1
2
3
4
5
6
7
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_xpath()
find_elements_by_css_selector()

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')

# 等待2s
time.sleep(2)

# 通过元素的class属性定位
webelement_list = driver.find_elements_by_class_name('gu_shi')
# 打印结果
print(webelement_list)

# 通过元素的class属性定位第三个元素
webelement = driver.find_elements_by_class_name('gu_shi')[2]
# 打印结果
print(webelement)

# 退出驱动并关闭浏览器
driver.quit()

输出

1
2
3
[<selenium.webdriver.remote.webelement.WebElement (session="bde40b95169dfc20c2f7059ab5776efa", element="d253960a-a760-4f0c-a752-b5f85ca58307")>, <selenium.webdriver.remote.webelement.WebElement (session="bde40b95169dfc20c2f7059ab5776efa", element="ecba2aea-c3ac-4215-88be-9861952506f0")>, <selenium.webdriver.remote.webelement.WebElement (session="bde40b95169dfc20c2f7059ab5776efa", element="9f6ac4a6-3e5d-4e6c-a838-06d2bb4432f8")>, <selenium.webdriver.remote.webelement.WebElement (session="bde40b95169dfc20c2f7059ab5776efa", element="de0d6dc9-188b-443f-828a-ed374a347265")>]

<selenium.webdriver.remote.webelement.WebElement (session="bde40b95169dfc20c2f7059ab5776efa", element="9f6ac4a6-3e5d-4e6c-a838-06d2bb4432f8")>

通用方法

定位单个元素

1
driver.find_element(by, value)

by :查找策略,如 By.ID 定位元素的id
value :定位元素属性的值,默认为 None
示例:通过 (By.ID, 'yu') 定位 id="yu" 的元素

定位多个元素

1
driver.find_elements(by, value)

By类属性

1
2
3
4
5
6
7
8
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')

# 等待2s
time.sleep(2)

# 通过元素的class属性定位
a = driver.find_element(By.CLASS_NAME, 'gu_shi')
b = driver.find_elements(By.CLASS_NAME, 'gu_shi')[2]

# 打印结果
print(a)
print(b)

# 退出驱动并关闭浏览器
driver.quit()

输出

1
2
3
<selenium.webdriver.remote.webelement.WebElement (session="890bb3c0f06118daee625205321b36dd", element="ac1c2ea0-c529-4b81-bb04-37cd7a5f0eac")>

<selenium.webdriver.remote.webelement.WebElement (session="890bb3c0f06118daee625205321b36dd", element="66f381f2-d685-4500-b4c4-de7770cb087a")>