【问题标题】:Scroll element horizontally - Selenium Python水平滚动元素 - Selenium Python
【发布时间】:2021-06-30 16:29:22
【问题描述】:

假设我想在某个元素中滚动滚动条。 例如,让我们以链接“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)

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

【问题讨论】:

  • 首先,您要完成 - 即在我们讨论如何向右滚动之前,您为什么要向右滚动。使用 Selenium,您很少需要在表格中滚动以继续定位该表格中的元素,除非它是滚动加载 - 这几乎总是 [据我所见] 由向下滚动触发,而不是正确的。
  • 我真的很想显示向下滚动的元素(在另一个网站上)。但是这个例子(链接)是我能找到的最简单的例子。如果我可以在此表中向右滚动,我想我可以在其他表中向下滚动;)
  • 您是想向下滚动以使其 js 加载更多元素,还是只是将它们放入用户的视图中?再说一次,你实际上想要完成什么?为什么要向下滚动以显示这些元素?
  • 我要浏览的网站是,例如:“morningstar.com/stocks/xnas/tsla/financials”。然后,您打开名称为“损益表”的链接,您会看到一个值表。有些值是隐藏的,只有在我滚动滚动条时才会出现。如何获取这些元素(值)?

标签: python selenium scrollbar


【解决方案1】:

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

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

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

如果您在从相关表格中选择特定元素时遇到问题(如果您需要特定代码 sn-p),请随时发表评论 - 我对 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()

【讨论】:

  • 好的,谢谢。明天我会再试一次,好像元素没有隐藏一样。我会报告的?
  • 好的,所以.. 我试过了。而且我无法选择桌子上我看不到的元素。如果我去检查员,元素不会出现在那里,直到我向右(或向下)滚动。无需任何滚动,您能否检索 2019 年以来的 Total Revenue(或包含这些值的元素)的值?
  • 好的,看看那个,让我知道你的想法。我必须跑,但如果你需要的话,我明天可以用右箭头键代码 sn-p 回来查看
  • 您可以点击“更多财务数据”打开下面的元素。但是,如果您能帮助我向右滚动或检索值,我将不胜感激。顺便说一句,不要使用这样的 xpath 搜索。您可以使用如下内容: driver.find_element_by_xpath("//*[normalize-space(text())='More Financials Detail Data']").click()
  • @Rodolfo - 已修复,请随意修复我的 xpath 或使用其他选择器来调整我的代码以处理您可能想要使用的所有不同页面:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多