python - 水平滚动元素 - 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)
但我没有成功。我也尝试发送密钥,但也没有用。
解决方案
您不需要真正能够看到 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()
推荐阅读
- java - 一旦消息数量超过并发消费者数量,消费者就不会被分配给消息
- java - OpenJFX:捆绑版本与依赖项冲突
- java - 用于屏蔽电子邮件的正则表达式
- sql - 无法运行查询,因为它在 Access 中显示“无法使用多值字段执行查询、无效操作或语法”
- c# - 如何使用不同动态对象的列表设置动态对象数组属性
- c# - 我可以使用什么来从 Default.aspx 页面访问自定义表单?(ASP.NET/C#)
- mysql - row_number 在查询(mysql)上不起作用
- git - What is a 'temporary clone token' (in GitHub)
- ruby-on-rails - 如何在 Rails 中设置 Google 应用程序凭据
- flutter - Flutter CustomPaint,如何启用平移?