2013-07-19 12 views
8

के साथ कुंजी को कैसे दबाया जाए मैं पाइथन और क्रोम के साथ सेलेनियम का उपयोग कर रहा हूं। मैं विभिन्न चाबियाँ पकड़ने की कोशिश कर रहा हूं - खासकर "डब्ल्यू, ए, एस, और डी।" मैंने सेलेनियम की action_chains.key_press कार्रवाई के साथ-साथ elem.send_keys विधि भी पाई है। पहली विधि के साथ समस्या यह है कि जब तक यह एक एक्शन श्रृंखला को पूरा करने में लगती है तब तक यह केवल कुंजी नीचे रखती है। Elem.send_keys विधि के साथ समस्या यह है कि इसमें कुंजी भेजने के लिए कोई तत्व नहीं है।सेलेनियम

मैं डब्ल्यू-ए-एस-डी के साथ एक वेब ब्राउज़र आधारित रोबोट को नियंत्रित करने की कोशिश कर रहा हूं, इसलिए मुझे अलग-अलग अवधि के लिए कुंजी पकड़ने की आवश्यकता है।

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

केवल पुष्टि के लिए, तुम कह रहे हो कि 'action_chains.key_down (" डब्ल्यू ")' नहीं था काम? या क्या आपको कुछ समय बीतने के बाद कुंजी उठाने की विधि चाहिए? – alex

+0

'action_chains.key_down (" w ") 'काम करता है, लेकिन केवल दूसरे भाग के लिए यह मेरे कंप्यूटर को उस क्रिया को करने के लिए लेता है। स्पष्ट रूप से पैकेज के डिजाइनरों ने इसे न्यूनतम समय संभव बना दिया।मुझे इसे पकड़ने और फिर कुछ समय बाद रिलीज करने का एक तरीका चाहिए। –

+0

[पायथन सिमुलेट कीडाउन] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/11906925/python-simulate-keydown) – Yuu

उत्तर

0

सेलेनियम क्रिया श्रृंखला केवल संशोधक कुंजी (नियंत्रण, Alt और Shift) के साथ उपयोग की जानी चाहिए। तो आप केवल अक्षर w-a-s-d दबाएं। ताकि, यह काम नहीं किया।

आप pyautogui की तरह किसी भी जीयूआई स्वचालन उपकरण का उपयोग कर सकते आदि

कोड नीचे कोशिश करते हैं और तो कृपया मुझे बताएं।

import pyautogui 

pyautogui.PAUSE = 10 
pyautogui.keyDown('w') 
pyautogui.keyUp('w') 

pyautogui.PAUSE = 10 आदेश 10 सेकंड थामने प्रत्येक PyAutoGUI फोन

+0

मुझे सेलेनियम पर कुछ संभावित समाधान की आवश्यकता है। यह सुनिश्चित करने के लिए, यह क्रिया केवल वेब पेजविंडो में दिखाई देती है। लेकिन अन्य स्थानों में नहीं। – GensaGames

+0

यह क्रिया तब होती है जहां कर्सर कभी भी होता है। इस कोड से पहले आप सेलेनियम का उपयोग कर ब्राउज़र विंडो सक्रिय कर सकते हैं। और सेलेनियम एक्शन चेन ऑपरेशन की आवश्यकता है ब्रोवर शीर्ष खिड़की होना चाहिए। अन्यथा कुंजी बोर्ड और माउस ऑपरेशंस काम नहीं करेंगे। – Murthi

+0

मैंने पहले एक्शन चेन एक्शन का उपयोग नहीं किया था, लेकिन अन्य क्रियाएं, जैसे WebDriver.send_keys() बिना किसी समस्या के काम करती हैं, जब भी क्रोम विंडो छिपी होती है। – GensaGames

0

key_down के लिए Selenium Documentation के अनुसार के बाद बनाने के लिए, यह कहा गया है:

केवल आपरिवर्तक कुंजी के साथ उपयोग किया जाना चाहिए (नियंत्रण , Alt और Shift)।

मैंने वैकल्पिक समाधान के लिए दस्तावेज़ों की खोज की है, लेकिन ऐसा लगता है कि सेलेनियम में गैर-संशोधक कुंजी "पकड़ना" संभव नहीं है।

+0

पर 'डब्ल्यू' दबाता है, यह सेलेनियम में चेतावनी की तरह है। कॉलिंग 'key_down' अन्य कुंजी के लिए काम करता है, लेकिन केवल क्लिक करने और पकड़ने की तरह नहीं (और मुझे नहीं पता, क्यों)। – GensaGames

+0

@GensaGames कभी-कभी (दुर्भाग्य से) इस प्रकार के प्रश्नों का उत्तर बस "यह संभव नहीं है" है। आप निश्चित रूप से इसे एक नई सुविधा के रूप में अनुरोध कर सकते हैं या सुविधा को स्वयं यहां योगदान दे सकते हैं: https://github.com/SeleniumHQ/www.seleniumhq.org/issues –

+0

@GensaGames क्या आप कृपया उस व्यवहार का वर्णन कर सकते हैं जिसका आप परीक्षण करने का प्रयास कर रहे हैं? –

2

क्रोम (संस्करण 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) 
+0

बढ़िया! इस बीच, फ़ायरफ़ॉक्स का उपयोग करना मेरे लिए ठीक है, लेकिन यह जानकारी हर जगह से क्यों गुम है? और मैं अभी भी समझ नहीं पा रहा हूं कि क्रोम के लिए समस्या क्या है, इस कार्रवाई का समर्थन करने के लिए! यह कुछ स्थितियों के लिए उपयोगी है, जैसे कैनवास फ़ील्ड, जहां आपको विभिन्न कीबोर्ड इनपुट का परीक्षण करने की आवश्यकता है। – GensaGames

+0

प्रोटोकॉल सेलेनियम 2 और 3 के बीच विशेष रूप से जंजीर कार्रवाइयों के लिए बहुत कुछ बदल गया है। आप पुरानी और नई कल्पना पढ़कर यह जानकारी पा सकते हैं। मुझे नहीं पता कि क्रोम नए एपीआई में क्यों नहीं चले गए हैं। संसाधन/बजट मुद्दा हो सकता है। –