Selenium3 Python WebDriver API源码探析(8):等待(显式等待、隐式等待)、超时(页面加载超时、异步脚本调用超时)

【Python爬虫】Message: timeout: timed out receiving message from renderer: xxx(Session info: chrome=xxx) 主要问题是:Message: timeout: timed out receiving message from renderer: xxx.xxx(Session info: chrome=xxxxxx),我的解决方案是(因为我爬取的网页所含图片挺多的)——添加不加载图片的设置,这样可以有效地提高爬取网页的速度。 阅读详情

等待概述

使用Selenium操控浏览器时,等待非常重要,因为浏览器进行渲染、执行交互都是非常耗费时间的,另外由于网络等因素,经常出现我们需要操纵的DOM元素未就绪的情况,此时经常抛出NoSuchElementException异常。

为了解决这一问题有两种处理策略:

  • 被动等待。执行完一个比较耗时的操作后,使用time.sleep()等待一段时间,然后再继续执行。这种策略的问题在于不够灵活,等待时间无法预测,时间过长浪费时间,时间过短仍然可能导致异常。
  • 主动检测。不断轮询元素是否就绪。这样程序稍微复杂一些。

Selenium中的等待机制

Selenium内置了等待机制,一种是显示等待,一种是隐式等待。

  • 显式等待:采用主动检测策略,根据条件进行等待。
  • 隐式等待:采用被动等待策略,全局性固定等待时间。

显式等待

该功能由selenium\webdriver\support\wait.py中的WebDriverWait类实现。
WebDriverWait类签名:class selenium.webdriver.support.wait.WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
构造函数参数:

  • driver:WebDriver 实例。必备参数。
  • timeout:超时秒数。浮点数。单位为秒。必备参数。
  • poll_frequency :轮询频率,即每次轮询的间隔秒数。浮点数。单位为秒。默认值为0.5秒。可选参数。
  • ignored_exceptions:轮询时忽略的异常类。可迭代结构。默认只包含一个元素,即NoSuchElementException 。可选参数。

until(method, message='')方法是WebDriverWait类中最关键的方法。
作用:当返回值不为False时,调用method。
参数:

  • method:可调用对象,参数为当前WebDriver实例。
  • message:超时抛出异常时的提示。
    返回值:最后一次调用method的结果。

until_not(method, message='')方法与until(method, message='')方法非常相似,只是作用条件相反。
作用:当返回值为False时,调用method。
参数:

  • method:可调用对象,参数为当前WebDriver实例。
  • message:超时抛出异常时的提示。
    返回值:True或者超时异常。

案例:演示显式等待

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 当lambda d: d.find_element_by_id("kw")返回值为True,即定位到id为kw的元素时,停止轮询,返回d.find_element_by_id("kw")
# 当函数返回值False时,持续轮询,要么返回值为True,要么超时
el = WebDriverWait(driver, 5).until(lambda d: d.find_element_by_id("kw"))
print(type(el))
# 当lambda d: d.find_element_by_id("kw1")抛出被忽略的异常(默认即NoSuchElementException),停止轮询,返回True
is_disappeared1 = WebDriverWait(driver, 5, 1,).until_not(
    lambda d: d.find_element_by_id("kw1"))
print(is_disappeared1)
# 当lambda d: d.find_element_by_id("kw")未抛出异常时,持续轮询,要么抛出被忽略的异常返回值为True,要么超时
is_disappeared2 = WebDriverWait(driver, 5, 1,).until_not(
    lambda d: d.find_element_by_id("kw"), "超时")
print(is_disappeared2)

结果

<class 'selenium.webdriver.firefox.webelement.FirefoxWebElement'>
True
Traceback (most recent call last):
  File "c:/Users/Administrator/Desktop/selenium_learning/8 wait.py", line 16, in <module>
    lambda d: d.find_element_by_id("kw"),"超时")
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\support\wait.py", line 96, in until_not
    raise TimeoutException(message)
selenium.common.exceptions.TimeoutException: Message: 超时

演示使用常规函数作为检测条件

until(method, message='')方法和until_not(method, message='')方法中的method参数,既可以使用匿名函数也可以使用常规函数。

需要注意的是,返回值至关重要,因为这两个方法的行为与返回值息息相关。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")

def check_element1(d):
    return d.find_element_by_id("kw")

def check_element2(d):
    return d.find_element_by_id("kw").get_attribute("value")
    
# check_element1函数返回值为百度搜索框元素,即True,因此会返回该元素
el1 = WebDriverWait(driver, 5).until(check_element1)
print(type(el1))
# check_element2函数返回值为百度搜索框的值,默认为空即False,因此会不断轮询,直到超时抛出异常
el2 = WebDriverWait(driver, 5).until(check_element2)
print(type(el2))
driver.quit()

结果为:

<class 'selenium.webdriver.firefox.webelement.FirefoxWebElement'>
Traceback (most recent call last):
  File "c:/Users/Administrator/Desktop/selenium_learning/8 wait.py", line 15, in <module>
    el2 = WebDriverWait(driver, 5).until(check_element2)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

期望异常条件

在WebDriverWait类的构造函数中ignored_exceptions默认值为None,即默认包含NoSuchElementException异常类。
为了便于使用,Selenium内置了一系列异常类,这些类定义在selenium\webdriver\support\expected_conditions.py中。
可以通过selenium.webdriver.support.expected_conditions包导入相关类。

隐式等待

该功能由selenium\webdriver\remote\webdriver.py中的WebDriver类实现。

功能:在当前会话生命周期中全局性为所有操作设置统一的超时时间,如果超时时间内操作完成,则继续其他操作,如果操作未完成则继续轮询,直到超时。例如:在设置隐式等待10秒后,如果需要定位某元素,该元素3秒后被定位到,那么继续向下执行,如果该元素未定位到,那么一直轮询,等超过10秒后抛出超时异常。
签名: driver.implicitly_wait(time_to_wait)
参数:time_to_wait:等待时间。浮点数。单位为秒。必备参数。
注意事项:隐式等待不推荐与显式等待同时使用,将会导致不可预测的等待时间。

案例:演示隐式等待

本案例中虽然设置了隐式等待10秒钟,但是定位id为kw的元素0.01秒就完成了,所以继续向下执行。定位页面上不存在的id为kw1的元素时,由于该元素一直未成功定位,因此一直轮询,10秒后超时。

import time

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
start = time.time()
el1 = driver.find_element_by_id("kw")
end1 = time.time()
print(end1-start)
# 定位不存在的元素,验证等待时长
try:
    el2 = driver.find_element_by_id("kw1")
except:
    end2 = time.time()
    print(end2-end1)
driver.quit()

结果为:

0.008975505828857422
10.01714825630188

超时

页面加载超时

该功能由selenium\webdriver\remote\webdriver.py中的WebDriver类实现。

功能:设置页面加载超时时间。
签名: driver.set_page_load_timeout( time_to_wait)
参数:time_to_wait:等待时间。浮点数。单位为秒。必备参数。

异步JavaScript脚本调用超时

该功能由selenium\webdriver\remote\webdriver.py中的WebDriver类实现。

功能:设置execute_async_script方法异步调用JavaScript脚本超时时间。
签名: driver.set_script_timeout(time_to_wait)
参数:time_to_wait:等待时间。浮点数。单位为秒。必备参数。

Selenium无头模式与智能等待:构建稳定高效Python爬虫的核心技术 在Python网络爬虫开发中,自动化测试框架Selenium因其强大的浏览器模拟能力而被广泛应用。其核心原理是通过WebDriver协议控制浏览器,实现对动态网页的完整渲染与交互。这项技术的核心价值在于能够处理JavaScript动态加载的内容,克服了传统静态爬虫的局限性。在实际工程实践中,爬虫的稳定性与资源效率是两大关键挑战,这直接关系到数据采集的成功率与系统性能。针对服务器部署和静默运行场景,无头模式通过禁用图形界面来节省资源并适应无显示器环境;而智能等待策略则通过条件轮询机制替代固定休眠,精准同步页面 阅读详情

相关推荐

Selenium爬虫实战:破解动态加载页面数据抓取难题

在Web数据抓取领域,动态加载技术已成为常见挑战,它通过JavaScript异步请求数据,使得传统基于HTTP请求的爬虫难以获取完整内容。其核心原理在于现代单页应用(SPA)采用前后端分离架构,初始HTML仅为空壳,真实数据需JS执行后填充。为应对此问题,Selenium等浏览器自动化工具展现出重要技术价值,它们通过驱动真实浏览器、完整执行JavaScript并渲染DOM,能够获取与用户所见一致的最终页面内容。在电商价格监控、社交媒体动态采集及登录后数据获取等应用场景中,Selenium通过模拟点击、输入、

wjxbj的博客 603

Selenium的WebDriver操作页面的超时或者元素重叠引起的ElementClickInterceptedException

1.设置隐式等待时间: 使用 implicitly_wait 方法可以设置隐式等待时间,让 Selenium 等待一定时间,直到元素出现在页面上或等待超时。这个等待时间适用于整个 WebDriver 对象的生命周期,它会在每个 find_element 或 find_elements 方法调用时生效。2.使用显式等待: 使用 WebDriverWait 类和 expected_conditions 来等待特定条件的满足,例如等待某个元素可见、存在或可点击。这样,您可以更精确地控制等待的条件和最大等待时间。

昊天罔极的博客 1050

Python Selenium爬虫实战:破解JS动态渲染页面数据抓取难题

在Web数据抓取领域,传统基于HTTP请求的爬虫技术(如requests、Scrapy)面临一个普遍挑战:现代前端框架(Vue、React)广泛应用JavaScript动态渲染,导致服务器返回的初始HTML中不包含完整数据,数据需经浏览器执行JS后才能生成。这种异步加载机制使得静态抓取方法失效。其核心原理在于页面内容通过AJAX、Fetch API等技术异步获取并动态插入DOM。为应对此挑战,浏览器自动化工具应运而生,它通过模拟真实用户操作,控制浏览器完整加载并执行JS,从而获取最终渲染后的页面内容。这在电

weixin_34331102的博客 424

python timeoutexception_获取不到toast,提示selenium.common.exceptions.TimeoutException: Message:...

#-*-coding:utf-8-*-fromappiumimportwebdriverfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEcimporttimecapabilites={"platf...

weixin_42159267的博客 1032

Go语言驱动Selenium WebDriver:从环境搭建到高级交互的完整指南

UI自动化测试是保障Web应用质量的关键技术,其核心在于通过程序模拟真实用户操作。Selenium WebDriver作为行业标准协议,提供了跨浏览器、跨平台的控制能力,而Go语言凭借其高效的并发模型和卓越的执行性能,成为构建高并发、高性能自动化框架的理想选择。在爬虫、大规模回归测试和监控等场景下,Go与Selenium的结合能显著提升任务执行效率与资源利用率。本文将深入解析Go语言下Selenium WebDriver的完整实践路径,涵盖环境配置、元素定位、页面交互、等待机制等核心模块,并针对高并发处理和

weixin_33843947的博客 399

selenium3源码解析Python篇(十六)-webdriver源码解析

此章为核心模块,内含对浏览器的各种操作!!! 目录结构如下: class WebDriver(object): 将命令通过WebDriver wire protocol协议发送到服务器 session_id: 由此webdriver启动和控制浏览器的会话id capabilities: 远端服务器以字典形式返回有效功能,并非所有服务器实现都将支持每种WebDriver功能。 因此,在描述用户请...

m0_37623792的博客 1491

selenium.common.exceptions.TimeoutException: Message:

问题: 用python selenium在爬取淘宝等电商网站时,出现如下报错: 原因: 淘宝等电商网站有反爬取机制,你用了同个ip地址多次爬取,会被侦测到并且拉黑。 解决: 换个ip地址即可,简而言之,换个淘宝账号就行。 ...

weixin_47498728的博客 1780

Selenium动态网页爬取实战:从环境搭建到滚动加载数据抓取

在Web开发中,动态渲染技术通过JavaScript异步加载数据,已成为现代网站的主流。其核心原理是浏览器执行JavaScript脚本,向后台API发起Ajax请求获取数据并动态更新DOM,这导致传统基于HTML源码解析的爬虫方法失效。为解决这一问题,Selenium作为浏览器自动化工具应运而生,它通过WebDriver驱动真实浏览器,能够完整执行JavaScript并渲染最终页面,从而获取动态内容。在工程实践中,Selenium结合显式等待机制和CSS选择器定位,可高效处理电商商品列表、社交媒体瀑布流等常

csdndownload11123的博客 339

Selenium3 Python WebDriver API源码探析(9):JavaScript原生警告框(alert)、确认框(confirm)、提示框(prompt)处理

弹窗提示概述 Selenium专门提供了用于处理JavaScript原生弹窗提示的API。 这些JavaScript原生提示包括警告框(alert)、确认框(confirm)、提示框(prompt),它们由浏览器提供限定的样式。 警告框(alert)构成主要包括提示文本和确定按钮。 确认框(confirm)构成主要包括提示文本、确定按钮和取消按钮。 提示框(prompt)构成主要包括提示文本、输入框、确定按钮和取消按钮。 Selenium弹窗提示API Selenium用于处理Java

mighty13的专栏 3万+

Python Selenium实战:破解闲鱼懒加载,批量抓取商品数据

动态网页数据抓取是网络爬虫领域的核心挑战之一,其原理在于现代网站普遍采用JavaScript异步加载技术(如懒加载)来提升用户体验,这导致传统的静态HTML解析方法失效。从技术价值看,掌握动态内容渲染的应对策略,能极大拓展数据采集的范围与深度,是进行市场分析、价格监控和竞品研究的基础能力。在应用场景上,电商平台、社交媒体等强交互站点都是典型代表。本文以闲鱼商品抓取为例,深入探讨了如何利用Selenium模拟真实浏览器操作,通过渐进式滚动和显式等待触发懒加载机制,并结合XPath精准解析,最终实现完整数据的稳

weixin_34221773的博客 480

Selenium WebDriver核心原理与UI自动化测试实战指南

UI自动化测试是软件质量保障的关键环节,其核心在于通过程序模拟真实用户操作,实现Web应用的自动化验证与交互。其底层原理基于客户端-服务器架构和标准化的通信协议,使得不同编程语言能够统一控制浏览器行为。这一技术为持续集成、回归测试和流程自动化提供了坚实基础,显著提升了测试效率和软件交付质量。在众多工具中,Selenium WebDriver凭借其W3C标准协议和跨语言支持,成为行业广泛采用的解决方案。本文聚焦于Selenium WebDriver的架构设计、元素定位策略和等待机制,并结合Python实战演示

weixin_30335353的博客 344

Selenium爬虫卡顿问题深度解析:从等待策略到实战调试

在Web自动化测试与数据爬取领域,处理页面异步加载和动态内容是核心挑战。其原理在于浏览器渲染线程与自动化指令执行之间的时序不匹配,导致元素查找或交互失败。掌握显式等待、页面状态判断等关键技术,能显著提升脚本的稳定性和执行效率。这些方法在**数据采集**、**自动化测试**等场景中尤为重要,尤其在处理现代单页应用(SPA)时。本文聚焦Selenium自动化中常见的“卡住”现象,系统剖析其成因,并提供从基础等待到高级调试的完整解决方案,帮助开发者构建更健壮的自动化流程。

weixin_33859231的博客 390

SpringBoot集成Selenium:从自动化脚本到生产级服务的完整实践

Web自动化测试与数据抓取是软件开发和运维中的常见需求,其核心原理是通过程序控制浏览器模拟用户操作,实现页面交互与内容提取。这项技术的核心价值在于提升测试效率、实现数据自动化采集,并广泛应用于回归测试、监控巡检和数据聚合等场景。在Java技术栈中,Selenium作为成熟的自动化框架,与SpringBoot的深度整合能将其从临时脚本升级为可维护、可调度的生产级服务。通过依赖注入和配置化管理,开发者可以轻松实现定时任务调度、REST API触发以及与数据库的无缝集成。本文聚焦于SpringBoot项目中Sel

一个2年工作经验的程序测试员 424

Selenium自动化测试:四种等待机制深度解析与最佳实践

在Web自动化测试中,页面元素的动态加载与异步交互是核心挑战,直接关系到脚本的稳定性和执行效率。其原理在于浏览器与服务器之间的网络延迟、前端框架的异步渲染机制,使得测试脚本必须与页面状态保持同步。掌握高效的等待策略,对于提升自动化测试的健壮性和可维护性具有重要技术价值,能有效避免因元素未就绪而导致的NoSuchElementException等常见错误。在实际应用场景中,无论是处理AJAX加载、单页应用(SPA),还是集成到Page Object设计模式与CI/CD流水线,合理的等待机制都是保障测试可靠性的

weixin_30279315的博客 358

Seurat3.0小提琴图腰围的参数

小提琴图没有有些群没有出现小提琴只有点点,是由于0值比例太多, 一个关键的参数scale = "width"导致了这种局面,应加上上述参数 ggplot(p$data,aes(ident,CD4)) + geom_violin(scale = "width", adjust =1, trim = TRUE) + geom_jitter()+ theme_bw() adjust参数可以调整腰的粗细,eg: ggplot(p$data,aes(ident,CD4)) + geom_violin(scale

Demomwu的博客 1661

ARM Cortex-M系列授权解析:从研发到量产的免费与付费之路

本文深入解析了ARM Cortex-M系列内核从研发到量产过程中的授权模式。研发阶段可利用ARM DesignStart等免费资源进行原型验证,但产品商业化量产则需支付授权费与版税。文章对比了采购商用MCU与自研芯片的成本差异,并探讨了RISC-V作为免费替代方案在IoT领域的应用前景与挑战,为开发者提供了清晰的选型指南。

weixin_29292431的博客 494

Web自动化测试中的等待机制:从原理到实战的完整指南

在Web自动化测试和爬虫开发中,等待机制是确保脚本稳定运行的核心技术。其原理在于同步脚本执行与页面动态加载状态,解决因异步渲染导致的元素定位失败问题。通过合理运用等待策略,可以显著提升自动化脚本的可靠性和执行效率。技术价值体现在减少脚本的脆弱性,避免因网络延迟或前端框架异步加载引发的随机失败。应用场景广泛覆盖UI自动化测试、数据抓取和RPA流程自动化。本文深入解析了强制等待、隐式等待和显式等待的区别,并重点探讨了Selenium的WebDriverWait与Playwright的智能等待机制,通过实战案例展

weixin_33919950的博客 340

机械设计师必看:如何用Autodesk Inventor高效完成钣金设计(附实战案例)

本文为机械设计师详细解析了如何利用Autodesk Inventor Professional高效完成钣金设计。文章通过一个钣金防护罩的实战案例,系统介绍了从核心设计逻辑、建模流程、参数化技巧到工程图输出的完整工作流,旨在帮助设计师掌握智能化的设计方法,显著提升从概念到制造的设计效率与准确性。

honey的博客 1181

Python Selenium自动化登录实战:从环境搭建到反爬策略

Web自动化是提升工作效率、实现流程自动化的关键技术,其核心原理是通过程序模拟用户操作浏览器,完成点击、输入、导航等交互行为。在技术实现上,Selenium作为主流的浏览器自动化工具,通过WebDriver协议与浏览器通信,实现对页面元素的精准定位与操作。这项技术的价值在于将重复性高、规则明确的网页操作转化为可配置、可复用的代码,广泛应用于软件测试、数据采集和办公自动化等领域。以自动化登录场景为例,开发者需要掌握环境配置、元素定位、等待策略等核心技能,并应对验证码、反爬检测等挑战。本文以智慧树平台为例,详细

weixin_34342992的博客 829

网站进行企业微信授权登录(附带代码超详细版)

企业微信的扫码登录官方文档 https://work.weixin.qq.com/api/doc/90000/90135/90988 企业微信扫码登录认证流程 上面是官方的图片,看上去比较复杂。因此我用直白简洁的语言梳理下流程。 1、首先在自己的网站上获取到企业微信登录的二维码(二维码怎么获取稍后再说,这里想象下你已经有了一个二维码) 2、你拿着手机扫描二维码,确认登录之后,页面就会自己进行重定向的跳转,跳转的url如何配置下面再讲,但是注意,这个重定向的url可以是内网地址 3、重定向到指

Gzf的博客 1万+

抖音小程序开发 唤起收银台支付(可以选择支付宝APP支付或微信H5支付)

什么都别说,先看效果: 字节跳动也开放了小程序给商家接入,可以在旗下APP如抖音、今日头条、今日头条极速版等应用中即点即用,基于庞大的数亿用户量为其引流,帮助商家获取用户流量,销售商品,其模式和微信小程序差不多。 1、后台管理地址: https://developer.toutiao.com/ 2、开发文档地址: https://developer.toutiao.com/dev/cn/min...

悟空码字的博客 1万+

Python Selenium测试Kotlin前端异步渲染问题的排查与解决方案

在UI自动化测试中,Selenium WebDriver通过轮询DOM状态来定位和操作页面元素,其同步等待机制依赖于浏览器渲染树的实时更新。然而,现代前端框架普遍采用异步渲染策略以优化性能,这导致测试脚本在执行时可能遇到元素定位失败或操作无响应的问题。当Kotlin编译为JavaScript运行在浏览器中时,其状态更新与DOM修改之间存在时间差,Selenium的快速轮询可能错过框架调度更新的时机,从而引发间歇性测试失败。这种前端异步渲染与测试工具同步机制的不匹配,在涉及动态内容生成和复杂事件交互的场景中尤

weixin_30911451的博客 405

YOLOv8改进有效系列目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好,本专栏自开设两个月以来已经更新改进教程120+余篇其中包含C2f、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新,订阅本专栏以后你不仅可以收获跟专栏的阅读权限,同时可以进Qq群,里面包含集成我所有创新的YOLO最新目录,和我本人录制的视频讲解教程,如果你想要在YOLOv8系列收获一篇论文,我相信订阅本专栏后你一定会有所收获~YOLOv8改进有效系列目录。

Snu77的博客 18万+
上一篇: Selenium3 Python WebDriver API源码探析(7):同步/异步执行JavaScript(execute_script,execute_async_script:参数,返回值)
下一篇: Selenium3 Python WebDriver API源码探析(9):JavaScript原生警告框(alert)、确认框(confirm)、提示框(prompt)处理
mighty13
博客等级 码龄23年 728粉丝 438原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值