0


解决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 EC

WebDriverWait(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 ActionChains

actions = 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

本文转载自: https://blog.csdn.net/2301_80892630/article/details/142694126
版权归原作者 wdxylb 所有, 如有侵权,请联系我们删除。

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

还没有评论