2014-04-04 18 views
7

C'è un modo per mostrare la posizione corrente del cursore o qualcosa del genere? Ho una catena d'azione che dovrebbe fare clic sul punto esatto su qualche oggetto, ma suppongo di aver individuato coordinate sbagliate. Io uso il webdriver di Firefox. Ecco come lo script appare come:Mostra la posizione corrente del cursore nel selenio

from selenium import webdriver 
import time 
from selenium.webdriver.common.action_chains import ActionChains 

driver = webdriver.Firefox() 
driver.get("http://www.mysite/") 
elem = driver.find_element_by_xpath('//div[@id="player"][1]/object[@type="application/x-shockwave-flash"]') 
action_chains = ActionChains(driver) 
action_chains.move_to_element_with_offset(elem, 660, 420).perform() 
action_chains.click().perform() 
time.sleep(10) 
driver.close() 
+1

È un pessimo modo di farlo. Molto probabilmente ti imbatterai in problemi non appena lo porti su un altro browser/computer/ecc. C'è quasi sempre un modo per fare un'azione client senza usare il mouse, e anche se è l'unico modo, dovrebbe esserci ancora un modo di farlo senza usare la posizione del cursore. Se quello era l'unico modo, allora si sarebbe in grado di fare clic sull'elemento solo quando la finestra del browser era impostata su una dimensione specifica. Se fornisci l'URL del sito Web a cui stai tentando di accedere, potrei essere in grado di trovare un modo migliore per ottenere ciò che stai cercando ... –

+0

@barakmanos Grazie per il tuo commento. Sfortunatamente, non c'è altro modo per me di lavorare con quell'oggetto a pagina. Ad esempio, diciamo che mi piacerebbe iniziare il video e cambiare la sua risoluzione su http://www.jwplayer.com/ ma senza usare la sua API. –

+0

Sono d'accordo con il manama di barak che nel caso generale non si vuole farlo, ma vedo che stai provando a fare clic su un flash player. Non conosco alcuna soluzione che funzioni controllando * solo * il browser (come fa Selenium) che non dipenderà dall'uso delle coordinate per eseguire questo test. Tuttavia, forse ci sono soluzioni di test progettate per il flash che sarebbero in grado di trovare elementi flash come Selenium è in grado di trovare elementi DOM? – Louis

risposta

0

non vedo alcun metodi possibili per la modifica direttamente la risoluzione in quanto non possiamo usare qualsiasi localizzatore per questo.

Per il tuo esempio di JWPlayer, sono sicuro che potrebbe esserci dello snippet di javascript che permetterà di cambiare la risoluzione. Usando il Selenium JavascriptExecutor è possibile eseguire quel codice javacript per simulare la modifica della risoluzione .. anche se non facendo clic sul cursore.

WebDriver driver = new ChromeDriver(); 

if (driver instanceof JavascriptExecutor) { 
    ((JavascriptExecutor) driver).executeScript(YOUR_JAVA_SCRIPT_STRING); 
} 

Ho notato che hai menzionato che non vuoi utilizzare alcuna API JWPlayer nativa. La vedo come l'unica soluzione possibile.

0

È stato un po 'difficile per me, come novizio del selenio, capire che non è possibile generare clic sugli oggetti flash. L'unica soluzione possibile che vedo qui è utilizzare sikuli-script.

Ho trovato il progetto su GitHub: https://github.com/kevlened/sikuli_cpython. Permette di usare gli script sikuli (scritti in jython) in puro python quindi credo che sarò in grado di scrivere degli script sikuli e integrarli con i test del selenio.

-2

È possibile trovare la posizione utilizzando il metodo seguente:

WebDriver.get_window_position() 
+0

Sfortunatamente, questo restituisce la posizione della finestra e non la posizione del cursore. – kiminoa

4

ho avuto una tela HTML5 opaca in cui ho dovuto controllare i valori di tooltip a vari offset, e che guai! Dopo un sacco di sbattere la testa, ho imparato molte cose importanti:

  1. move_to_element_by_offset ha problemi prima di 2.42. Vedi anche https://code.google.com/p/selenium/issues/detail?id=4215

  2. Anche dopo un aggiornamento, move_to_element_by_offset sembra ancora perspicace. Sono passato a una combinazione del ActionChains move_to_element hover (il default è il centro dell'elemento) e un secondo ActionChains con move_by_offset

  3. Ora che sei in posizione, nuovamente richiesta l'elemento sensibile alla posizione. Nel mio caso, questo è un oggetto tooltip. Questo selenium.webdriver.remote.element avrà i membri .location['x'] e .location['y'] necessari per verificare la propria posizione.

cose che non funzionano per afferrare posizione del cursore dopo un perform 'D ActionChain librarsi, per salvare tutti un po' di tempo:

  • .location['x'] e .location['y'] sull'elemento si passa in move_to_element. Questi valori non vengono aggiornati da ActionChains.
  • selenium.webdriver.remote.webdriverswitch_to_active_element; Non sono chiaro quali elementi si qualificano come "attivi", ma non riconosce i nostri tooltip come elementi attivi e mi ha restituito le coordinate [0, 0].
  • selenium.webdriver.remote.webdriverget_window_position; la documentazione era un po 'vaga, ma questo fa proprio quello che suggerisce la funzione: una finestra piuttosto che una posizione del cursore.