Python Selenium 循环查找元素

个人封装的函数分享,直接用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('找到匹配的所有元素了')


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值