如何在Python版Selenium中操作Javascript渲染的自定义滚动条
纯Selenium实现方案
你遇到的是Angular CDK虚拟滚动组件的独立容器滚动条,之前操作失败的核心原因是window.scrollTo操作的是全局窗口滚动,而非这个独立容器的滚动属性,直接修改transform样式会绕过CDK的滚动监听逻辑,自然无法触发内容渲染。以下是可直接落地的实现方法:
方案1:直接修改滚动容器的scrollTop属性
你已经定位到的cdk-virtual-scroll-viewport就是实际的滚动容器,直接通过JS修改它的原生滚动属性即可触发正常的内容加载:
# 你之前定位到的滚动容器元素 scroll_container = browser.find_element(By.XPATH, '''/html/body/ess-root/core-ui-theme/ess-core-layout/pol-layout/pol-content/ess-employee-list-page/ div/div/ess-employee-cards-container/cdk-virtual-scroll-viewport''') # 直接修改容器滚动高度,会自动触发CDK的内容渲染逻辑 browser.execute_script('arguments[0].scrollTop = 300', scroll_container)
如果需要滚动到底部,直接赋值arguments[0].scrollTop = arguments[0].scrollHeight即可。
方案2:先聚焦容器再触发滚动事件
和你用pyautogui聚焦后滚动的逻辑一致,纯Selenium也可以实现聚焦后触发滚动:
from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys scroll_container = browser.find_element(By.XPATH, '''/html/body/ess-root/core-ui-theme/ess-core-layout/pol-layout/pol-content/ess-employee-list-page/ div/div/ess-employee-cards-container/cdk-virtual-scroll-viewport''') # 先点击聚焦滚动容器 scroll_container.click() # 发送翻页/向下按键触发滚动,也可以按多次实现滚动指定距离 ActionChains(browser).send_keys(Keys.PAGE_DOWN).perform()
方案3:调用元素原生滚动方法
也可以直接调用DOM元素自带的scrollBy方法实现滚动:
scroll_container = browser.find_element(By.XPATH, '''/html/body/ess-root/core-ui-theme/ess-core-layout/pol-layout/pol-content/ess-employee-list-page/ div/div/ess-employee-cards-container/cdk-virtual-scroll-viewport''') # 相对当前位置向下滚动300像素 browser.execute_script('arguments[0].scrollBy(0, 300)', scroll_container)
内容的提问来源于stack exchange,提问作者tonywang
相关产品推荐
相关产品推荐

