一、滚动的作用
滚动是指页面自动或手动向上或向下移动,从而显示隐藏在浏览器视窗外的内容。一些网页会将部分内容隐藏,需要滚动才能看到;有时,为了更好的用户体验,需要实现页面的滚动,例如:滚动到顶部或底部实现加载更多。
二、selenium中滚动方法介绍
selenium支持三种滚动方式:
1、使用Javascript执行滚动
from selenium.webdriver.common.action_chains import AcitonChains
# 执行Javascript,滚动到目标元素
target_ele = driver.find_element_by_css_selector("#target-element")
driver.execute_script("arguments[0].scrollIntoView();", target_ele)
说明:
① find_element_by_css_selector
:查找目标元素;
② execute_script
:执行JavaScript脚本,滚动到目标元素。
2、使用Keys.ARROW_DOWN键盘按键
from selenium.webdriver.common.keys import Keys
# 执行键盘按键,向下滚动
target_ele = driver.find_element_by_css_selector("#target-element")
target_ele.send_keys(Keys.ARROW_DOWN)
说明:
① find_element_by_css_selector
:查找目标元素;
② send_keys(Keys.ARROW_DOWN)
:执行向下滚动。
3、使用ActionChains实现鼠标滚轮滚动
from selenium.webdriver.common.action_chains import ActionChains
# 执行鼠标滚轮滚动,滚动到目标元素
target_ele = driver.find_element_by_css_selector("#target-element")
ActionChains(driver).move_to_element(target_ele).perform()
说明:
① find_element_by_css_selector
:查找目标元素;
② ActionChains(driver).move_to_element(target_ele).perform()
:鼠标移动到目标元素,并向下滚动。
三、滚动到指定元素为中心
有时候,需要滚动到指定元素为中心点,使得该元素在浏览器视窗的中心,代码实现如下:
from selenium.webdriver.common.action_chains import ActionChains
# 执行Javascript,滚动到目标元素
target_ele = driver.find_element_by_css_selector("#target-element")
driver.execute_script("arguments[0].scrollIntoView();", target_ele)
# 获取当前浏览器窗口大小
window_size = driver.get_window_size()
# 计算目标元素在浏览器视窗中心点的坐标
x = int(window_size["width"] / 2)
y = int(target_ele.location["y"] + target_ele.size["height"] / 2)
# 执行鼠标移动到目标元素并执行滚轮滚动
ActionChains(driver).move_to_element_with_offset(target_ele, 0, -50).perform()
ActionChains(driver).move_to_element_with_offset(target_ele, 0, -70).perform()
ActionChains(driver).move_to_element_with_offset(target_ele, 0, -90).perform()
说明:
① find_element_by_css_selector
:查找目标元素;
② execute_script
:执行JavaScript脚本,滚动到目标元素;
③ get_window_size
:获取浏览器窗口大小;
④ location
、size
:获取元素的位置和大小;
⑤ ActionChains(driver).move_to_element_with_offset(target_ele, x, y)
:鼠标移动到指定元素并执行滚轮。
四、滚动的注意事项
在使用滚动的时候,需要注意以下几点:
1、等待元素加载完成再执行滚动
有时候,需要等待元素加载完成之后,滚动到目标元素,避免出现找不到元素的情况。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待目标元素加载
target_ele = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#target-element"))
)
# 执行Javascript,滚动到目标元素
driver.execute_script("arguments[0].scrollIntoView();", target_ele)
说明:
① presence_of_element_located
:等待元素出现;
② until
:等待时间是10秒钟。
2、滚动时避免遮挡元素
有时候,因为页面布局等原因,可能会出现目标元素被其它元素遮挡的情况,需要通过设置偏移量来避免。
from selenium.webdriver.common.action_chains import ActionChains
# 执行Javascript,滚动到目标元素
target_ele = driver.find_element_by_css_selector("#target-element")
driver.execute_script("arguments[0].scrollIntoView();", target_ele)
# 计算目标元素在浏览器视窗中心点的坐标
window_size = driver.get_window_size()
x = int(window_size["width"] / 2)
y = int(target_ele.location["y"] + target_ele.size["height"] / 2)
# 执行鼠标移动到目标元素并执行滚轮滚动
ActionChains(driver).move_to_element_with_offset(target_ele, 0, -50).perform()
ActionChains(driver).move_to_element_with_offset(target_ele, 0, -70).perform()
ActionChains(driver).move_to_element_with_offset(target_ele, 0, -90).perform()
说明: 在滚动前,先通过JavaScript将目标元素滚动到浏览器视窗的中心,然后通过ActionChains设置偏移量滚动页面。
3、多次滚动以避免惯性滚动
由于JavaScript滚动和鼠标滚动都是以一定的速度滚动的,可能会出现惯性滚动的情况,需要通过多次滚动以避免。
from selenium.webdriver.common.action_chains import ActionChains
# 执行Javascript,滚动到目标元素
target_ele = driver.find_element_by_css_selector("#target-element")
driver.execute_script("arguments[0].scrollIntoView();", target_ele)
# 获取当前浏览器窗口大小
window_size = driver.get_window_size()
# 计算目标元素在浏览器视窗中心点的坐标
x = int(window_size["width"] / 2)
y = int(target_ele.location["y"] + target_ele.size["height"] / 2)
# 执行鼠标移动到目标元素并执行滚轮滚动
ActionChains(driver).move_to_element_with_offset(target_ele, 0, -50).perform()
ActionChains(driver).move_to_element_with_offset(target_ele, 0, -70).perform()
ActionChains(driver).move_to_element_with_offset(target_ele, 0, -90).perform()
说明: 通过多次执行滚动,可以将惯性滚动的距离逐渐减小。