web自动化:8.3 selenium中如何实现浏览器的窗口滚动

窗口滚动不属于网页的操作,属于窗口行为。实现窗口滚动,需要在selenium中发送js指令(参考:8.2 selenium中如何发送js指令)
使用场景:
1、存在懒加载的产品:不会一次性把所有东西加载出来,必须执行某个动作才会有新的东西出来(如:滚动条下拉,才会加载新的东西)
2、想点击或操作某个元素,但是这个元素在页面中看不到。需要先将元素拉到可视范围之内,才能点击。

介绍3种窗口滚动的方法:

方法一:坐标法

但是我们很少用这种方法,因为一般情况下不知道自己所定位的元素的像素点是多少。
window.scrollTo(0,1000) # f(x,y) x:横坐标,y:纵坐标,单位:xp(像素点)

练习1

from selenium import webdriver
import time

driver = webdriver.Chrome()  # 初始化一个谷歌浏览器
driver.maximize_window()  # 浏览器窗口最大化
driver.get("https://readhub.cn/topics")   # 打开一个存在懒加载的网页

time.sleep(5)   # 等待一段时间,待页面加载出来再执行js代码

# 方法一:坐标法
driver.execute_script('window.scrollTo(0,1000)')   # 横坐标不变,纵坐标 滚动到1000像素点
time.sleep(2)   # 等待一段时间,方便查看滚动的效果
driver.execute_script('window.scrollTo(0,2000)')   # 再滚动一次
time.sleep(2)  # 等待一段时间,方便查看滚动的效果

方法二:滚动到窗口底部,然后定位要找的元素

window.scrollTo(0,document.body.scrollHeight) # document.body.scrollHeight 当前窗口的高度

练习2

from selenium import webdriver
import time

driver = webdriver.Chrome()  # 初始化一个谷歌浏览器
driver.maximize_window()  # 浏览器窗口最大化
driver.get("https://readhub.cn/topics")   # 打开一个存在懒加载的网页

time.sleep(5)   # 等待一段时间,待页面加载出来再执行js代码

# 方法二:滚动到窗口底部
# 拉到底部,但是有新的加载就会退回到三分之二的位置;加载出来后又跳到四分之一的位置
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)   # 等待一段时间,方便查看滚动的效果
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')  # 再继续滚动

方法三:将元素滚动到可视范围之内

场景:有时候元素在比较下面,需要先滚动下页面才能看到元素并点击
document.getElementById(“id”).scrollIntoView()
或者分成两行写:
el = document.getElementById(“id”)
el.scrollIntoView()

练习3

from selenium import webdriver
import time

driver = webdriver.Chrome()  # 初始化一个谷歌浏览器
driver.maximize_window()  # 浏览器窗口最大化
driver.get("https://www.baidu.com/s?ie=UTF-8&wd=%E8%8A%B1%E9%9D%99%E9%80%B8")   # 打开百度搜索“花静逸”的结果页

time.sleep(5)   # 等待一段时间,待页面加载出来再执行js代码

# document.getElementsByClassName("pc")[1]   # js指令:百度搜索结果页,定位页面底部翻页的元素“2”
driver.execute_script('document.getElementsByClassName("pc")[1].scrollIntoView()')

# 或者分成两行写
driver.execute_script('el = document.getElementsByClassName("pc")[1]')
driver.execute_script('el.scrollIntoView()')

注意:练习3中有个坑
getElementsByClassName 定位到的是一组元素,我们需要通过索引(从0开始)来取到元素“2”
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_48415452/article/details/120272120