gpt4 book ai didi

java - 为 Selenium 测试设计页面对象结构。从 WebElement 继承导致问题

转载 作者:行者123 更新时间:2023-11-30 03:48:34 26 4
gpt4 key购买 nike

我正在尝试设计一些页面对象,但总体设计存在一些问题。

我知道测试中的一个常见问题是确定元素是否存在,解决方案是使用 try/catch 或使用 findElements(...) 并断言结果列表的大小是否为 0。

我想在所有测试中避免这些尝试/捕获。是否可以使用继承将 try/catch 放在父类(super class)中,使测试更清晰?我希望该方法在元素不存在时返回 null,然后我可以在测试中使用 assertNotNull(...) 。

这是我当前解决方案中页面对象的方法:

public WebElement getRegisterLink(){
List<WebElement> list = driver.findElements(By.linktext("Register"));
if(list.size() == 0){
return null;
}
return list.get(0);
}

这样做的问题是有很多类似的重复代码。我的 getLoginButton()、getSomePageLink() 等看起来是一样的。

这是我的一个想法......

public abstract class MyCompanyElement implements WebElement{

WebElement element;

public MyCompanyElement(WebElement element){
this.element = element;
}

@Override
public void clear() {
element.clear();
}

@Override
public void click() {
element.click();
}

@Override
public MyCompanyElement findElement(By arg0) {
try{
MyCompanyElement e = (MyCompanyElement) element.findElement(arg0);
return e;
} catch (NoSuchElementException ex){
return null;
}

}

@Override
public List<MyCompanyElement> findElements(By arg0) {
List<MyCompanyElement> list = new ArrayList<MyCompanyElement>();
for(WebElement e : element.findElements(arg0)){
list.add((MyCompanyElement) e);
}
return list;
}

//Rest of the methods here which just call the methods of element
}

然后我有一个 BasePage 类,所有页面对象都将扩展该类。

public abstract class BasePage {

MyCompanyElement element;

public BasePage(WebDriver driver){
element = (MyCompanyElement) driver.findElement(By.tagName("html"));
}

//More methods here

}

页面对象具有 getLoginButton()、getRegisterLink() 等方法,这些方法返回 MyCompanyElement 而不是 WebElement。 (基本页​​包含所有网页上都存在的元素,例如页眉和页脚)。

我的测试可能如下所示:

Homepage homepage = new Homepage(driver);
homepage.getLoginButton().click();

如果我想检查一个元素是否存在,那么...

assertNotNull(homepage.getRegisterLink());

上述解决方案存在的问题是:

  • 在 MyCompanyElement 中,findElement() 可以返回 MyCompanyElement。但编译器不喜欢我在 findElements() 中返回 MyCompanyElement 的列表。有解决办法吗?
  • 还有其他可以解决问题的想法吗?

谢谢

最佳答案

我想说你有点过分了。您无需创建自己的 WebElement 版本。

你应该做的是,将一个方法放入接受给定By的基类中,例如:

public WebElement getFirstMatchingElement(By by)
{
List<WebElement> list = driver.findElements(by);
if(list.size() == 0) {
return null;
}
return list.get(0);
}

它足够通用,可以像这样调用它......

public WebElement getRegisterLink() {
return getFirstMatchingElement(By.linktext("Register"));
}

就像...

public WebElement getLoginButton() {
return getFirstMatchingElement(By.id("loginButton"));
}

这通过将代码抽象到其他方法中来解决您的问题,这意味着您的调用者(即您实际找到元素的位置)更加干净、简单,并且不需要“了解”所有“列出东西”。

关于java - 为 Selenium 测试设计页面对象结构。从 WebElement 继承导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24969514/

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