2013-07-19 34 views
8

Uso il selenio con Python e Chrome. Sto cercando di tenere premuti vari tasti, in particolare "w, a, s, d". Ho trovato l'azione action_chains.key_press di Selenium e il metodo elem.send_keys. Il problema con il primo metodo è che tiene premuto il tasto solo per il tempo necessario per completare una catena di azioni. Il problema con il metodo elem.send_keys è che non ha un elemento a cui inviare le chiavi.Come tenere premuto il tasto con selenio

Sto provando a controllare un robot basato su browser Web con W-A-S-D, quindi ho bisogno di tenere premuto i tasti per varie durate.

Ho provato quanto segue:

action_chains = ActionChains(driver) 
action_chains.key_down("w") 
action_chains.key_up("w") 

così come:

action_chains.key_press(elem, "w") 
for x in range (0, 100): 
    action_chains.perform() 
    time.sleep(.01) 

Né sono l'ideale.

+0

solo per confermare, stai dicendo che 'action_chains.key_down ("w")' non ha lavoro? O hai avuto bisogno di un metodo per sollevare la chiave dopo che è trascorso un po 'di tempo? – alex

+0

'action_chains.key_down (" w ")' funziona, ma solo per la frazione di secondo che il mio computer impiega a fare quell'azione. Ovviamente i progettisti del pacchetto hanno fatto il tempo minimo possibile.Ho bisogno di un modo per tenerlo premuto e poi rilasciarlo dopo un po 'di tempo. –

+0

Possibile duplicato di [Python simulate keydown] (http://stackoverflow.com/questions/11906925/python-simulate-keydown) – Yuu

risposta

0

Catena azioni selenio Deve essere utilizzata solo con i tasti modificatori (Controllo, Alt e Maiusc). Quindi vuoi premere solo il carattere w-a-s-d. così, non ha funzionato.

È possibile utilizzare qualsiasi strumenti di automazione gui come pyautogui, ecc

riprova sottostante Codice e fammi sapere.

import pyautogui 

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

pyautogui.PAUSE = 10 comando make 10 secondi di pausa dopo ogni PyAutoGUI chiamano

+0

Ho bisogno di qualche soluzione possibile su Selenium. Per essere sicuri, questa azione viene visualizzata solo in Web PageWindow. Ma non in altri posti. – GensaGames

+0

Questa azione si svolge ovunque sia il cursore. Prima di questo codice è possibile rendere attiva la finestra del browser utilizzando il selenio. E l'operazione della catena d'azione del selenio richiede che il brower sia la finestra in alto. In caso contrario, le operazioni della tastiera e del mouse non funzioneranno. – Murthi

+0

Non ho usato azione Action Chain prima, ma altre azioni, come WebDriver.send_keys() funzionano senza problemi, ogni volta che Chrome Window è nascosto. – GensaGames

0

Secondo la Selenium Documentation per key_down, afferma:

deve essere utilizzato solo con tasti modificatori (Controllo , Alt e Shift).

Ho cercato tra i documenti per una soluzione alternativa, ma sembra che il comportamento di "tenere premuto" le chiavi non modificabili non sia possibile nel selenio.

+0

È proprio come avvertimento in Selenium. Calling' key_down 'funziona per altre chiavi, ma solo come fare clic e non tenere (e non so, perché). – GensaGames

+0

@GensaGames A volte (sfortunatamente) la risposta a questo tipo di domande è semplicemente "Non è possibile". Puoi sicuramente richiederlo come nuova funzione o contribuire personalmente alla funzione qui: https://github.com/SeleniumHQ/www.seleniumhq.org/issues –

+0

@GensaGames Puoi descrivere il comportamento che stai tentando di testare? –

2

Il driver corrente per Chrome (versione 2.30) implementa il protocollo precedente in cui tenere premuto un tasto è supportato solo per un tasto modificatore (Controllo, Maiusc, Alt, Comando).

Quindi, questo codice funziona con Firefox, ma fallisce con Chrome visto che l'evento keyUp viene emesso per ogni 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 

Ma, a partire dalla versione 2.30, il driver Chrome supporta la send_command di inviare direttamente un grezzo comando tramite il protocollo devtools. Per risolvere il problema, è possibile chiamare Input.dispatchKeyEvent per emettere eventi di basso livello.

Questo è un esempio di lavoro con selenio/Chrome per tenere premuto il tasto w durante un secondo:

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

Eccellente! Nel frattempo, è OK per me usare Firefox, ma perché queste informazioni mancano da ovunque? E ancora non capisco qual è il problema per Chrome, per supportare questa azione! È così utile per alcune situazioni, come i Canvas Fields, in cui è necessario testare diversi input da tastiera. – GensaGames

+0

Il protocollo è cambiato molto tra Selenium 2 e 3, specialmente per le azioni concatenate. Puoi trovare queste informazioni leggendo la vecchia e la nuova specifica. Non so perché Chrome non sia passato alla nuova API. Potrebbe essere un problema di risorse/budget. –

Problemi correlati