Java重写现有的类方法
我有一个稍微复杂的问题 目前的情况是,我正在从事一个基于selenium的JUnit的自动化项目。为此,我编写了一个testsuite和一个abstractTestclass(作为几个TestClass的基础)。我还尝试构建我的项目,以便必须实现测试用例的程序员只需将它们记录在selenium IDE中并导出到JUnit测试类。为了达到这个目标,需要进行一些更改,因为抛出的selenium java代码和标准selenium包的一些方法和函数有一些小错误。。。就像IE有时不点击一样。。。 为了避免这些错误,我重写了FFDriver和IEDriver类,尤其是“findElement”方法。那很好 但现在我遇到了一个新问题。这是已知的问题,IE有时不点击非显示元素。我还有一个变通方法(使用Javascript命令而不是click()。但是,当我考虑如何实现时,我想这样做,就像我通过重写驱动程序类解决的问题一样,我开始重写RemoteWebElement类 问题来了。如果我重写RemoteWebElement类以重写click()方法,我必须在整个项目中使用新的RemoteWebElement2_0类,而不是标准类。乍一看,这并不像看上去的那么糟糕(就像我必须对驱动程序类做同样的事情一样)。但后来我意识到我的findElement方法提供的是RemoteWebElement,而不是RemoteWebElement2\u 0。我认为没有机会更改findElement方法来交付我的RemoteWebElement2_0,并且不可能进行向下广播 我有以下解决此问题的想法,但不知道如何实施,甚至不知道是否可以实施:Java重写现有的类方法,java,internet-explorer,selenium,junit,Java,Internet Explorer,Selenium,Junit,我有一个稍微复杂的问题 目前的情况是,我正在从事一个基于selenium的JUnit的自动化项目。为此,我编写了一个testsuite和一个abstractTestclass(作为几个TestClass的基础)。我还尝试构建我的项目,以便必须实现测试用例的程序员只需将它们记录在selenium IDE中并导出到JUnit测试类。为了达到这个目标,需要进行一些更改,因为抛出的selenium java代码和标准selenium包的一些方法和函数有一些小错误。。。就像IE有时不点击一样。。。 为了避
- 1.)直接重写原始的RemoteWebElement类(应该可以,但如何实现?)
- 2.)避免在findElement方法中返回正常的RemoteWebElement
- 3.)将selenium IDE修改为不使用click()方法,而是使用costum实现
- 4.)使用另一种解决方法使用click()方法解决问题
- 5.)不可能向下投射李>
向上谢谢 我不是selenium方面的专家,但您可以做的是返回原始
RemoteWebElement的包装器
在您的InternetExplorerDriver2\u 0
覆盖方法中
@Override
public RemoteWebElement findElement(By by) {
RemoteWebElement originalElement = super.findElement(by);
if (originalElement == null){
return null;
}
return new RemoteWebElementWrapper(originalElement);
}
现在创建包装类,并覆盖来自超类的所有方法,如下面的示例所示
public class RemoteWebElementWrapper extends RemoteWebElement {
private final RemoteWebElement instance;
public RemoteWebElementWrapper(RemoteWebElement instance) {
super();
this.instance = instance;
}
@Override
List<WebElement> findElementsByLinkText(String using){
return instance.findElementsByLinkText(using)
}
@Override
List<WebElement> findElementsByName(String using){
instance.findElementsByName(using)
}
@Override
List<WebElement> findElementsByPartialLinkText(String using){
instance.findElementsByPartialLinkText(using)
}
//etc
}
公共类RemoteWebElementWrapper扩展了RemoteWebElement{
私有最终RemoteWebElement实例;
公共RemoteWebElementWrapper(RemoteWebElement实例){
超级();
this.instance=instance;
}
@凌驾
列出findElementsByLinkText(使用字符串){
return instance.findElementsByLinkText(使用)
}
@凌驾
列出findElementsByName(使用字符串){
instance.findElementsByName(使用)
}
@凌驾
列出findElementsByPartialLinkText(使用字符串){
instance.findElementsByPartialLinkText(使用)
}
//等
}
make yourRemoteWebElement 2\u 0
保存原始RemoteWebElement
对象的实例,并委托所有方法(除了单击要覆盖的方法)很抱歉,我听不懂您的意思,您的意思是什么?多亏了您,这个解决方案对我很有效。这有点复杂,但它可以工作!:)
@Override
public RemoteWebElement findElement(By by) {
RemoteWebElement originalElement = super.findElement(by);
if (originalElement == null){
return null;
}
return new RemoteWebElementWrapper(originalElement);
}
public class RemoteWebElementWrapper extends RemoteWebElement {
private final RemoteWebElement instance;
public RemoteWebElementWrapper(RemoteWebElement instance) {
super();
this.instance = instance;
}
@Override
List<WebElement> findElementsByLinkText(String using){
return instance.findElementsByLinkText(using)
}
@Override
List<WebElement> findElementsByName(String using){
instance.findElementsByName(using)
}
@Override
List<WebElement> findElementsByPartialLinkText(String using){
instance.findElementsByPartialLinkText(using)
}
//etc
}