个人封装的函数分享,直接用CSS选择器定位元素,简单方便。
复制到自己的代码里就能直接调用。
解决等待元素加载、查找单个元素或多个元素、如果有找到怎么办,没找到怎么办等需求。
灵活调整查找时间和频率,个人感觉比 implicitly_wait() 和 expected_conditions之类的好用多了。
封装的函数
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 查找元素
def FindElement(Driver,
Selector: str,
FindAll: bool = False,
While: bool = True,
WhileTime: int = 30,
FindFrequency: float = 0.5,
):
"""查找HTML元素,使用CSS选择器
Args:
Driver (_type_): WebDriver对象
Selector (str): CSS选择器,元素查找规则
FindAll (bool, optional): 返回全部匹配的元素列表
While (bool, optional): 循环查找元素
WhileTime (int, optional): 循环时间
FindFrequency (float, optional): 元素查找频率
"""
def CSS(Driver, Selector, FindAll):# 根据css选择器查找元素
try:# 返回第一个匹配的元素。
if not FindAll: return Driver.find_element(By.CSS_SELECTOR, Selector)
# 返回全部匹配的元素列表。
else: return Driver.find_elements(By.CSS_SELECTOR, Selector)
except: return False # 找不到返回False
Count = time.time() # 记录时间
while True:
time.sleep(FindFrequency) # 延时
element = CSS(Driver, Selector, FindAll)
if element: return element # 找到元素后返回出去
elif not While: return element # 如果禁止循环,直接返回结果
elif time.time()-Count > WhileTime: return element # 超过指定时间终止循环
使用示例:
import re, time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 查找元素
def FindElement(Driver,
Selector: str,
FindAll: bool = False,
While: bool = True,
WhileTime: int = 30,
FindFrequency: float = 0.5,
):
"""查找HTML元素,使用CSS选择器
Args:
Driver (_type_): WebDriver对象
Selector (str): CSS选择器,元素查找规则
FindAll (bool, optional): 返回全部匹配的元素列表
While (bool, optional): 循环查找元素
WhileTime (int, optional): 循环时间
FindFrequency (float, optional): 元素查找频率
"""
def CSS(Driver, Selector, FindAll):# 根据css选择器查找元素
try:# 返回第一个匹配的元素。
if not FindAll: return Driver.find_element(By.CSS_SELECTOR, Selector)
# 返回全部匹配的元素列表。
else: return Driver.find_elements(By.CSS_SELECTOR, Selector)
except: return False # 找不到返回False
Count = time.time() # 记录时间
while True:
time.sleep(FindFrequency) # 延时
element = CSS(Driver, Selector, FindAll)
if element: return element # 找到元素后返回出去
elif not While: return element # 如果禁止循环,直接返回结果
elif time.time()-Count > WhileTime: return element # 超过指定时间终止循环
Driver = webdriver.Edge()
Driver.get('https://www.baidu.com/')
# 定位顶部的“新闻”
Selector = '#s-top-left > [href="http://news.baidu.com"]'
# 开始查找元素。
# 默认匹配一个元素,循环查找30秒,间隔0.5秒,如果找不到会返回False
Element = FindElement(Driver, Selector)
# 判断是否有找到元素,有的话对元素执行进一步操作
if Element:
print('找到元素了')
# Element.click()
# 定位顶部的所有选项“新闻”、“hao123”、“地图”、“贴吧”等等
Selector = '#s-top-left > [href]'
# 返回匹配到的所有元素
Elements = FindElement(Driver, Selector, True)
if Elements:
print('找到匹配的所有元素了')