• selenium 等待方式


    概述

    在selenium中,等待指的是在执行下一个任务之前需要等待前一个任务完成,在前一个任务没有完成之前,后一个任务会一直处于阻塞状体,有点类似于数据库中的事务。比如,在定位元素之前需要加载完DOM。selenium有三种等待方式:显示等待、隐式等待、流畅等待。

    方式

    显示等待

    WebDriverWait(driver, timeout).until(method, message)
    
    • 1

    显示等待是selenium客户可以使用的命令式过程语言。它们允许您的代码暂停程序执行,或冻结线程,直到满足通过的条件。这个条件会以一定的频率一直被调用,直到等待超时。这意味着只要条件返回一个假值,它就会一直尝试和等待。这种方式也是最常使用的一种方式。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions
    
    driver = webdriver.Chrome()
    driver.get("http://www.example.com")
    # 设置隐式等待
    # locator可以是元组(),集合{},列表形式
    # 函数presence_of_element_located表示检查页面的 DOM 上是否存在元素
    # 如果html中没有标签为p的元素,则等待三秒后抛出异常
    WebDriverWait(driver, timeout=3).until(expected_conditions.presence_of_element_located({By.TAG_NAME, "p"}))
    # 如果html中存在标签为p的元素,则找到这个元素
    element = driver.find_element(By.TAG_NAME, "p")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    隐式等待

    driver.implicitly_wait(time_to_wait)
    
    • 1

    隐式等待,WebDriver在试图查找任何元素时在一定时间内轮询DOM。如果该元素不存在,则超过设定的时间后会抛出异常。当网页上的某些元素不是立即可用并且需要一些时间来加载时是很有用的。

    隐式等待是告诉WebDriver如果在查找一个或多个不是立即可用的元素时轮询DOM一段时间。默认设置为0,表示禁用。一旦设置好,隐式等待就被设置为会话的生命周期。也就是说,设置隐式等待后,在执行任何操作比如查找元素,都有一定时间的限制,如果超过这段时间,就会抛出异常。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome()
    # 设置隐式等待,等待时间为5秒
    driver.implicitly_wait(5)
    # 设置隐式等待后,如果5秒内没有获取到目标DOM,则抛出异常
    driver.get("http://www.example.com")
    # 设置隐式等待后,如果5秒内没有获取到元素a,则抛出异常
    element = driver.find_element(By.TAG_NAME, "a")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    流畅等待

    WebDriverWait(driver, timeout, poll_frequency, ignored_exceptions).until(method, message)
    
    • 1

    流畅等待实例定义了等待条件的最大时间量,以及检查条件的频率。用户可以配置等待来忽略等待时出现的特定类型的异常,例如在页面上搜索元素时出现的NoSuchElementException。

    from selenium import webdriver
    from selenium.common import ElementNotVisibleException, ElementNotSelectableException
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions
    
    driver = webdriver.Chrome()
    driver.get("http://www.example.com")
    # 设置流畅等待
    # 超时时间为10秒,每隔1秒检查一下是否出现ElementNotVisibleException,ElementNotSelectableException这两个异常,如果出现这两个异常,则忽略它
    wait = WebDriverWait(driver, timeout=10, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException,
                                                                                   ElementNotSelectableException])
    wait.until(expected_conditions.element_to_be_clickable((By.TAG_NAME, "h")))
    element = driver.find_element(By.TAG_NAME, "p")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    由于必须同步DOM和指令是相当常见的情况,所以大多数客户端还附带一组预定义的等待条件 。顾名思义,它们是为频繁等待操作预定义的条件。下面是一些可选的等待条件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    wy的leetcode刷题记录_Day45
    Java Web——JS中的BOM
    华为OD机试 - 机器人走迷宫 - 深度优先搜索dfs(Java 2023 B卷 200分)
    C++中的强制转换
    关于多个elementui的cascader级联组件页面滚动渲染样式导致卡顿问题
    git---更新gitignore文件,使之生效
    如何构建无服务器 WebSockets 平台
    4 OpenCV实现多目三维重建(多张图片增量式生成稀疏点云)【附源码】
    PX30 android8.1添加RTL8723DU
    Sulfo-Cy5 羧酸,Sulfo-Cyanine5 carboxylic acid,花青素荧光染料Cy5标记羧酸
  • 原文地址:https://blog.csdn.net/weixin_49346755/article/details/125627220