Selenium3 Python WebDriver API源码探析(7):同步/异步执行JavaScript(execute_script,execute_async_script:参数,返回值)

Python+Selenium 如何使用execute_async_script的callback Selenium如何使用execute_async_script的callback 前言 在我百度的时候,貌似关于execute_script的讲解不少,但是关于execute_async_script的讲解不是很多,还看到有文章在问callback为什么不能用(写在python里是肯定不能用的……)所以自己也写一篇关于execute_async_script的用法。 基础 很多用法上的错误是源于... 阅读详情

概述

Selenium虽然内置了很多与浏览器交互的方法,但是有一些方面还是不能完全覆盖,因此执行JavaScript是非常有必要的,这也是模拟浏览器包必备的功能。

需要执行JavaScript的主要场景如下:

  • 修改元素的属性,如显示隐藏元素
  • 执行特定动作,如拖动滚动条
  • 表单操作,如向文本框输入内容
  • 获取某些Selenium未提供接口的DOM属性
  • 注入其他工具库,比如jQuery

execute_script方法:同步执行JavaScript脚本

Selenium中同步执行JavaScript脚本主要依靠WebDriver的execute_script方法。

作用:同步执行JavaScript。
签名:driver.execute_script(script, *args)
参数:script为需要同步执行的JavaScript语句。*args为JavaScript语句执行中使用到的参数。
返回值:JavaScript语句中return语句返回的对象。

向JavaScript语句传递参数

JavaScript使用特殊对象 arguments指代参数,arguments[0]表示第一个参数,arguments[1]表示第二个参数,依次类推。

案例:在浏览器控制台中显示传递给JavaScript脚本的两个变量之和。

from selenium import webdriver

driver = webdriver.Firefox()
driver.execute_script('console.log(arguments[0]+arguments[1])', 1, 2)

在这里插入图片描述

获取JavaScript对象

在Javascript语句中使用return语句,即可将JavaScript对象传递给selenium,此时JavaScript对象会转换为Python对象。

案例:输出传递给JavaScript的变量

from selenium import webdriver

driver = webdriver.Firefox()
arguments = driver.execute_script('return arguments', 1, 2)
print(arguments, type(arguments))

控制台结果:

[1, 2] <class 'list'>

execute_async_script方法:异步步执行JavaScript脚本

Selenium中异步执行JavaScript脚本主要依靠WebDriver的execute_script方法。

作用:异步执行JavaScript。
签名:driver.execute_async_script(script, *args)
参数:script为需要异步执行的JavaScript语句。*args为JavaScript语句执行中使用到的参数。
返回值:JavaScript语句中回调函数中的参数。注意:Selenium自动为execute_async_script方法添加了一个特殊参数,这个参数追加在其他参数后面,即回调函数。

案例1 :演示回调函数和返回值

from selenium import webdriver

driver = webdriver.Firefox()

script = "var callback = arguments[arguments.length - 1]; " \
    "console.log(arguments.length);"\
    "window.setTimeout(function(){ callback(1) }, 3000);"

result = driver.execute_async_script(script, "test")

print(repr(result), type(result))

var callback = arguments[arguments.length - 1];是回调函数的固定定义方法。
浏览器控制台输出为:2,说明JavaScript接收到了2个参数,但我们只明确传了"test"。
结果即回调函数callback中的参数。

1 <class 'int'>

案例2 :演示异步特性

JavaScript中有两个异步任务,一个任务3秒后返回1,一个任务1秒后返回2,第二个任务当然先完成。执行回调函数callback后,脚本结束运行。

from selenium import webdriver
import time

driver = webdriver.Firefox()

script = "var callback = arguments[arguments.length - 1]; " \
    "window.setTimeout(function(){ callback(1) }, 3000);"\
    "window.setTimeout(function(){ callback(2) }, 1000);"
start_time = time.time()

result = driver.execute_async_script(script, "test")
end_time = time.time()
print(end_time-start_time)
print(repr(result), type(result))

输出为:

1.023017406463623
2 <class 'int'>

Selenium常用JavaScript脚本

拖动滚动条

js_ = "document.documentElement.scrollTop=10000"
driver.execute_script(js_)

修改表单元素的值

driver.get("http://www.baidu.com")
js="document.getElementById('kw').value='123'"
driver.execute_script(js)

修改CSS属性,隐藏百度搜索框

driver.get("http://www.baidu.com")
js="document.getElementById('kw').style.display='None'"
driver.execute_script(js)

返回JavaScript对象,浏览器UA

js="return window.navigator.userAgent"
UA =driver.execute_script(js)
print(UA)
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0

获取某元素的HTML

driver.get("http://www.baidu.com")
js="return document.getElementById('s-top-left').innerHTML"
html =driver.execute_script(js)
print(repr(html))

注入jQuery

driver.get("http://www.baidu.com")
js1 = "var newScript = document.createElement('script');newScript.src = 'https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js';"
js2 = "return $('.s-top-left').text()"
driver.execute_script(js1)
text = driver.execute_script(js2)
print(text)

结果:

新闻hao123地图直播视频贴吧学术更多网盘知道百科图片宝宝知道文库经验音乐查看全部百度产品 >
python selenium调用js接口分析_Python+Selenium笔记(十五)调用JS (一)方法方法简单说明execute_async_script(script, args)异步执行JS代码script:被执行的JS代码args:js代码中的任意参数execute_script(script, args)同步执行JS代码script:被执行的JS代码args:js代码中的任意参数(二)示例from selenium.webdriver.common.action_chains... 阅读详情

相关推荐

Selenium教程__使用execute_script执行JavaScript(11)

selenium的包含的方法已能完全满足UI自动化,但是有些时候又不得不用到执行JS的情况,比如在一个富文本框中输入1W个字,使用send_keys方法将经历漫长的输入过程,如果换成使用JS的innerHTML方法就能够很快的完成输入。先简单写个html界面帮助演示。

GDYY3721的博客 1652

driver.execute_script("arguments[0].click();",supportUser)

这句话的意思是使用 JavaScript 在浏览器中执行一个点击操作,将页面元素 "supportUser" 点击。 具体来说,"driver.execute_script" 是调用浏览器驱动程序 (driver) 的一个方法,它可以用来在浏览器中执行 JavaScript 代码。"arguments[0].click()" 是一段 JavaScript 代码,它表示调用第一个参数 (即 "sup...

weixin_42593130的博客 3834

Python爬虫三剑客:Selenium、Playwright、DrissionPage实战对比

在Python爬虫开发中,处理动态网页是常见挑战。动态网页通常依赖JavaScript渲染,传统HTTP请求库难以直接获取数据。浏览器自动化技术通过模拟真实用户操作,能有效解决此问题,其核心原理是控制浏览器执行JavaScript并获取完整DOM。这项技术对爬虫开发具有重要价值,能应对登录验证、无限滚动等复杂交互场景。Selenium作为经典工具生态成熟,Playwright以现代化API和网络拦截见长,DrissionPage创新性地融合浏览器与请求模式。本文基于实战案例,从安装配置、代码编写、性能表现到

363

Python自动化——driver.execute_script的用法

当您使用Selenium时,您可以指定chrome驱动程序的路径。在这个示例中,我使用了来创建Chrome浏览器驱动,并通过参数指定了Chrome驱动程序的路径。您只需将变量的值替换为您系统中chromedriver.exe的实际路径即可。

m0_57021623的博客 6175

破解前端渲染:Selenium与Playwright浏览器自动化实战对比

在Web开发与数据抓取领域,客户端渲染(CSR)已成为现代前端框架(如React、Vue)的主流技术。其原理在于浏览器先加载基础HTML框架,再通过JavaScript异步请求数据并动态生成页面内容。这种技术虽然提升了用户体验,却给传统基于HTTP请求的爬虫带来了挑战——无法直接获取动态渲染的数据。为此,浏览器自动化工具应运而生,通过模拟真实浏览器环境执行JavaScript,完整渲染页面后提取数据,在数据采集、自动化测试等场景中极具价值。本文聚焦于两大主流工具Selenium与Playwright,深入对

weixin_30500473的博客 367

网页抓取实战:从静态页面到动态链接的自动化提取

本文详细介绍了网页抓取技术的实战应用,从静态页面的基础抓取到动态链接的自动化提取。通过Python的requests库、BeautifulSoup和Selenium等工具,结合实例代码演示了如何处理静态HTML、动态加载内容及API接口数据。文章还涵盖了链接处理、自动化流水线构建、效率优化及法律合规等关键内容,为开发者提供全面的网页抓取解决方案。

weixin_34252686的博客 355

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

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

weixin_30911451的博客 405

Python爬虫实战:从Requests到Scrapy的完整环境搭建与反爬策略

网络数据采集是自动化获取互联网公开信息的基础技术,其核心原理是通过模拟HTTP请求与解析HTML/XML文档来提取结构化数据。这项技术的工程价值在于将人工浏览和复制数据的重复劳动自动化,显著提升数据获取效率与规模。在数据分析、市场研究、内容聚合和竞品监控等应用场景中,数据采集是构建数据管道的关键环节。本文聚焦于Python爬虫的实战可用性,详细阐述了如何搭建包含Requests、BeautifulSoup、Selenium和Scrapy的完整技术栈环境,并系统介绍了应对反爬机制的策略,如IP代理池管理和请求

weixin_33851177的博客 351

Rust浏览器自动化:使用selenium-rs实现WebDriver控制与实战

WebDriver作为W3C标准协议,是实现跨浏览器自动化测试与网页交互的核心技术。其原理是通过客户端-服务器架构,将操作指令转换为浏览器可执行的命令,从而模拟真实用户行为。这一技术价值在于能够处理JavaScript动态渲染的现代单页应用,克服传统HTTP请求抓取的局限性。在应用场景上,WebDriver广泛用于UI自动化测试、数据抓取、监控脚本和跨浏览器兼容性验证。本文聚焦于如何在Rust生态中利用selenium-rs库,通过对接ChromeDriver等驱动程序,实现高效的浏览器自动化任务,涵盖会话

359

Python自动化抓取内嵌页面元素:从Selenium到Playwright的实战指南

在Web数据采集领域,自动化脚本技术是解决动态内容抓取难题的核心。其原理在于通过程序控制真实浏览器环境,模拟用户交互行为,从而获取JavaScript动态渲染后的完整DOM结构。这项技术的核心价值在于突破了传统静态爬虫的局限,能够处理iframe嵌套、单页应用(SPA)等复杂场景,实现高保真度的数据采集。在实际应用中,自动化脚本广泛用于电商价格监控、社交媒体数据采集、企业后台报表提取等场景。本文聚焦Python生态下的Selenium、Playwright等主流工具,深入探讨如何构建健壮的自动化抓取解决方案

weixin_33768481的博客 372

browser39:解决39个痛点的Python浏览器自动化框架

浏览器自动化是软件测试、数据采集和RPA流程自动化的核心技术,它通过程序控制浏览器模拟用户操作。其原理在于通过WebDriver协议与浏览器内核通信,执行点击、输入、导航等指令。这项技术的核心价值在于将重复、繁琐的人工网页操作转化为高效、可复现的自动化流程,广泛应用于电商数据监控、表单自动填写、Web应用测试等场景。然而,实践中开发者常面临环境配置复杂、元素定位脆弱、异步加载难以处理、多窗口管理混乱以及反爬检测等具体挑战。针对这些高频痛点,browser39框架应运而生,它通过封装智能等待、稳健交互、会话管

weixin_30915275的博客 422

Selenium异步爬虫实战:高效采集动态网页数据的架构与优化

动态网页数据采集是现代网络爬虫的核心挑战之一,其原理在于现代网站普遍采用JavaScript异步加载技术(如Ajax、React、Vue框架)动态渲染内容,传统基于HTTP请求的爬虫无法直接获取完整数据。为解决这一问题,Selenium等浏览器自动化工具通过模拟真实用户行为,能够完整执行页面JavaScript并获取渲染后的DOM,确保了数据的完整性。然而,Selenium的同步阻塞特性在大量页面采集时会导致严重的效率瓶颈。通过引入异步编程(如Python的asyncio)与线程池技术,可以实现Seleni

weixin_33816300的博客 462

Python爬虫实战:从requests到Scrapy的抓取、解析与存储全解析

网络数据抓取是数据采集与处理的基础技术,其核心原理是通过程序模拟浏览器行为,自动从互联网获取结构化信息。这项技术的价值在于为数据分析、市场研究、机器学习等应用场景提供高质量、大规模的数据源。在工程实践中,Python因其丰富的库生态成为爬虫开发的首选语言。其中,requests库简化了HTTP请求过程,而BeautifulSoup和lxml则分别提供了灵活与高性能的HTML解析方案。面对反爬机制,开发者需要掌握请求头伪装、IP代理池和异步并发等关键技术。对于复杂项目,Scrapy框架通过其模块化架构提供了完

weixin_30466039的博客 375

基于Selenium与FastAPI构建免费Web搜索API:从原理到实战部署

在数据采集和自动化领域,网络爬虫是获取互联网公开信息的基础技术。其核心原理是通过程序模拟浏览器行为或直接发送HTTP请求,从目标网页中提取并结构化所需数据。这项技术的价值在于能够将海量、非结构化的网页信息转化为可供分析和使用的结构化数据,极大地提升了信息获取的效率。在舆情监控、市场分析、学术研究等应用场景中,程序化搜索与数据抽取是常见需求。然而,直接使用官方搜索API常面临调用限制、费用高昂或访问不稳定等问题。本文聚焦于利用Selenium这一浏览器自动化工具,结合FastAPI框架,从零构建一个高度定制化

weixin_33716941的博客 356

AI驱动浏览器伪装与MCP协议:构建智能逆向工程工作台

在数据采集和自动化测试领域,浏览器指纹识别与反爬机制是核心技术挑战。其原理在于网站通过收集User-Agent、WebDriver属性、Canvas指纹等多维度特征,精准识别自动化脚本。为应对这一挑战,Cloak伪装技术通过修改浏览器底层属性、注入反检测脚本,系统性地消除自动化特征,使程序行为更接近真实用户。结合Model Context Protocol(MCP),开发者可将浏览器控制、网络监听等工具封装成标准化接口,通过自然语言指挥AI助手完成页面导航、接口调试等复杂逆向任务。这种AI驱动的工程实践,特

weixin_34320159的博客 495

Unity海洋渲染实战:Ceto Ocean System核心原理与高级应用指南

实时水面渲染是计算机图形学中的重要课题,涉及波浪模拟、光照交互和着色器编程等核心技术。其原理通常基于物理模型,如使用Gerstner波模拟规则海浪,或通过快速傅里叶变换(FFT)处理频谱数据生成随机海面。这些技术的价值在于能以可控的性能开销,在游戏中实现具有体积感、反射和折射效果的真实水体。在开放世界、海战模拟等应用场景中,专业的海洋系统如Ceto Ocean System,通过模块化架构整合了波浪生成、动态网格和渲染管线,为开发者提供了完整的解决方案。本文深入探讨了其双引擎波浪系统和多层渲染结构,并分享了

weixin_29002595的博客 279

Python爬虫实战:18个案例从入门到精通,攻克反爬与动态渲染

网络爬虫是一种自动化程序,用于从互联网上抓取和提取数据。其核心原理是模拟浏览器行为,向目标服务器发送HTTP请求,接收响应,并通过解析HTML、JSON等格式提取结构化信息。这项技术对于数据采集、市场分析、舆情监控等领域具有重要价值,是实现数据驱动决策的基础工具。在实际应用中,开发者常面临反爬机制、动态内容加载等挑战。本文聚焦Python爬虫的工程实践,通过涵盖静态页面抓取、API接口分析、动态渲染处理及Scrapy框架应用等场景的系列案例,系统讲解如何应对这些实战痛点。文中深入探讨了使用Selenium处

weixin_33853827的博客 454

基于Dify构建银行智能客服:从意图识别到多RAG架构的实战解析

本文深入解析了如何利用Dify平台构建银行智能客服系统。从传统客服痛点出发,详细阐述了基于意图识别精准分类用户需求,并通过多RAG架构解决知识混淆问题,实现高效、准确的业务响应。文章重点介绍了结合工具调用实现业务流程自动化,并强调了数据本地化部署、内容安全过滤等银行级安全合规实践,为金融行业AI应用提供了实战指南。

yog99的博客 926

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

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

weixin_33919950的博客 340

从零构建:ESP32S3无线DAP-Link调试器的硬件与软件协同设计

本文详细介绍了基于ESP32S3的无线DAP-Link调试器的硬件与软件协同设计,涵盖关键元器件选型、无线通信协议优化、双核任务处理及低功耗调试方案。通过ESP-NOW协议实现低延迟无线调试,结合USB协议栈与双核协同,为嵌入式开发提供高效灵活的调试解决方案。

gitlab7runner的博客 859

centos7部署mysql8.0.35,主从复制,主主集群

centos7 linux部署mysql,主从复制,主主模式

zaixiaqin的博客 1990

Python Playwright实战:破解2026年最新前端文本混淆,抓取动态渲染网页数据

在网络数据采集领域,前端文本混淆技术已成为常见的反爬虫手段,其核心原理是通过JavaScript在客户端动态解密并渲染真实内容,导致传统基于静态HTML解析的爬虫失效。为了应对这一挑战,开发者需要理解浏览器渲染引擎与DOM(文档对象模型)的交互机制,转而采用模拟真实浏览器环境的技术方案。这类方案的价值在于能够完整执行页面逻辑,获取最终渲染后的明文数据,从而广泛应用于需要从政务公开、公共服务等动态网站中自动化提取关键信息的场景。本文以2026年流行的最新混淆技术为背景,详细介绍了如何利用Playwright这

weixin_33911824的博客 525

全网最详细单细胞保姆级分析教程(一) ---pbmc

通过观察热图,可以了解不同细胞在主成分上的分布情况,以及主成分与细胞特征之间的关系。数据归一化是数据分析中的常见步骤,旨在消除数据集中不同特征之间的量纲差异,并使它们在相同的尺度上进行比较。函数会根据指定的主成分维度计算数据点之间的距离,并找到每个数据点的邻居。函数会根据数据点之间的相似性将其分组到不同的聚类中。数据缩放是数据分析中的常见步骤,旨在将数据的特征值调整到相似的范围,以避免某些特征对分析结果的过度影响。通过可视化维度载荷,可以了解哪些特征对主成分的形成起到了重要作用,以及不同特征之间的相关性。

ZxVSaccount的博客 6707
上一篇: Selenium3 Python WebDriver API源码探析(6):窗口(标签)管理(切换、关闭)
下一篇: Selenium3 Python WebDriver API源码探析(8):等待(显式等待、隐式等待)、超时(页面加载超时、异步脚本调用超时)
mighty13
博客等级 码龄23年 728粉丝 438原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值