开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情
元素定位
自动化其中一个重要的点就是模拟鼠标和键盘来操作页面的元素,点击、输入等等。想要操作元素,前提是要找到它们,在WebDriver中,提供来很多定位元素的方法:
- By.ID
- By.NAME
- By.CLASS_NAME
- By.TAG_NAME
- By.LINK_TEXT
- By.PARTIAL_LINK_TEXT
- By.CSS_SELECTOR
- By.XPATH
案例演示
前置准备
这里以百度的首页为例,我们来获取以下它页面中的元素。
# 引入相关的库
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 防止浏览器闪退
options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 引入驱动,构建浏览器对象
path = 'chromedriver.exe'
browser = webdriver.Chrome(service=Service(path), options=options)
# 访问
url = 'https://www.baidu.com/'
browser.get(url)
By.ID
通过属性id定位元素,使用find_element()函数,通过指定所需要查找的类型By.ID,输入要查找的id属性值。
obj = browser.find_element(By.ID, 'su')
print(obj)
print(obj.accessible_name)
By.NAME
通过属性name定位元素
# 通过属性`name`定位元素
obj = browser.find_element(By.NAME, 'wd')
print(obj)
By.CLASS_NAME
通过属性class name定位元素
# 通过属性`class name`定位元素
obj = browser.find_element(By.CLASS_NAME, 's_ipt')
print(obj)
By.TAG_NAME
通过标签名称定位元素。除了find_element函数之外,还有一个find_elements函数,两者的区别是一个只找第一个匹配的,一个是找到所有匹配的,其返回结果是一个列表。
# 通过属性`class name`定位元素
obj = browser.find_element(By.TAG_NAME, 'input')
print(obj)
obj = browser.find_elements(By.TAG_NAME, 'input')
print(obj)
By.LINK_TEXT
通过链接文本定位元素,查找页面中的a标签,查找到文本匹配的节点。
# 通过链接文本定位元素
obj = browser.find_element(By.LINK_TEXT, '图片')
print(obj)
By.PARTIAL_LINK_TEXT
通过部分链接文本定位元素,使用的是模糊搜索,只要包含有关键字的即可。而LINK_TEXT则需要全部匹配上才会命中。
# 通过链接文本定位元素
obj = browser.find_elements(By.PARTIAL_LINK_TEXT, '图')
print(obj)
By.CSS_SELECTOR
通过css选择器定位元素,使用的是bs4的语法。
# 通过链接文本定位元素
obj = browser.find_elements(By.CSS_SELECTOR, '#su')
print(obj)
By.XPATH
通过相对/绝对路径定位元素,使用的是xpath的语法。
# 通过相对/绝对路径定位元素,使用的是`xpath`的语法
obj = browser.find_elements(By.XPATH, '//input[@id="su"]')
print(obj)