首页 > 解决方案 > 水平滚动元素 - Selenium Python

问题描述

假设我想在某个元素中滚动滚动条。例如,让我们以链接“https://www.w3schools.com/howto/howto_css_table_responsive.asp”为例。如果我运行:

element = driver.find_element_by_xpath("//table")

我得到了表格元素。但是现在,我想水平滚动滚动条,即控制该表的视图。我怎样才能做到这一点?我已经尝试过类似的东西:

driver.execute_script("arguments[0].scrollLeft = 200;",element)

但我没有成功。我也尝试发送密钥,但也没有用。

标签: pythonseleniumscrollbar

解决方案


您不需要真正能够看到 Selenium 的元素来定位它们。

只需继续定位“屏幕外”的元素,就像它们在屏幕上一样。

Selenium 的目标是 DOM - 作为一个松散的类比,我可能会在评论中被烤熟,就像一个具有无限长度和宽度的屏幕 - 所以不需要滚动 - 它(selenium)已经可以“看到”上面的所有内容'无限屏幕'

如果您在从相关表格中选择特定元素时遇到问题(如果您需要特定的代码片段),请随时发表评论 - 我对 Selenium 相当熟悉。

编辑:

在您的特定情况下,由于它们是动态加载的,因此您需要滚动以获取数据是 100% 正确的。More Financial Data让我们通过点击底部展开列表的按钮来处理垂直滚动。

现在滚动到右侧 - 因为我们可以一直滚动到右侧并让我们需要访问的所有数据可见(假设您没有高级帐户)。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Firefox()
url = "https://www.morningstar.com/stocks/xnas/tsla/financials"
driver.get(url)
driver.maximize_window()
# Click on Income Statement
xpath = '//*[@id="__layout"]/div/div[2]/div[3]/main/div[2]/div/div/div[1]/sal-components/section/div/div/div/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div[2]/div[2]/div[1]/div[1]/a'
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath))).click()
# click on More Financials Detail Data
xpath = '//*[@id="__layout"]/div/div[2]/div[3]/main/div[2]/div/div/div[1]/sal-components/section/div/div/div/div/div[2]/div/div[2]/div/div[2]/div/div[3]/div[2]/div/a'
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath))).click()

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

xpath='/html/body/div[2]/div/div/div[2]/div[3]/main/div[2]/div/div/div[1]/sal-components/section/div/div/div/div/div[2]/div/div[2]/div/div[2]/div/div[2]/div[4]/div/div[3]/div[2]/div[2]'
horizontal_bar_width = driver.find_element_by_xpath(xpath).rect['width']
slider = driver.find_element_by_xpath(xpath)
ActionChains(driver).click_and_hold(slider).move_by_offset(horizontal_bar_width/2, 0).release().perform()

推荐阅读