【问题标题】:How to hold key down with Selenium如何用 Selenium 按住键
【发布时间】:2013-07-19 08:32:01
【问题描述】:

我将 Selenium 与 Python 和 Chrome 一起使用。我试图按住各种键——特别是“w、a、s 和 d”。我找到了 Selenium 的 action_chains.key_press 动作以及 elem.send_keys 方法。第一种方法的问题在于,它只在完成一个动作链所需的时间内按住键。 elem.send_keys 方法的问题在于它没有将密钥发送到的元素。

我正在尝试使用 W-A-S-D 控制基于 Web 浏览器的机器人,因此我需要按住按键不同的持续时间。

我尝试了以下方法:

action_chains = ActionChains(driver)
action_chains.key_down("w")
action_chains.key_up("w")

还有:

action_chains.key_press(elem, "w")
for x in range (0, 100):
    action_chains.perform()
    time.sleep(.01)

两者都不理想。

【问题讨论】:

  • 确认一下,您是说action_chains.key_down("w") 不起作用?或者您是否需要一段时间后解除钥匙的方法?
  • action_chains.key_down("w") 确实有效,但仅在我的计算机执行该操作所需的瞬间。显然,包装的设计者尽可能缩短了时间。我需要一种方法来按住它,然后在一段时间后释放它。
  • Python simulate keydown的可能重复

标签: python selenium input keyboard simulate


【解决方案1】:

Chrome 的当前驱动程序(2.30 版)实现了以前的协议,其中仅支持修改键(Control、Shift、Alt、Command)按住键。

因此,此代码适用于 Firefox,但适用于 Chrome,因为每个 keyDown 都会发出 keyUp 事件:

action_key_down_w = ActionChains(driver).key_down("w")
action_key_up_w = ActionChains(driver).key_up("w")

endtime = time.time() + 1.0

while True:
  action_key_down_w.perform()

  if time.time() > endtime:
    action_key_up_w.perform()
    break

但是,从 2.30 版开始,Chrome 驱动程序支持 send_command 通过 devtools 协议直接发送原始命令。 因此,作为一种解决方法,您可以调用 Input.dispatchKeyEvent 来发出低级别事件。

这是一个使用 Selenium/Chrome 在一秒钟内保持密钥 w 的工作示例:

from selenium import webdriver
import json, time

def dispatchKeyEvent(driver, name, options = {}):
  options["type"] = name
  body = json.dumps({'cmd': 'Input.dispatchKeyEvent', 'params': options})
  resource = "/session/%s/chromium/send_command" % driver.session_id
  url = driver.command_executor._url + resource
  driver.command_executor._request('POST', url, body)

def holdKeyW(driver, duration):
  endtime = time.time() + duration
  options = { \
    "code": "KeyW",
    "key": "w",
    "text": "w",
    "unmodifiedText": "w",
    "nativeVirtualKeyCode": ord("W"),
    "windowsVirtualKeyCode": ord("W")
  }

  while True:
    dispatchKeyEvent(driver, "rawKeyDown", options)
    dispatchKeyEvent(driver, "char", options)

    if time.time() > endtime:
      dispatchKeyEvent(driver, "keyUp", options)
      break

    options["autoRepeat"] = True
    time.sleep(0.01)


driver = webdriver.Chrome()
driver.get("https://stackoverflow.com/questions")

# set the focus on the targeted element
driver.find_element_by_css_selector("input[name=q]").click()

# press the key W during a second
holdKeyW(driver, 1.0)

【讨论】:

  • 太棒了!同时,我可以使用 Firefox,但为什么到处都缺少这些信息?而且我还是不明白 Chrome 有什么问题,支持这个动作!它在某些情况下非常有用,例如 Canvas Fields,您需要在其中测试不同的键盘输入。
  • Selenium 2 和 3 之间的协议发生了很大变化,尤其是对于链式操作。您可以通过阅读旧规范和新规范来找到此信息。我不知道为什么 Chrome 还没有迁移到新的 api。可能是资源/预算问题。
【解决方案2】:

Selenium 动作链只能与修饰键(Control、Alt 和 Shift)一起使用。所以你只想按字符 w-a-s-d。所以,它没有工作。

您可以使用任何 gui 自动化工具,例如 pyautogui 等。

请尝试下面的代码并告诉我。

import pyautogui

pyautogui.PAUSE = 10
pyautogui.keyDown('w')
pyautogui.keyUp('w')

pyautogui.PAUSE=10 命令在每次 PyAutoGUI 调用后暂停 10 秒

【讨论】:

  • 我需要一些关于 Selenium 的可能解决方案。为确保此操作仅出现在 Web PageWindow 中。但不是在其他地方。
  • 这个动作发生在光标所在的位置。在此代码之前,您可以使用 selenium 使浏览器窗口处于活动状态。而selenium action链的操作需要brower应该是top window。否则键盘和鼠标操作将不起作用。
  • 我之前没有使用 Action Chain 动作,但其他动作,如 WebDriver.send_keys(),只要 Chrome 窗口被隐藏,就可以正常工作。
【解决方案3】:

根据Selenium Documentation for key_down,它声明:

只能与修饰键(Control、Alt 和 Shift)一起使用。

我已经在文档中搜索了替代解决方案,但似乎在 Selenium 中“按住”非修饰键的行为是不可能的。

【讨论】:

  • 这就像 Selenium 中的警告。调用`key_down`适用于其他键,但只喜欢点击,而不是按住(我不知道,为什么)。
  • @GensaGames 有时(不幸的是)这些问题的答案只是“不可能”。您绝对可以在此处将其作为新功能请求或自己贡献功能:github.com/SeleniumHQ/www.seleniumhq.org/issues
  • @GensaGames 你能描述一下你要测试的行为吗?
  • 尝试测试 Canvas 的更改。例如。 chromedino.com 需要在哪里按住 Keys.ARROW_DOWN 动作一段时间。
  • @GensaGames 我之前没有做过任何需要在画布上测试 keydown 事件的项目,但我不相信 Selenium 会是合适的工具。我会考虑使用不同的自动化工具。
【解决方案4】:

ActionChains(driver).key_down("w").pause(0.1).key_up("w").perform()

通过将key_downkey_up.pause(0.1) 连接起来,您可以在任意自定义持续时间内按住按键。

尽管根据docskey_down 只能与修饰键一起使用,但事实证明它可以与任何键一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2017-04-30
    • 2021-03-17
    相关资源
    最近更新 更多