我们拥有什么:
driver = WebDriver.Chrome..
def get_driver():
#wrapper for webdriver
return driver
进一步 - 很多:
get_driver().find_el...
get_driver().implicitly_wait..
许多文件中的等等
我需要覆盖几个webdriver的函数(例如find_elements_by_xpath
和find_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 :(得分: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()