2016-07-28 90 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命令,我不會看到它是如何工作的。也許如果目標元素已經聚焦。也可能是您選擇的驅動程序以不同方式實施協議。 –