在 Chrome Selenium 弹出窗口 Python 上使用箭头键
Using arrow keys on Chrome Selenium popup Python
我想在下一页的弹出窗口中使用滚动条。如果您单击页面上的任何产品,它将打开一个弹出窗口,您可以在其中添加额外的项目。我正在尝试使用 Keys.send_keys(Keys.ARROW_DOWN)
向下滚动弹出窗口,但我在 Chrome 中找不到滚动条元素。我试过使用其他方法移动到元素但没有成功,所以想尝试使用箭头键。
https://www.just-eat.co.uk/restaurants-mcdonalds-victorialondon/menu
我设法在 FireFox 的弹出窗口中使用箭头键,但无法在 Chrome 中复制。
我喜欢在使用 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');");
以上两种解决方案之一应该可以解决您的问题。
您可以尝试在弹出窗口中找到一个元素,然后使用该元素进行滚动。这里的技巧是 确保该元素是可聚焦的 以便您可以使用它来使用箭头键进行滚动。 可获得焦点的元素是那些可以接收键盘事件的元素,这些元素在其中声明了焦点函数。由于w3c文档http://www.w3.org/TR/DOM-Level-2-HTML/html.html长期不更新,我们没有可聚焦元素的列表,但是根据它的一些可聚焦元素是HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement, HTMLIFrameElement 、HTMLButtonElement、HTMLAnchorElement 和任何带有 tabindex 的元素。
以下是供您参考的示例代码片段。
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)
首先可能需要反复试验才能使其适合您的用例。
我不确定您已经尝试了什么,什么失败了,但是既然您提到了弹出窗口 window,您需要确保您在正确的 [=21] 上操作=](即弹出窗口)。
请点击这里了解更多详情:focus different window
一旦您确认您在正确的 window 上操作,上面的回复应该可以解决问题。您可能还会发现此 link 对 scroll a webpage
有用
最后但并非最不重要的一点是,始终建议您分享一个可重现的代码示例以帮助其他人帮助您;)
祝你好运
您可以使用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)
我想在下一页的弹出窗口中使用滚动条。如果您单击页面上的任何产品,它将打开一个弹出窗口,您可以在其中添加额外的项目。我正在尝试使用 Keys.send_keys(Keys.ARROW_DOWN)
向下滚动弹出窗口,但我在 Chrome 中找不到滚动条元素。我试过使用其他方法移动到元素但没有成功,所以想尝试使用箭头键。
https://www.just-eat.co.uk/restaurants-mcdonalds-victorialondon/menu
我设法在 FireFox 的弹出窗口中使用箭头键,但无法在 Chrome 中复制。
我喜欢在使用 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');");
以上两种解决方案之一应该可以解决您的问题。
您可以尝试在弹出窗口中找到一个元素,然后使用该元素进行滚动。这里的技巧是 确保该元素是可聚焦的 以便您可以使用它来使用箭头键进行滚动。 可获得焦点的元素是那些可以接收键盘事件的元素,这些元素在其中声明了焦点函数。由于w3c文档http://www.w3.org/TR/DOM-Level-2-HTML/html.html长期不更新,我们没有可聚焦元素的列表,但是根据它的一些可聚焦元素是HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement, HTMLIFrameElement 、HTMLButtonElement、HTMLAnchorElement 和任何带有 tabindex 的元素。
以下是供您参考的示例代码片段。
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)
首先可能需要反复试验才能使其适合您的用例。
我不确定您已经尝试了什么,什么失败了,但是既然您提到了弹出窗口 window,您需要确保您在正确的 [=21] 上操作=](即弹出窗口)。
请点击这里了解更多详情:focus different window
一旦您确认您在正确的 window 上操作,上面的回复应该可以解决问题。您可能还会发现此 link 对 scroll a webpage
有用最后但并非最不重要的一点是,始终建议您分享一个可重现的代码示例以帮助其他人帮助您;) 祝你好运
您可以使用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)