我的脚本正在从 Slack 聊天中抓取数据,但我没有 API,因此我使用 Selenium 进行网页抓取,当我刷新页面时,我需要滚动到消息页面的底部。
我设法使用选择器有效地定位滚动条,并且我正在尝试不同的方法来向下移动页面,但它没有移动一英寸。
感谢您的任何建议!
scroll_selector = 'body > div.p-client_container > div > div > div.p-client_workspace_wrapper > div.p-client_workspace > div.p-client_workspace__layout > div:nth-child(2) > div:nth-child(2) > div > div.p-file_drag_drop__container > div.p-workspace__primary_view_body > div > div:nth-child(3) > div > div > div.c-scrollbar__track > div'
try:
WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.CSS_SELECTOR, scroll_selector)))
scrollbar_track = driver.find_element(By.CSS_SELECTOR, scroll_selector)
print("HTML Element located")
except TimeoutException:
print("HTML Element not located")
# Here different options tried to move the sidebar
driver.execute_script("arguments[0].click();", scrollbar_track)
logger.debug("Scroll bar Clicked")
driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scrollbar_track)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
scrollbar_track.send_keys(Keys.PAGE_DOWN)
scrollbar_track.send_keys(Keys.DOWN)
time.sleep(2)
scrollbar_track.send_keys(Keys.DOWN)
我记得我有 Slack,并检查了 HTML。因此,当 HTML 文档大于视口时,您可以使用
window.scrollTo()
上下滚动。但在本例中,滚动包含在 HTML 元素(消息区域)内。因此我们需要在元素上调用 scrollTo()
(而不是滚动条本身)。
哪个元素实际上在滚动并不明显。我必须在开发控制台中使用以下代码将事件侦听器绑定到所有元素,以便我可以找到它:
document.querySelectorAll("*").forEach(function(div){
// Bind each to a scroll event listener
div.addEventListener("scroll", function(){
console.log(this);
});
});
(归功于斯科特·马库斯)
元素所在位置:
<div data-qa="slack_kit_scrollbar" role="presentation" class="c-scrollbar__hider" tabindex="-1">
然后我构建了一个 XPATH 来查找这个元素。有两个滚动条,一个用于频道/DM,一个用于消息。所以 XPATH 是
(//div[@data-qa="slack_kit_scrollbar"])[2]
。
放在一起:
messages_scroller = driver.find_element(By.XPATH,
'(//div[@data-qa="slack_kit_scrollbar"])[2]')
driver.execute_script("arguments[0].scrollTo(0, arguments[0].scrollHeight);",
messages_scroller)