我正在使用WebDriver
(Selenium
),我希望将自定义方法添加到WebDriver
,例如driver.performCustomAction()
。
因为我可以实例化FirefoxDriver
或ChromeDriver
的实例,所以我不能简单地延长FirefoxDriver
因为我无法使用Chrome驱动程序的功能。
Tech我可以创建一个新类并将WebDriver
的实例传递给构造函数(因此它可能是FF或Chrome)但是我将无法执行每个类的所有非自定义操作例如新对象上的findElements()
,getText()
。
换句话说,如果我的新类被称为WrappedWebDriver,并按照以下方式实例化它的新实例:
WebDriver FFDriver = new FirefoxDriver();
WrappedWebDriver WDriver = new WrappedWebDriver(FFDriver);
我将能够调用WDriver.performCustomAction()
,但我将无法调用WDriver.findElement()
或FirefoxDriver
类中定义的任何其他方法(或我可以执行的操作) FFDriver
)。
如何保留同时适用于FirefoxDriver
和ChromeDriver
的新方法,而不保留两次,同时保留每个相应类的所有功能?
答案 0 :(得分:0)
我认为你可以创建Wrapper类,它将保存Webdriver的实例,你将包装你想要支持的webdriver方法。你可以这样做:
regex = /(.+)\\n([^,]+),\s(\w{2})\s(\d+)/
您可以通过在包装方法中添加一些功能来自定义Webdriver标准方法。通过使驱动程序公开,您可以为用户提供使用标准驱动程序方法或自定义方法选择beetween的选项。
对于名为Conductor的selenium,有一个很好且有用的Wrapper API。 https://github.com/conductor-framework/conductor。在那里,您可以找到更复杂的示例如何包装WebDriver。
答案 1 :(得分:0)
您可能需要扩展EventFiringWebDriver
。这个类的行为本质上是复合的(它是通过引用现有的webdriver实例创建的),它最初被设计用于挖掘所有webdriver发起动作的前/后事件。但它可以很好地满足你的目的。
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.events.EventFiringWebDriver;
public class WrappedDriver extends EventFiringWebDriver {
public WrappedDriver(WebDriver driver) {
super(driver);
}
public void performCustomAction(){
//your customization code
}
}
所以从本质上讲,你首先要构建一个装饰器来实现实际的RemoteWebDriver
子类将实现的所有接口,然后让你的自定义类扩展装饰器。在这种情况下,装饰器类是EventFiringWebDriver