如何用Selenium按住键

And*_*w K 10 python keyboard selenium input simulate

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

我试图用WASD控制一个基于Web浏览器的机器人,所以我需要按住键不同的持续时间.

我尝试过以下方法:

action_chains = ActionChains(driver)
action_chains.key_down("w")
action_chains.key_up("w")
Run Code Online (Sandbox Code Playgroud)

以及:

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

两者都不理想.

Flo*_* B. 5

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

所以这段代码适用于 Firefox,但在 Chrome 中失败,因为keyUp每个都发出了事件keyDown

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
Run Code Online (Sandbox Code Playgroud)

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

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

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)
Run Code Online (Sandbox Code Playgroud)


Mur*_*thi 2

Selenium 操作链只能与修饰键(Control、Alt 和 Shift)一起使用。所以你只想按字符 wasd。所以,它不起作用。

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

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

import pyautogui

pyautogui.PAUSE = 10
pyautogui.keyDown('w')
pyautogui.keyUp('w')
Run Code Online (Sandbox Code Playgroud)

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