2016-04-27 7 views
2

Ich möchte die .click() Methode selen.webdriver.remote.webelement.WebElement überschreiben. Auch ich will, dass overrided Click() -Methode implizit aufgerufen werden, wenn ich Klickoperation beispiel ausführen,Überschreiben .click() Methode von WebElement in Selen mit Python

elem = driver.find_element_by_xpath('//some_xpath') 
elem.click() 

Gibt es trotzdem, um dies zu erreichen?

Jede Hilfe wird sehr geschätzt, Danke.

+1

Sie vielleicht einen Blick auf den Splitter Rahmen nehmen wollen, bringt es ein Abstraktionsschicht zu Selen und im Grunde tut das, was Sie wollen https://splinter.readthedocs.org/en/latest/ – sousatg

+0

Danke. Aber ich brauche diese Lösung für Selen-Treiber. –

+0

Sie können den Splitter-Quellcode überprüfen, um zu überprüfen, wie er es macht, und es replizieren. – sousatg

Antwort

4

der Click-Methode außer Kraft zu setzen:

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


# monkey patch the click method : 

def WebElement_click(self): 
    """Clicks the element.""" 
    print("my click") 
    self._execute(Command.CLICK_ELEMENT) 

WebElement.click = WebElement_click 


# usage example : 

driver = webdriver.Chrome() 
driver.get('https://stackoverflow.com') 
driver.find_element_by_id("nav-questions").click() 
+0

Arbeitete wie ein Zauber, Danke :) –

3

Ich denke, tatsächlich die click() Methode überschreiben könnte sich als schwierig erweisen und zu unerwünschtem Verhalten führen. Sie können erreichen, was Sie wollen, obwohl Sie die EventFiringWebDriver verwenden. Das folgende Beispiel zeigt,

from selenium import webdriver 
from selenium.webdriver.support.events import EventFiringWebDriver, AbstractEventListener 

# My custom event listener 
class MyListener(AbstractEventListener): 

    def before_click(self, element, driver): 
     print "Event : before element click()" 

    def after_click(self, element, driver): 
     print "Event : after element click()" 


# Get an event-firing-web-driver instance 
driver = EventFiringWebDriver(webdriver.Firefox(), MyListener()) 

# Visit a site 
driver.get("http://www.google.co.in/") 

# Find an element 
elem = driver.find_element_by_name("q") 

# Click on element 
elem.click() 

# Close browser 
driver.close() 

Script über Ausgänge,

Event : before element click() 
Event : after element click() 
+0

IMHO ist dies eine elegantere Lösung. Ich frage mich, warum es zu diesem Thema weniger Dokumentation gibt (Ereignis-Listener für Selen). Danke für die nützliche Erklärung. –

Verwandte Themen