2016-07-28 87 views
2

使用Selenium WebDriver测试网站时,我希望能够双击WebElement对象,而不必使用类继承或混淆ActionChains。理想情况下,它应该可以在webelement.double_click()表单中访问,就像click()一样。这可以通过编辑WebElement.py文件,只需添加以下到WebElement类完成:使用Python将功能添加到Selenium WebDriver WebElements使用Python

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

够简单。但是,我一直更新这个库,这可能会被覆盖。考虑到这一点,我试图找出一个简单的方法,从我正在使用的文件中将此功能添加到WebElement对象。我试图导入WebElement并限定像这样的功能:

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 

然后,当我运行(webdriver.Firefox()),DOUBLE_CLICK为每个元素定义的浏览器,但它不正常工作。相反,它会增加

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

当我以同样的方式重新定义click()函数时发生同样的错误。我确认了我尝试点击的元素是类“selenium.webdriver.remote.webelement.WebElement”,但它看起来电线正在越过某处,而我不知道如何。

要清楚,我知道有这方面的解决方法。问题不在于我无法双击 - 我只是想知道这是否可能与我尝试的方式类似。

回答

0

猴子打补丁的WebElement类的双击方法:

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

这工作。我搞砸了一下实验......据我所知,调用_parent.execute与调用_execute相同,因为webelement.py中的_execute函数返回self._parent.execute。看起来关键是MOVE_TO。它是什么让这个功能需要这个功能,即使它在没有它的情况下工作正常,如果你将它修补到webelement文件中? –

+0

命令'DOUBLE_CLICK'不带任何参数(https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessioniddoubleclick)。所以最好在WebDriver上调用'execute',因为WebElement会添加不需要的id参数,MOVE_TO需要'element'键而不是'id'。如果没有MOVE_TO命令,我不会看到它是如何工作的。也许如果目标元素已经聚焦。也可能是您选择的驱动程序以不同方式实施协议。 –