2017-09-25 6 views
0

우리는 무엇을 가지고 : 더WebDriver의 메소드를 오버라이드 (override) 할 필요

driver = WebDriver.Chrome.. 

def get_driver(): 
#wrapper for webdriver 
    return driver 

- 많은 : 많은 파일

에서 등

get_driver().find_el... 
get_driver().implicitly_wait.. 

와 내가 webdriver의 기능 몇 가지 (오버라이드 (override) 할 필요가 많은 파일에서 코드를 변경하지 않고 find_elements_by_xpathfind_elements_by_id).

내 접근 방식 : 클래스 대신 get_driver() 클래스를 만들고 드라이버에서 상속 받아 필요한 기능을 재정의하십시오. 그런 뭔가 :

class get_driver(driver): 

    def find_element_by_xpath(self, xpath): 
     return WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath))) 

심지어 작동하는 것처럼 보였다, 그러나 어떤 시간 내 get_driver()를 호출하려고 find_element_by_xpath (...) 나의 클래스는 드라이버의 또 다른 인스턴스를 만들고 새 브라우저를 열고 있습니다.. 어떻게 이것을 피할 수 있습니까?

+0

이 방법들을 재정의하여 달성하고자하는 것은 무엇입니까? –

답변

0

다른 방법이있을 수 있습니다. 하지만 아래의 접근 방식은 저에게 맞습니다.

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

driver = webdriver.Firefox() 


class PatchDriver(): 
    driver = None 

    orignal_method = None 


    def __find_element_by_xpath(self, xpath): 
     return WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath))) 

    @staticmethod 
    def patch(driver): 
     PatchDriver(driver) 
     return driver 

    def __init__(self, driver): 
     self.driver = driver 

     self.orignal_method = driver.find_element_by_xpath 
     driver.find_element_by_xpath = self.__find_element_by_xpath 


driver = PatchDriver.patch(driver) 

driver.get("http://tarunlalwani.com") 

elem = driver.find_element_by_xpath("(//a)[3]") 

elem.click() 

driver.quit()