2016-07-28 5 views
2

Selenium WebDriver를 사용하여 웹 사이트를 테스트하는 동안 클래스 상속을 사용하거나 ActionChains를 사용하지 않고도 WebElement 객체를 두 번 클릭 할 수 있습니다. 이상적으로 click()과 마찬가지로 webelement.double_click() 양식에서 액세스 할 수 있어야합니다. 이것은 WebElement.py 파일을 편집하고 간단하여 WebElement 클래스에 다음을 추가하여 수행 할 수 있습니다 : 간단한Python을 사용하여 Selenium WebDriver WebElements에 기능 추가

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

을 충분히. 그러나이 라이브러리는 항상 업데이트되며 덮어 쓰기가 쉽습니다. 이를 염두에두고 작업중인 파일의 WebElement 객체에이 기능을 추가하는 간단한 방법을 알아 내려고 노력하고 있습니다. 나는 (webdriver.Firefox())가, DOUBLE_CLICK은 각 요소에 대해 정의 된 브라우저를 실행할 때 다음

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 

를하지만 제대로 작동하지 않습니다 : 나는 WebElement을 가져오고과 같이 함수를 정의 노력했다. 대신, 그것은 발생합니다.

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'는'id'가 아닌'element' 키를 필요로하기 때문입니다. 나는 그것이 MOVE_TO 명령없이 어떻게 작동 하는지를 보지 못했다. 타겟 요소가 이미 집중된 것일 수 있습니다. 선택한 드라이버가 프로토콜을 다르게 구현할 수도 있습니다. –

관련 문제