我们在使用Selenium获取网页元素的时候,有时候会遇到网页要加载刷新,要用鼠标下拉滚动鼠标更新页面,才能显示到我们需要的元素。
这时候就要模拟向下拖动、下拉按钮或者滚动操作了。
本文按照selenium模拟鼠标的操作,按照 【逐步滚动】、【一口气滚动到网页底部】、【滚动到某个元素可见】,【限制每个页面滚动的次数】,这些不同的需求,汇总模拟滚动鼠标的各种操作~
以下是一些基本的步骤和代码示例,展示如何使用Selenium来模拟向下拖动下拉按钮的:
事先准备:
#导入必要的Selenium库:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
import time
#启动WebDriver:
driver = webdriver.Chrome() # 或者使用其他浏览器
driver.get("你的网页URL")
1. 方法一:根据页面长度,一步步滚动鼠标,直到拉到网页底部(最常用)
实现效果:会先计算页面的大小,然后一步步去拉动下滑条,直到拉动页面底部
具体代码:
# 打开目标网页
driver.get('https://example.com')
# 获取页面的总高度
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
# 关闭浏览器
driver.quit()
2. 方法二 :滚动到看到某个元素为止:
实现效果:直接拉到目标元素的位置
如果下拉按钮是一个元素,可以使用scrollIntoView方法将其滚动到可视范围内。例如:
element = driver.find_element(By.ID, "your_element_id")
driver.execute_script("arguments[0].scrollIntoView();", element)
这种方法可以将指定的元素,滚动到浏览器窗口的可视范围内。
但是实现的效果不太连续。例如我们设置模拟滚动鼠标,直到看到网页最底下的元素。
这个方法实现的效果就会是,直接滑动到定位的element
的位置,但不会又有持续慢慢下拉的过程。
3.方法三:一口气直接滚动到页面底部:
实现效果:直接拉到网页底部的位置
跟上面的效果类似,如果要直接跳过滚动,直接跳到定位到网页最底,就直接用下面JS的这个代码:
driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
这是利用execute_script
方法执行JavaScript代码来实现滚动,这种方法可以滚动到页面的底部,如果下拉按钮会触发页面滚动,这将是一个有效的方法。
3. 方法四:限定滚动次数,逐步滚动页面:
实现效果:一步步滚动页面,但是会限定多少次来滚动
如果页面内容很长,不想一下子就滚到底部。
可以采用分步滚动页面,每次向下滚动一定的像素,直到达到页面底部。
则可以这样写:
time.sleep(3)
row_times=6 #固定滚动6次
top = 0
for _ in range(row_times):
top = top + random.randint(200, 1000) #计算每次滚动的距离
js = f"document.documentElement.scrollTop={top}"
driver.execute_script(js)
time.sleep(random.uniform(1, 2)) # 每次滚动后等待多少秒,以便观察效果,且模拟人的行为
4. 方法五:使用ActionChains模拟鼠标滚动(会占用鼠标):
实现效果:模拟鼠标下拉拖动页面向下移动,但是会占用鼠标的使用。
模拟鼠标移动到下拉按钮上:
element = driver.find_element(By.ID, "your_element_id")
ActionChains(driver).move_to_element(element ).perform()
或者,
模拟点击下拉按钮:
ActionChains(driver).click(element).perform()
以上方法可以根据具体的测试场景和需求进行选择和调整。