当前位置: 首页 > news >正文

解决Python使用Selenium 时遇到网页 <body> 划不动的问题

        如果在使用 Selenium 时遇到网页的 <body> 划不动的问题,这通常是因为页面的滚动机制(例如,可能使用了一个具有固定高度的容器或自定义的滚动条)导致无法通过简单的 JavaScript 实现滚动。可以通过以下方法来解决该问题。

1. 查找可滚动的元素

        查看页面上是否有特定的可滚动元素,而不是直接滚动整个 <body>。例如,有些网页会使用 <div> 或其他容器来显示内容,这种元素可能有 overflow: auto 或 overflow: scroll 属性。可以尝试定位那个容器并对其进行滚动。

例如:

scrollable_div = driver.find_element(By.CSS_SELECTOR, 'div.scrollable-container')  # 替换为实际的选择器
driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scrollable_div)

     driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scrollable_div) 是 Selenium 中使用 JavaScript 来执行页面滚动操作的一种方式。具体来说,这行代码的作用是将指定的元素(在代码中名为 scrollable_div)滚动到底部。 

  • arguments[0]:这是 JavaScript 中的参数传递方式。当您调用 driver.execute_script 时,传递的第二个参数(即 scrollable_div)会作为 arguments[0] 传递到 JavaScript 代码中。
  • scrollTop:这是 DOM 元素的一个属性,表示元素当前垂直滚动的像素数。通过设置这个值,可以控制元素的滚动位置。
  • scrollHeight:这是 DOM 元素的一个属性,表示元素内容的总高度(包括因溢出而不可见的内容)。

        要解决的问题是滚动到某个容器元素的底部,而不是整个页面。假设页面中有一个 div 包含大量内容,并且这个 div 有自己的滚动条。通过将这个 div 的 scrollTop 设置为其 scrollHeight,可以实现将该 div 的内容滚动到底部。 

2. 使用 JavaScript 滚动

        如果是 <body> 无法滚动,可以使用 JavaScript 来尝试不同的滚动方法,例如直接调整 scrollTop 值。比如,向下移动一定的像素:

driver.execute_script("window.scrollBy(0, 500);")  # 向下滚动 500 像素

3. 检查 page-load 状态

        确保在进行滚动之前,页面已完全加载。使用显式等待确认页面的状态。例如,使用 WebDriverWait 来等待某个元素的加载:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECWebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'your-element-class')))  # 替换为实际的类名

4. 循环滚动

        如果需要滚动整个页面,可以使用一个循环,不断检查滚动高度的变化,直到到达页面底部。这是一个常见的处理无限滚动列表的方法:

last_height = driver.execute_script("return document.body.scrollHeight")while True:driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")time.sleep(2)  # 等待加载新内容new_height = driver.execute_script("return document.body.scrollHeight")if new_height == last_height:break  # 到达底部,停止滚动last_height = new_height

5. 使用 Actions 类进行滚动

        使用 Selenium 的 ActionChains 可以模拟按键或鼠标事件,进行更复杂的用户交互,例如按“向下箭头”键:

from selenium.webdriver.common.action_chains import ActionChainsactions = ActionChains(driver)
for _ in range(10):  # 示例:按下10次向下箭头actions.send_keys(Keys.ARROW_DOWN).perform()time.sleep(0.5)  # 等待一会儿,以便内容加载

        当然也可以在控制台中直接模拟下拉(即向下滚动)操作,使用 JavaScript 来实现。以下是如何在控制台中执行 JavaScript 代码来实现下拉操作的步骤。

1. 打开浏览器控制台

        首先,打开你想要操作的网页,然后按下 F12 键或者右键点击页面并选择“检查”来打开开发者工具。然后在开发者工具中切换到“控制台”标签。

2. 找到可滚动的元素

        假设你要滚动的元素是一个 div,并且它的类名是 __vuescroll。你需要先找到这个元素。

3. 编写 JavaScript 代码来下拉

        在控制台中输入以下 JavaScript 代码,这将使指定的 div 向下滚动:

// 找到你要操作的 div 元素
var scrollableDiv = document.querySelector('div.__vuescroll.hasVBar');// 如果找到了这个 div
if (scrollableDiv) {// 将 div 滚动到最底部scrollableDiv.scrollTop = scrollableDiv.scrollHeight;
} else {console.error('没有找到可滚动的 div 元素');
}

代码解释

  • document.querySelector('div.__vuescroll.hasVBar'):通过 CSS 选择器找到类名为 __vuescroll 并且有 hasVBar 类的 div 元素。
  • scrollTop = scrollableDiv.scrollHeight:将元素的 scrollTop 属性设置为元素的 scrollHeight(元素内容的总高度),这将使元素滚动到最底部。

4. 执行代码

        在控制台中输入或粘贴上述代码,然后按下 Enter 键。这将使指定的 div 元素滚动到最底部。

逐步滚动

        如果你想要逐步滚动而不是一次性滚动到底部,可以使用以下代码:

// 找到你要操作的 div 元素
var scrollableDiv = document.querySelector('div.__vuescroll.hasVBar');// 如果找到了这个 div
if (scrollableDiv) {// 当前的 scrollTop 值var currentScrollTop = scrollableDiv.scrollTop;// 每次增加 100 像素,逐步滚动到底部var scrollInterval = setInterval(function() {// 每次增加 100 像素currentScrollTop += 100;// 设置新的 scrollTop 值scrollableDiv.scrollTop = currentScrollTop;// 如果已经滚动到底部,停止定时器if (currentScrollTop >= scrollableDiv.scrollHeight) {clearInterval(scrollInterval);}}, 100); // 每 100 毫秒执行一次
} else {console.error('没有找到可滚动的 div 元素');
}

代码解释

  • setInterval:每 100 毫秒执行一次滚动操作。
  • currentScrollTop += 100:每次增加 100 像素。
  • clearInterval(scrollInterval):当滚动到底部时,清除定时器,停止滚动。

        通过在浏览器的控制台中输入 JavaScript 代码,你可以直接模拟向下滚动操作。根据需要,你可以一次性滚动到底部,或者逐步增加 scrollTop 的值来实现平滑的滚动效果。 

相关文章:

解决Python使用Selenium 时遇到网页 <body> 划不动的问题

如果在使用 Selenium 时遇到网页的 <body> 划不动的问题&#xff0c;这通常是因为页面的滚动机制&#xff08;例如&#xff0c;可能使用了一个具有固定高度的容器或自定义的滚动条&#xff09;导致无法通过简单的 JavaScript 实现滚动。可以通过以下方法来解决该问题。 …...

pytorch版本和cuda版本不匹配问题

文章目录 &#x1f315;问题&#xff1a;Python11.8安装pytorch11.3失败&#x1f315;CUDA版本和pytorch版本的关系&#x1f315;安装Pytorch2.0.0&#x1f319;pip方法&#x1f319;cuda方法 &#x1f315;问题&#xff1a;Python11.8安装pytorch11.3失败 &#x1f315;CUDA版…...

Vue/组件的生命周期

这篇文章借鉴了coderwhy大佬的Vue生命周期 在Vue实例化或者创建组件的过程中 内部涉及到一系列复杂的阶段 每一个阶段的前后时机都可能对应一个钩子函数 以下是我根据coderwhy大佬文章对于每一个阶段的一些看法 1.过程一 首先实例化Vue或者组件 在实例化之前 会对应一个钩子函…...

【Nacos架构 原理】内核设计之Nacos寻址机制

文章目录 前提设计内部实现单机寻址文件寻址地址服务器寻址 前提 对于集群模式&#xff0c;集群内的每个Nacos成员都需要相互通信。因此这就带来一个问题&#xff0c;该以何种方式去管理集群内部的Nacos成员节点信息&#xff0c;即Nacos内部的寻址机制。 设计 要能够感知到节…...

入门案例:mybatis流程,核心,常见错误

入门案例&#xff1a;mybatis执行流程分析 说明&#xff1a; 1.第一步&#xff1a;是从核心配置文件mybatis-config.xml中构建SqlSessionFactory对象&#xff0c;由于核心配置文件mybatis-config.xml中关联了映射文件UserMapper.xml,所以在SqlSessionFactory中也存在映射文件的…...

C++ | Leetcode C++题解之第456题132模式

题目&#xff1a; 题解&#xff1a; class Solution { public:bool find132pattern(vector<int>& nums) {int n nums.size();vector<int> candidate_i {nums[0]};vector<int> candidate_j {nums[0]};for (int k 1; k < n; k) {auto it_i upper_…...

自然语言处理问答系统

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

Python的几个高级特性

引言 Python是一种功能强大的编程语言&#xff0c;它简洁的语法和强大的库支持使其成为数据科学和机器学习领域的热门选择。在Python的高级特性中&#xff0c;生成器、迭代器、闭包、装饰器和内置高阶函数是实现高效、优雅代码的关键。本文将逐一介绍这些特性&#xff0c;并提…...

【颜色平衡树 / E】

题目 思路 DFS暴力 60分 代码 #include <bits/stdc.h> using namespace std; const int N 5010; const int M 5010; int h[N], e[M], ne[M], idx; int c[N], f; int ans; void add(int a, int b) // 添加一条边a->b {e[idx] b, ne[idx] h[a], h[a] idx ; } …...

滑动窗口--(中篇)

将X减到0的最小操作数 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 &#xff0c;返…...

Java性能调优:实战技巧与最佳实践

引言 Java作为企业级应用开发的首选语言之一&#xff0c;其性能直接影响到系统的响应速度和用户体验。性能调优是一项复杂的工作&#xff0c;涉及多个层面的知识和技术。本文将通过具体的示例&#xff0c;探讨一些常见的性能调优技巧及最佳实践。 1. 了解你的应用程序 示例&…...

排版套料系统设计说明

先上效果图 项目地址 1.产品介绍 产品名称&#xff1a;StreamFit 智能排版套料系统 主要功能&#xff1a; 智能排版优化 功能描述&#xff1a;StreamFit 利用先进的算法技术&#xff0c;自动对各类材料&#xff08;如布料、金属板材、纸张等&#xff09;进行高效排版布局&am…...

算法修炼之路之二分查找

目录 一:三大二分介绍及模板 1.普通二分 2.查找左右边界的二分及模板 二:LeetCode OJ练习 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 一:三大二分介绍及模板 1.普通二分 这里通过一道题来引出普通二分及模板 LeetCode_704 二分查找 画图分析: 具体代…...

OpenAI预计明年将推出“代理”系统

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

每日OJ题_牛客_重排字符串_贪心_C++_Java

目录 牛客_重排字符串_贪心 题目解析 C代码 Java代码 牛客_重排字符串_贪心 重排字符串 (nowcoder.com) 描述&#xff1a; 小红拿到了一个只由小写字母组成的字符串。她准备把这个字符串重排&#xff08;只改变字母的顺序&#xff0c;不改变数量&#xff09; …...

Python 进阶部分详细整理

1. 面向对象编程&#xff08;OOP&#xff09; 面向对象编程 (OOP) 是一种通过将程序中的数据和功能封装为对象的编程范式。OOP 基于四个核心概念&#xff1a;类与对象、继承、封装与多态。 类与对象 类&#xff08;Class&#xff09;&#xff1a;类是创建对象的蓝图或模板。它…...

[ RK3566-Android11 ] 关于移植 RK628F 驱动以及后HDMI-IN图像延迟/无声等问题

问题描述 由前一篇文章https://blog.csdn.net/jay547063443/article/details/142059700?fromshareblogdetail&sharetypeblogdetail&sharerId142059700&sharereferPC&sharesourcejay547063443&sharefromfrom_link&#xff0c;移植HDMI-IN部分驱动后出现&a…...

【黑马点评】 使用RabbitMQ实现消息队列——2.使用RabbitMQ监听秒杀下单

2 使用RabbitMQ实现消息队列 2.1 修改\hm-dianping\pom.xmlpom.xml文件 添加RabbitMQ的环境 <!-- RabbitMQ--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </depe…...

业务封装与映射 -- OTUk/ODUk/OPUk开销帧结构

开销是为了保证净荷正常、灵活传送所必须附加的供网络运行、管理和维护&#xff08;OAM&#xff09;使用的字节。 OTN电层开销包括OTUk开销、ODUk开销、OPUk开销、OTUCn开销、ODUCn开销、OPUCn开销和帧对齐开销。 SM开销属于OTU开销&#xff0c;占用3个字节&#xff1b;PM开销…...

Vim基本用法

Vim用法 一、基本模式 1. 普通模式&#xff08;Normal Mode&#xff09; 移动光标 基本移动&#xff1a;使用方向键&#xff08;h左移、j下移、k上移、l右移&#xff09;&#xff0c;也可以使用 H&#xff08;移到屏幕顶部&#xff09;、M&#xff08;移到屏幕中间&#xff…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...