使用Python Selenium,动态网页不再是难题!

目录

1、直接执行JS代码 🌐

1.1 execute_script基础用法

1.2 带参数执行JS函数

1.3 获取执行结果

2、使用execute_async_script异步执行 🔄

2.1 适用场景分析

2.2 实现异步操作示例

2.3 错误处理与调试技巧

3、JS与页面元素交互 👤

3.1 修改DOM属性

3.2 触发事件模拟

3.3 动态加载内容处理

4、高级应用:JS与Selenium深度结合 🤖

4.1 自定义JS脚本库

4.2 性能监控与自动化报告

4.3 安全性增强实践

5、实战案例分享 🔍

5.1 翻页自动化爬取

5.2 动态表单填写与提交

5.3 复杂UI测试场景应对

6、性能优化与最佳实践 ⚡

6.1 执行速度提升策略

6.2 资源管理与异常恢复

6.3 代码结构与可维护性建议

7、总结与展望 🚀



1、直接执行JS代码 🌐

在Python Selenium自动化测试与网页操作中,直接执行JavaScript代码是一项强大功能 ,它能够帮助我们实现浏览器端的复杂操作与数据获取。本章将深入探讨如何利用Selenium的execute_script方法执行JavaScript,从基础到进阶,确保你的自动化任务更加灵活高效。

1.1 execute_script基础用法

execute_script是WebDriver接口提供的一个方法,允许你在当前页面上下文中直接执行JavaScript代码。其基本语法为driver.execute_script(script, *args),其中script是要执行的JavaScript字符串,而args是传递给该脚本的参数列表。

示例代码:

from selenium import webdriverdriver = webdriver.Chrome()
driver.get("https://www.example.com")# 简单示例:通过JS滚动到底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

此代码段会打开example.com,并通过JavaScript指令滚动页面至底部。

1.2 带参数执行JS函数

当需要向JavaScript传递参数时,execute_script*args参数就派上用场了。这些参数会在执行的脚本中按顺序对应。

示例代码:

element_id = "myElement"
new_text = "Hello, World!"# 修改页面中特定ID元素的文本内容
driver.execute_script(f'document.getElementById("{element_id}").innerText = arguments[0]', new_text)

这段代码展示了如何修改页面上ID为myElement的元素文本为Hello, World!

1.3 获取执行结果

execute_script不仅能执行操作 ,还能返回JavaScript表达式的值。这对于提取页面上的动态数据特别有用。

示例代码:

# 获取页面文档的标题
title = driver.execute_script("return document.title;")
print(f"页面标题是: {title}")

此段代码将打印出当前页面的标题,演示了如何从JavaScript执行中获取返回值。

通过上述内容,你已经掌握了在Python Selenium中直接执行JavaScript的基本技能,无论是简单页面操作还是复杂的动态数据获取,都能游刃有余地运用这一利器。接下来的实践将加深你对这一功能的理解与应用。

2、使用execute_async_script异步执行 🔄

在Selenium自动化测试中,面对网页中的异步加载内容或长时间运行的JavaScript操作,传统的同步执行可能不足以应对。此时,execute_async_script方法便显得尤为重要,它允许你在等待异步操作完成后再继续执行后续代码。

2.1 适用场景分析

  • • 异步加载内容:如Ajax请求的数据加载、延迟加载的图片或组件。

  • • 长耗时操作:例如需要等待的动画效果完成、定时器触发的事件处理等。

  • • 用户交互模拟:模拟用户操作后等待页面响应,如点击按钮后等待加载新内容。

2.2 实现异步操作示例

execute_async_script方法会等待一个特殊的回调函数arguments[arguments.length - 1]被调用 ,这通常由执行的JavaScript代码来完成,以通知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 as ECdriver = webdriver.Chrome()
driver.get("https://www.example.com")# 假设页面有一个按钮 ,点击后通过Ajax加载数据
load_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "loadButton")))
load_button.click()# 使用execute_async_script等待异步数据加载完成
driver.execute_async_script("""
    var callback = arguments[arguments.length - 1];
    document.addEventListener('DOMContentLoaded', function() {
        // 假设数据加载完成后某个标志元素会出现
        if(document.getElementById('dataLoaded')) {
            callback();
        }
    });
""")# 进一步操作...

此代码模拟了点击一个按钮后,通过监听DOMContentLoaded事件(实际情况下可能需要更精确的事件或条件)并调用回调函数,来确保数据加载完成后再进行后续步骤。

2.3 错误处理与调试技巧

  • • 超时设置:为WebDriverWait设置合理的超时时间,避免无限等待。

  • • 日志记录:利用Selenium的日志功能,记录执行过程中的JavaScript错误信息。

  • • 异常捕获:在执行execute_async_script前后添加try-except块,处理可能出现的异常情况。

  • • 调试信息输出:在JavaScript代码中加入console.log语句,结合浏览器开发者工具查看执行日志,辅助调试。

通过上述实践 ,你已掌握如何利用execute_async_script

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 23设计模式备忘

创建型模式:单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一个对象作为原型&…

下载和使用SLUN数据集

1. 下载数据集 网址在https://opendatalab.com/OpenDataLab/lsun/tree/main/raw/scenes 下载bedroom_val_lmdb.zip 然后解压后会又两个文件,一个data.mdb,另一个lock.mdb。 2. 使用torchvison使用LSUN数据集 我把解压后的bedroom_val_lmdb放在/home/…

Linux-笔记 udev机制介绍

目录 前言 概念 规则文件 规则文件的命名 规则文件的语法 匹配条件 赋值指令 例子 前言 由于之前利用udev机制实现了一个自动配置某功能的项目,所以这里做一下笔记总结,什么是udev?怎么用? 概念 udev其实是linux系统中一…

TypeScrip环境安装与基础

TS环境安装与基础 文章目录 一、什么是TypeScript(微软开发的)二、TypeScript的特性三、环境安装node安装配置详解(常用:outDir,strict ) 四、注释方式五、数据类型 一、什么是TypeScript(微软开…

MySQL如何定位慢查询以及使用EXPLAIN对SQL进行性能分析

在数据库的日常运维和开发中,SQL慢查询是一个常见且必须高度关注的问题。它不仅会影响用户体验,还可能对系统稳定性构成严重威胁。尤其是在数据量激增的情况下,如从几千到1万的数据增长到百万级,SQL查询的性能问题尤为突出。最近&…

iOS 其他应用的文件如何在分享中使用自己的应用打开

废话少说 一、第一步:先配置好plist文件 右击info.plist如下图文件打开 根据自己需要配置支持的文件类型,也可使用property List中配置,一样的 其他的文件可是参考文档:System-Declared Uniform Type Identifiers 可复制的代码&am…

我只有一点Python基础,对学习WebGIS开发有帮助吗?

经常有人后台私信问,我只有一点Python基础,对学习GIS开发有帮助吗? 关于这个问题的答案是,当然有!Python适用于WebGIS开发。WebGIS是地理信息系统(GIS)技术与Web技术的结合,而Pytho…

第1章 框架学习的基石与实战策略

第1章框架学习的基石与实战策略 1.1 框架学习的引路人:权威教程的重要性 在编程的世界里,掌握一个框架就像是装备了一套精良的工具,这不仅能显著提升开发速度,还能展现一个程序员的专业水平。对于那些刚刚踏入编程领域的初学者来…

使用sorted对字典排序

有时我们需要按照字典数据的键值对进行排序,这个时候就可以用到sorted函数。 import operator dic{"testA":3,"testC":1,"testB":4,"testD":2} dicnsorted(dic.items(),keyoperator.itemgetter(0)) print(dicn) 比如我们要…

秋招Java后端开发冲刺——设计模式

本文介绍Java中的代理模式,及一些常见的模式应用。 一、Java设计模式 Java中最常见的设计模式主要有23种,如表所示: 表格:Java设计模式分类 类型设计模式创建型模式单例模式(Singleton Pattern)工厂方法…

MYSQL 四、mysql进阶 5(InnoDB数据存储结构)

一、数据库的存储结构:页 索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说时存储在页结构中,另一方面,索引是在存储引擎中实现的,Mysql服务器上的存储引擎负责对表…

Cesium 实战 - 自定义纹理材质系列之 - 动态扩散效果

Cesium 实战 - 自定义纹理材质系列之 - 动态扩散效果 核心代码完整代码在线示例Cesium 给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求; 但是作为 WebGL 引擎,肯定不够丰富,尤其是动态效果样式。 对于实体对象(Entity),可以通过自定义材质,实现各种…

World of Warcraft [CLASSIC] Level 70 Dire Maul (DM)

[月牙钥匙] [大型爆盐炸弹] World of Warcraft [CLASSIC] Level 70 厄运之槌,完美贡品,Dire Maul (DM) Foror‘s Compendium of Dragon Slaying 佛洛尔的屠龙技术纲要 因为不是兽王宝宝,而且开始位置放的不对&am…

C# —— 方法参数ref和out的作用

public static void Test(ref int a){a 10;}public static void GetValue(out int x){x 10;} ref 和 out 分别使用在方法的参数前面 ref 关键字可以使参数变成引用类型的参数, int a 10; Test(ref a); Console.WriteLine(a); 如果方法参数不加ref; 结果10&…

洛谷U389682 最大公约数合并

这道题最后有一个性质没有想出来,感觉还是有一点遗憾。 性质一、贪心是不对的 8 11 11 16虽然第一次选择8和16合并是最优的,但是如果合并两次的话8 11 11是最优的。 性质二 、有1的情况就是前k1个,也就是说,很多情况下取前k1都…

0000电子技术基础概述

数电 未来课的基础 以前是模块、器件级 现在是 系统级 价格、性能、 技术更新快速的好处:得到了实惠 坏处:工程师需要不断地学习,不变就容易out,要用发展的眼光看待问题 了解基础知识、还要有前沿概念。 理论课、实践课要相结…

CNN神经网络调参技巧

一、基本网络结构 1.若干块,每块:卷积BN激活池化 2.若干块,每块:卷积激活Dropout 3.若干块,每块:fc激活Dropout 二、技巧 1. 损失曲线 常见曲线是先快速下降后趋于平缓,如果线性下降&…

mybatisplus自带的雪花算法(IdType.ASSIGN_ID)无法自动生成弊端缺点,以及改进方法

前言 今日在使用mybatisplus的雪花算法自动给id赋值时发现怎么都是null的情况,这尼玛测了半天,终于发现巨坑,废话不多说,直接上干货 IService.save 只有调用IService中的save方法才能正常生成id,像IService.saveBatc…

Vue移动端动态表单生成组件

FormCreate 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。支持6个UI框架,适配移动端,并且支持生成任何 Vue 组件。内置20种常用表单组件和自定义组件,再复杂的表单都可以轻松搞定。 帮助文档 | 源码下载…

Day35:2734. 执行字串操作后的字典序最小字符串

Leetcode 2734. 执行字串操作后的字典序最小字符串 给你一个仅由小写英文字母组成的字符串 s 。在一步操作中,你可以完成以下行为: 选择 s 的任一非空子字符串,可能是整个字符串,接着将字符串中的每一个字符替换为英文字母表中的前…