我正在使用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)
两者都不理想。
答案 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中似乎无法“按住”非修改键的行为。