我们有什么:
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(...)时,我的类都会创建另一个驱动程序实例并打开新的浏览器。我如何避免这种情况?
最佳答案
可能有不同的方法来做到这一点。但是下面的方法对我来说很好
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/