如何用Selenium按住键

时间:2013-07-19 22:34:22

标签: python selenium input keyboard simulate

我正在使用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)

两者都不理想。

3 个答案:

答案 0 :(得分:4)

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

但是,从版本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)

答案 1 :(得分:1)

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秒

答案 2 :(得分:0)

根据key_down的{​​{3}},它声明:

  

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

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