क्रोम (संस्करण 2.30) के लिए वर्तमान ड्राइवर पिछले प्रोटोकॉल को लागू करता है जहां एक कुंजी धारण करने के लिए केवल एक संशोधक कुंजी (नियंत्रण, शिफ्ट, Alt, कमांड) के लिए समर्थित है।
तो यह कोड Firefox के साथ काम करता है लेकिन के बाद से 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 के बाद से, क्रोम ड्राइवर send_command
सीधे एक कच्चे भेजने के लिए समर्थन करता है devtools प्रोटोकॉल के माध्यम से आदेश। तो एक वर्कअराउंड के रूप में, आप कम स्तर की घटनाओं को उत्सर्जित करने के लिए Input.dispatchKeyEvent पर कॉल कर सकते हैं।
यह सेलेनियम/क्रोम के साथ एक काम कर उदाहरण धारण करने के लिए कुंजी 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)
स्रोत
2017-06-14 11:22:29
केवल पुष्टि के लिए, तुम कह रहे हो कि 'action_chains.key_down (" डब्ल्यू ")' नहीं था काम? या क्या आपको कुछ समय बीतने के बाद कुंजी उठाने की विधि चाहिए? – alex
'action_chains.key_down (" w ") 'काम करता है, लेकिन केवल दूसरे भाग के लिए यह मेरे कंप्यूटर को उस क्रिया को करने के लिए लेता है। स्पष्ट रूप से पैकेज के डिजाइनरों ने इसे न्यूनतम समय संभव बना दिया।मुझे इसे पकड़ने और फिर कुछ समय बाद रिलीज करने का एक तरीका चाहिए। –
[पायथन सिमुलेट कीडाउन] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/11906925/python-simulate-keydown) – Yuu