我们有什么:

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(...)时,我的类都会创建另一个驱动程序实例并打开新的浏览器。我如何避免这种情况?

最佳答案

可能有不同的方法来做到这一点。但是下面的方法对我来说很好

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

关于python - 需要重写WebDriver的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46414752/

10-14 00:02