【问题标题】:Using arrow keys on Chrome Selenium popup Python在 Chrome Selenium 弹出 Python 上使用箭头键
【发布时间】:2022-01-21 10:11:51
【问题描述】:

我想在下面的页面中使用弹出窗口上的滚动条。如果您单击页面上的任何产品,它将打开一个弹出窗口,您可以在其中添加额外的项目。我正在尝试使用 Keys.send_keys(Keys.ARROW_DOWN) 向下滚动弹出窗口,但在 Chrome 中找不到滚动条元素。我尝试使用其他方法移动到元素但没有成功,所以想尝试使用箭头键。

https://www.just-eat.co.uk/restaurants-mcdonalds-victorialondon/menu

我设法在 FireFox 的弹出窗口中使用箭头键,但无法在 Chrome 中复制。

【问题讨论】:

标签: python selenium-webdriver selenium-chromedriver


【解决方案1】:

我喜欢在使用 Selenium 时使用 JavaScript 向下滚动。根据我的经验,它更可靠。

尝试以下方法:

X = 500
DRIVER_NAME.execute_script("window.scrollBy(0, X)")

另一种选择是首先通过将 CSS 注入网页来规避滚动的需要。您可以编写几行 CSS 代码,使弹出窗口的字体和行高非常小;这样,您无需滚动即可将所有内容都放入屏幕。

如下所示:

new_css = "body{background-color: white;}"
DRIVER_NAME.executeScript("$('<style type=\"text/css\">new_css</style>').appendTo('html > head');");

上述两种解决方案之一应该可以解决您的问题。

【讨论】:

  • 感谢您的帮助。第一个解决方案滚动弹出窗口后面的窗口,而不是实际的弹出窗口。我尝试切换到警报,但这会引发一个错误,即没有警报(弹出窗口不是警报)。第二种解决方案不是我以前遇到过的,我使用的是 python,所以我将其更改为DRIVER_NAME.execute_script,但出现错误selenium.common.exceptions.JavascriptException: Message: javascript error: $ is not defined
【解决方案2】:

您可以尝试在弹出窗口中找到一个元素,然后使用该元素进行滚动。这里的诀窍是确保元素可聚焦,以便您可以使用箭头键进行滚动。 可聚焦元素是可以接收键盘事件的元素,即在其中声明了焦点功能的元素。由于 w3c 文档http://www.w3.org/TR/DOM-Level-2-HTML/html.html 很久没有更新了,所以我们没有可聚焦元素的列表,但是根据它的一些可聚焦元素是 HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement, HTMLIFrameElement, HTMLButtonElement, HTMLAnchorElement以及任何带有 tabindex 的元素。

以下是示例代码 sn-p 供您参考。

from selenium.webdriver.common.keys import Keys

focusable_element_in_popup = driver.find_element_by_id('id_of_the_element')
focusable_element_in_popup.send_keys(Keys.ARROW_DOWN)

#or you can use //a magic using xpath to return you the any first link on popup, like below

#driver.find_element_by_xpath('//div[@class="some-class"]//a') 

或者您也可以使用 move_to_element 或 scrollIntoView ,如下所示。如果这不能按预期工作,请尝试在 move_to_element 之后添加 actions.click() 以使其聚焦。

from selenium.webdriver.common.action_chains import ActionChains

element = driver.find_element_by_id("my-id")

actions = ActionChains(driver)
actions.move_to_element(element).perform()

#actions.move_to_element(element)
#actions.click()
#actions.send_keys("SOME DATA")
#actions.perform()

#or 

driver.execute_script("arguments[0].scrollIntoView();", element)

首先可能需要进行一些试验和错误才能使其适合您的用例。

【讨论】:

  • 谢谢,我没有意识到我可以根据弹出窗口中的元素使用 send_keys,我想我必须找到滚动条。动作链对我不起作用,它总是滚动到弹出窗口之外,但手动滚动 arrow_down 有效。
【解决方案3】:

我不确定您已经尝试过什么以及什么失败了,但是由于您提到了弹出窗口的存在,您需要确保您在正确的窗口(即弹出窗口)上进行操作。

请在此处查看更多详细信息:focus different window

一旦您确认您在正确的窗口上操作,上面的回复应该可以解决问题。您可能还会发现此链接对scroll a webpage 很有用

最后但并非最不重要的一点是,始终建议分享您的代码的可重现示例以帮助他人帮助您;) 祝你好运

【讨论】:

  • 看起来弹出窗口不是另一个窗口,我在弹出窗口打开并且结果列表中只有一个元素时打印了 window_handles,我假设它是主窗口?不幸的是,我读过的所有内容都是关于滚动网页,而不是关于滚动弹出窗口
【解决方案4】:

您可以使用driver.switch_to.active_element 专注于弹出窗口并在其上使用Keys.ARROW_DOWN

driver.find_element_by_css_selector('[data-test-id="menu-item"]').click()  # open the popup
driver.find_element_by_class_name('c-modal-titleContainer').click()  # make the popup the active element
popup = driver.switch_to.active_element  # and switch to driver focus to it
for _ in range(10):
    popup.send_keys(Keys.ARROW_DOWN)

【讨论】:

  • 谢谢,这会向下滚动弹出窗口。我目前在一个while循环中使用它,我尝试单击该元素,如果有错误,那么我会popup.send_keys(Keys.ARROW_DOWN)。但是,当弹出窗口将元素滚动到视图中时,仍然没有单击该元素!我收到一个错误,告诉我“添加到订单”按钮会收到点击而不是元素,似乎这个按钮以某种方式“覆盖”在屏幕上,即使从物理上我可以看到元素在视图中仍然无法点击。当我在视图中滚动元素时,关于如何使元素可点击的任何想法?
  • @Callum 我不知道你想点击什么,但你总是可以使用 JavaScript 点击element = driver.find_element...driver.execute_script('arguments[0].click();', element)
  • 这是一个奇怪的弹出窗口,driver.execute_script('arguments[0].click();', element) 选择了元素,但它不像element.click() 那样点击它。很难解释,但弹出窗口意识到它没有被“正确”点击,如果我分享正在发生的事情的屏幕截图或者你尝试重新创建会更容易吗?
  • @Callum 你想点击什么,你使用的代码是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多