【问题标题】:Override .click() method of webElement in selenium using Python使用 Python 在 selenium 中覆盖 webElement 的 .click() 方法
【发布时间】:2016-04-27 07:19:59
【问题描述】:

我想重写 selenium.webdriver.remote.webelement.WebElement 的 .click() 方法。我也希望每当我执行点击操作时隐式调用被覆盖的 click() 方法,例如,

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

有没有办法做到这一点?

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 你可能想看看 splinter 框架,它为 selenium 放置了一个抽象层,基本上已经做了你想要的splinter.readthedocs.org/en/latest
  • 谢谢。但我需要这个硒驱动程序的解决方案。
  • 您可以查看 splinter 源代码以检查它们的执行方式并进行复制。

标签: python python-2.7 selenium selenium-webdriver


【解决方案1】:

覆盖点击方法:

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()

【讨论】:

  • 工作就像一个魅力,谢谢:)
【解决方案2】:

我认为实际上重写 click() 方法可能会很棘手,并导致不必要的行为。尽管使用EventFiringWebDriver,您可能能够实现您所追求的目标。看下面的例子,

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()

输出上面的脚本,

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

【讨论】:

  • 恕我直言,这是一个更优雅的解决方案。我想知道为什么关于这个主题的文档较少(硒的事件侦听器)。感谢您的有用解释..
猜你喜欢
  • 2018-02-07
  • 1970-01-01
  • 2018-08-18
  • 2019-01-07
  • 2020-07-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多