2014-04-04 10 views
7

Gibt es eine Möglichkeit, die aktuelle Cursorposition oder etwas Ähnliches anzuzeigen? Ich habe eine Aktionskette, die auf den genauen Punkt eines Objekts klicken sollte, aber ich vermute, dass ich falsche Koordinaten aufgegriffen habe. Ich benutze Firefox Webdriver. Hier ist , wie das Skript wie folgt aussieht:Aktuelle Cursorposition in Selen zeigen

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

Es ist eine sehr schlechte Art, es zu tun. Sie werden höchstwahrscheinlich auf Probleme stoßen, sobald Sie dies auf einen anderen Browser/Computer/etc portieren. Es gibt fast immer eine Möglichkeit, eine Client-Aktion ohne Maus zu machen, und selbst wenn es die einzige Möglichkeit ist, sollte es immer noch einen geben Möglichkeit, dies ohne die Cursorposition zu tun. Wenn dies der einzige Weg wäre, könnten Sie nur auf das Element klicken, wenn das Browserfenster auf eine bestimmte Größe eingestellt ist. Wenn Sie die URL der Website angeben, auf die Sie zugreifen möchten, kann ich möglicherweise einen besseren Weg finden, um das zu erreichen, was Sie versuchen ... –

+0

@barakmanos Vielen Dank für Ihren Kommentar. Leider gibt es keine andere Möglichkeit, mit diesem Objekt auf der Seite zu arbeiten. Nehmen wir zum Beispiel an, ich möchte das Video starten und die Auflösung unter http://www.jwplayer.com/ ändern, ohne die API zu verwenden. –

+0

Ich stimme Barak Manos zu, dass Sie im Allgemeinen nicht wollen, aber ich sehe, dass Sie versuchen, in einen Flash-Player zu klicken. Ich kenne keine Lösung, die funktioniert, indem * nur * der Browser (wie Selenium) gesteuert wird, der nicht von der Verwendung von Koordinaten abhängt, um diesen Test durchzuführen. Aber vielleicht gibt es Testlösungen für Flash, die Flash-Elemente wie Selenium finden könnten, um DOM-Elemente zu finden? – Louis

Antwort

0

Ich habe keine möglichen Methoden finden Sie in der Auflösung direkt zum Ändern, da wir keine Locator für diese verwenden können.

Für Ihr Beispiel von JWPlayer, ich bin sicher, dass es einige Javascript-Schnipsel geben könnte, die es erlauben, die Auflösung zu ändern. Mit dem Selenium JavascriptExecutor können Sie diesen Java-Code ausführen, um die Änderung der Auflösung zu simulieren. Allerdings nicht durch Klicken auf den Cursor.

WebDriver driver = new ChromeDriver(); 

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

Ich bemerkte, dass Sie erwähnt haben, dass Sie keine native JWPlayer API verwenden möchten. Ich sehe dies als die einzig mögliche Lösung.

0

Es war ein wenig schwierig für mich als Selen-Neuling zu verstehen, dass es einfach keine Klicks auf Flash-Objekte generieren kann. Die einzige mögliche Lösung, die ich hier sehe, ist die Verwendung von sikuli-script.

Ich habe das Projekt auf GitHub gefunden: https://github.com/kevlened/sikuli_cpython. Es erlaubt die Verwendung von Sikuli-Skripten (geschrieben in Jython) in reinem Python, so dass ich in der Lage sein werde, einige Sikuli-Skripte zu schreiben und sie in Selentests zu integrieren.

-2

Sie können Ihre Position mit nächster Methode finden:

WebDriver.get_window_position() 
+0

Leider gibt dies die Fensterposition und nicht die Cursorposition zurück. – kiminoa

4

ich einen undurchsichtigen HTML5-Canvas, wo ich hatte Werte von Tooltips bei verschiedenen Offsets zu überprüfen, und welche Schwierigkeiten! Nach vielen meinen Kopf hämmern, lernte ich einige wichtige Dinge:

  1. move_to_element_by_offset Probleme vor 2.42 hat. Siehe auch https://code.google.com/p/selenium/issues/detail?id=4215

  2. Auch nach einem Update scheint move_to_element_by_offset noch persnickety. Ich wechselte zu einer Kombination des ActionChains move_to_element Hover (standardmäßig auf die Mitte des Elements) und eine zweiten ActionChains mit move_by_offset

  3. Nun, da Sie in der Lage, re-Anfrage der positionsempfindlichen Elementen sind. In meinem Fall ist das ein Tooltip-Objekt. Diese selenium.webdriver.remote.element wird die .location['x'] und .location['y'] Mitglieder haben, die Sie benötigen, um Ihre Position zu überprüfen. in move_to_element

    • .location['x'] und .location['y'] auf dem Element, das Sie passieren:

Dinge, die d, alle zu retten einige Zeit ActionChain schweben‘nach einer perform zum Greifen Cursorposition nicht funktionieren. Diese Werte werden von ActionChains nicht aktualisiert.

  • selenium.webdriver.remote.webdriverswitch_to_active_element; Ich bin nicht klar, welche Elemente als "aktiv" gelten, aber unsere Tooltips werden nicht als aktive Elemente anerkannt und gaben mir [0, 0] Koordinaten zurück.
  • selenium.webdriver.remote.webdriverget_window_position; Die Dokumentation war ein wenig vage, aber das ist genau das, was die Funktion vorschlägt: ein Fenster statt einer Cursorposition.
  • Verwandte Themen