gpt4 book ai didi

Java覆盖现有的类方法

转载 作者:行者123 更新时间:2023-11-30 11:15:38 24 4
gpt4 key购买 nike

我遇到了一个稍微复杂的问题。

情况是我从事一个基于 selenium 的 JUnit 测试自动化的项目。出于这个原因,我编写了一个测试套件和一个抽象测试类(作为几个测试类的基础)。我还尝试构建我的项目,以便必须实现测试用例的程序员只需将它们记录在 selenium IDE 中并导出到 JUnit 测试类。为了达到这个目标,需要进行一些更改,因为抛出的 selenium-java-code 和标准 selenium 包的某些方法和函数有一些小错误......例如 IE 有时不会点击......为了避免这些错误,我覆盖了 FFDriver 和 IEDriver 类,尤其是“findElement”方法。效果很好!

但是现在我遇到了一个新问题。 IE 有时不点击未显示的元素是已知问题。我也有一个解决方法(使用 Javascript 命令而不是 click())。但是当我考虑如何实现时,我想像我通过覆盖驱动程序类解决的问题那样做,我开始覆盖 RemoteWebElement 类。

问题来了。如果我重写 RemoteWebElement 类以重写 click() 方法,我必须在整个项目中使用我的新 RemoteWebElement2_0 类而不是标准类。起初猜测并没有看起来那么糟糕(就像我必须对 Driver 类做同样的事情)。但后来我意识到我的 findElement 方法提供的是 RemoteWebElement 而不是我的 RemoteWebElement2_0。我认为没有机会更改 findElement 方法来传送我的 RemoteWebElement2_0 并且向下转换是不可能的。

我有以下想法来解决这个问题,但不知道如何实现它们,即使它们可以实现:

  • 1.) 直接覆盖原来的 RemoteWebElement 类(应该可行,但如何实现?)
  • 2.) 避免在 findElement 方法中返回普通的 RemoteWebElement
  • 3.) 将 selenium IDE 修改为不使用 click() 方法而是使用 costum 实现
  • 4.) 使用另一种解决方法解决 click() 方法的问题
  • 5.) 向下转型是不可能的!?

谁能帮帮我?我知道这有点奇怪,但请尝试理解我的意思,如果不知道就问!

这是我的代码:

IEDriver 类 -->

import static org.junit.Assert.fail;

import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.RemoteWebElement;

public class InternetExplorerDriver2_0 extends InternetExplorerDriver {

private static InternetExplorerDriver2_0 instance = null;
private long startTime;
private long stopTime;
private By olderBy;

private InternetExplorerDriver2_0() {
super();
}

public static synchronized InternetExplorerDriver2_0 getInstance() {
if (instance == null) {
instance = new InternetExplorerDriver2_0();
}
return instance;
}

@Override
public RemoteWebElement2_0 findElement(By by) {
return elementSearch(by, InternetExplorerDriver2_0.getInstance());
}

private RemoteWebElement2_0 elementSearch(By by,
InternetExplorerDriver driver) {
startTime = System.currentTimeMillis();
RemoteWebElement helpingElement = null;
RemoteWebElement2_0 h2 = null;
isElementPresent(by);
try {

//this not allowed downcast causes problems :(

helpingElement = (RemoteWebElement) super.findElement(by);
h2 = (RemoteWebElement2_0) helpingElement;
} catch (Exception e) {
System.out.println("[error] method 'elementSearch' incomplete" + e.getLocalizedMessage());
fail("Test not successfull!");
} finally {
stopTime = System.currentTimeMillis();
timeWarning(by.toString());
}
olderBy = by;
return h2;
}

private boolean isElementPresent(By by) {
try {
super.findElement(by);
return true;
} catch (NoSuchElementException e1) {
try {
InternetExplorerDriver2_0.getInstance().findElement(olderBy).click();
super.findElement(by);
return true;
} catch (Exception e2) {
stopTime = System.currentTimeMillis();
timeWarning(by.toString());
AllTest.updateLogger("[main] ERROR\tThe following expression could not be solved: " + by);
fail("Test not successfull! --> Error: Element not found. Please check the failed XPath's");
return false;
}
}
}

private void timeWarning(String s) {
if (stopTime - startTime > 500) {
AllTest.updateLogger("[main] WARNING\tHigh response-time detected: " + (stopTime - startTime) + " ms [@element: " + s + "]");
}
}
}

RemoteWebDriver2_0 类 -->

import org.openqa.selenium.By;
import org.openqa.selenium.ElementNotVisibleException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.RemoteWebElement;

public class RemoteWebElement2_0 extends RemoteWebElement {

public RemoteWebElement2_0() {
super();
}

@Override
public void click() {
try {
super.click();
} catch (ElementNotVisibleException e1) {

//Here starts the workaround for the IEDriver.click problem

try {
RemoteWebDriver helpDriver = (RemoteWebDriver) this.getWrappedDriver();
helpDriver.executeScript("arguments[0].click();", this.getWrappedDriver().findElement(By.id("eb_format_12h")));
} catch (Exception e2) {

}
}
}
}

如果您需要更多代码,请索取。

向上感谢!!!

最佳答案

我不是 selenium 方面的专家,但您可以做的是返回原始 RemoteWebElement 的包装器

在你的InternetExplorerDriver2_0覆盖方法中

  @Override
public RemoteWebElement findElement(By by) {
RemoteWebElement originalElement = super.findElement(by);
if (originalElement == null){
return null;
}
return new RemoteWebElementWrapper(originalElement);
}

现在创建包装类,并覆盖父类(super class)中的所有方法,如下例所示

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
}

关于Java覆盖现有的类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25288087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com