Aktualny sterownik dla Chrome (wersja 2.30) implementuje poprzedni protokół, w którym trzymanie klucza jest obsługiwane tylko dla klawisza modyfikującego (Control, Shift, Alt, Command).
Więc ten kod działa z Firefoksem ale nie z Chrome ponieważ zdarzenie keyUp
jest emitowany za każdym 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
Ale od wersji 2.30, kierowca Chrome obsługuje send_command
bezpośrednio wysłać surowe polecenie za pośrednictwem protokołu devtools. W celu obejścia tego problemu można zadzwonić pod numer Input.dispatchKeyEvent, aby emitować zdarzenia o niskim poziomie.
To jest przykład pracy z selenem/Chrome do przytrzymaj klawisz w
podczas drugiego:
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)
Wystarczy, aby potwierdzić, mówisz, że 'action_chains.key_down ("W")' nie praca? A może potrzebujesz metody podnoszenia klucza po pewnym czasie? – alex
'action_chains.key_down (" w ")' działa, ale tylko na ułamek sekundy, który zajmuje komputerowi wykonanie tej akcji. Oczywiście projektanci paczki sprawili, że zajmuje to jak najmniej czasu.Potrzebuję sposobu, aby go przytrzymać, a następnie zwolnić po pewnym czasie. –
Możliwy duplikat [Python symuluje keydown] (http://stackoverflow.com/questions/11906925/python-simulate-keydown) – Yuu