簡體   English   中英

設計用於硒測試的頁面對象結構。 從WebElement繼承導致問題

[英]Designing page object structure for selenium tests. Inheriting from WebElement causing problems

我正在嘗試設計一些頁面對象,但總體設計存在一些問題。

我知道測試中的一個常見問題是弄清楚某個元素是否存在,解決方案是使用try / catch或使用findElements(...)並斷言結果列表的大小是否為0。

我想在所有測試中避免這些嘗試/嘗試。 是否可以使用繼承將try / catch放在超類中,從而使測試更簡潔? 我希望該方法在元素不存在的情況下返回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"));
}

這可以通過將代碼抽象為其他方法來解決您的問題,這意味着您的調用者(即,您實際在哪里找到元素)更加簡潔,簡單,並且無需“了解”所有“列出的內容”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM