2016-07-28 13 views
2

Während Selenium WebDriver zum Testen einer Website verwendet wird, möchte ich auf ein WebElement-Objekt doppelklicken können, ohne Klassenvererbung oder Chaos mit ActionChains verwenden zu müssen. Im Idealfall sollte es im Formular webelement.double_click() genauso wie click() verfügbar sein. Dies kann durch Bearbeiten der WebElement.py Datei durchgeführt werden und das einfache Hinzufügen der folgenden auf die WebElement Klasse:Hinzufügen von Funktionen zu Selenium WebDriver WebElements mit Python

def double_click(self): 
    self._execute(Command.DOUBLE_CLICK) 

Einfach genug. Ich aktualisiere diese Bibliothek jedoch ständig und dies kann überschrieben werden. In diesem Sinne versuche ich, eine einfache Möglichkeit zu finden, diese Funktion dem WebElement-Objekt aus der Datei hinzuzufügen, mit der ich arbeite. Ich habe den Import WebElement versucht und die Definition der Funktion wie folgt:

from selenium import webdriver 
from selenium.webdriver.remote.command import Command 
from selenium.webdriver.remote.webelement import WebElement 

def double_click(self): 
    self.execute(Command.DOUBLE_CLICK) 

WebElement.double_click = double_click 

Dann, wenn ich den Browser (webdriver.Firefox()) laufen, double_click für jedes Element definiert ist, aber es funktioniert nicht richtig. Stattdessen wirft es

WebDriverException: Message: [JavaScript Error: "Argument to isShown must be of type Element" ... 

Der gleiche Fehler tritt auf, wenn ich die click() Funktion in der gleichen Weise neu definiere. Ich habe bestätigt, dass die Elemente, auf die ich zu klicken versuche, selen.webdriver.remote.webelement.WebElement sind, aber es scheint, dass die Drähte irgendwo durchquert werden, und ich bin nicht sicher, wie.

Um klar zu sein, weiß ich, dass es Problemumgehungen dafür gibt. Das Problem ist nicht, dass ich nicht doppelklicken kann - ich möchte nur wissen, ob das möglich ist, ähnlich wie ich es versuche.

Antwort

0

Um Affen auf der WebElement Klasse die Doppelklick Methode Patch:

def WebElement_double_click(self): 
    self._parent.execute(Command.MOVE_TO, {'element': self._id}) 
    self._parent.execute(Command.DOUBLE_CLICK) 
    return self 

WebElement.double_click = WebElement_double_click 
+0

Dies funktioniert. Ich habe ein bisschen herumgespielt, um etwas zu experimentieren ... Soweit ich das beurteilen kann, ist das Aufrufen von _parent.execute dasselbe wie das Aufrufen von _execute, da die Funktion _execute in webelement.py sowieso self._parent.execute zurückgibt. Es scheint der Schlüssel ist das MOVE_TO. Was macht die Funktion erforderlich, obwohl sie ohne sie funktioniert, wenn Sie es in die Webelement-Datei patchen? –

+0

Der Befehl 'DOUBLE_CLICK' nimmt kein Argument (https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#essionsessioniddoubleclick). Daher ist es besser, 'execute' auf' WebDriver' zu setzen, da 'WebElement' den Parameter'id' hinzufügt, der nicht benötigt wird, und' MOVE_TO' den 'Element'-Schlüssel und nicht'id' benötigt. Ich sehe nicht, wie es ohne den Befehl 'MOVE_TO' funktionieren könnte. Vielleicht, wenn das Zielelement bereits fokussiert ist. Es kann auch sein, dass der ausgewählte Treiber das Protokoll anders implementiert. –

Verwandte Themen