需要覆盖WebDriver的方法

时间:2017-09-25 21:52:55

标签: python selenium webdriver

我们拥有什么:

driver = WebDriver.Chrome..

def get_driver():
#wrapper for webdriver
    return driver

进一步 - 很多:

get_driver().find_el...
get_driver().implicitly_wait..
许多文件中的

等等

我需要覆盖几个webdriver的函数(例如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(...)我的类创建另一个驱动程序实例并打开一个新的浏览器。我怎么能避免这个?

1 个答案:

答案 0 :(得分:1)

可能有不同的方法。但是下面的方法适合我

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