Selenium执行driver.execute_script获取window.pageYOffset返回0与实际不符问题
Selenium获取window.pageYOffset始终为0的解决方案
- 执行上下文指向错误iframe
Selenium默认在最顶层window执行JS脚本,如果页面实际滚动的内容在嵌套的iframe内,顶层window的滚动偏移自然为0。需要先切换到对应iframe再取值:
from selenium.webdriver.common.by import By # 定位到滚动内容所属的iframe元素 target_iframe = driver.find_element(By.CSS_SELECTOR, "替换为你的iframe选择器") driver.switch_to.frame(target_iframe) # 此时获取的就是iframe内的滚动偏移 print("!!!:" + str(driver.execute_script("return window.pageYOffset;"))) # 后续要操作外层页面时记得切回默认上下文 driver.switch_to.default_content()
- 未等待滚动动作执行完成就取值
如果代码执行滚动操作后立刻获取偏移,页面滚动动画还未结束就执行了JS脚本,会拿到滚动前的0值。可以添加等待逻辑验证:
from time import sleep # 执行滚动操作后先等待1秒,生产环境建议换成显式等待判断滚动完成 driver.execute_script("window.scrollTo(0, 1600)") sleep(1) print(driver.execute_script("return window.pageYOffset;"))
- 滚动区域是自定义容器而非全局window
很多单页应用的可滚动区域是指定的div元素,而非整个浏览器窗口,此时window.pageYOffset永远为0,需要单独获取该容器的scrollTop属性:
from selenium.webdriver.common.by import By # 替换为实际滚动的div容器的选择器 scroll_box = driver.find_element(By.CSS_SELECTOR, "替换为滚动容器的选择器") offset = driver.execute_script("return arguments[0].scrollTop;", scroll_box) print("!!!:" + str(offset))
- 当前绑定的窗口不匹配
如果同时打开了多个标签页或浏览器窗口,Selenium当前绑定的窗口不是你手动验证的那个窗口,也会出现取值不一致的问题,需要先切换到对应窗口再执行操作。
内容的提问来源于stack exchange,提问作者Nico1300
相关产品推荐
相关产品推荐

