2013-06-19 30 views
1

我在互聯網上搜索了一下,但認爲我可能通過在stackoverflow上發佈並查看是否有任何意見可以得到一些見解。頁面對象 - 方法的抽象級別

我想知道如果任何人有這是首選設置頁面對象的這兩種方式之間的意見:

public class LoginPage extends PageObject{ 
    public void typeEmail(String email){ 
     driver.findElement(EMAIL_SELECTOR).sendKeys(email); 
    } 

    public void typePassword(String pw){ 
     driver.findElement(PASSWORD_SELECTOR).sendKeys(email); 
    } 

    public void submit(){ 
     driver.findElement(SUBMIT_SELECTOR).click(); 
    } 
} 

......還有......

public class LoginPage extends PageObjects{ 
    public void login(String email, String password){ 
     driver.findElement(EMAIL_SELECTOR).sendKeys(email); 
     driver.findElement(PASSWORD_SELECTOR).sendKeys(email); 
     driver.findElement(SUBMIT_SELECTOR).click(); 
    } 
} 

本來,我認爲第二種方式會更好,因爲如果登錄流程由於某種原因而改變(這對於登錄來說不太可能,但是您可以通過其他類型的表單來理論化),那麼您可以更新login()方法和此更改會影響所有需要登錄的測試。

但是,如果您想要在submit()之前驗證錯誤條件或更多事情,則第二種解決方案不夠靈活。

任何見解都會受到歡迎。

+0

第二種解決方案是更多的「頁面對象」。這個想法是他們應該代表你的頁面可以做的**服務。正如在,'登錄'是它可以做的首要服務/動作,在它下面必須輸入用戶名和密碼,然後單擊確定。但是,暴露給公衆來電者只是「登錄」方法。他們不知道「如何登錄」。究竟是什麼不靈活呢? – Arran

+0

另外,後一種方法是頁面對象模式的設計者所期望的。根據他的定義,前一種方法不是頁面對象。 – JimEvans

+0

那麼您怎麼能讓這個方法足夠靈活以便在您提交之前驗證事物?例如,假設你填寫了一個表單,然後你得到了一個預覽,並且你希望能夠驗證該預覽中的不同項目?你不會希望每一個測試都做到這一點,但只是在特定的測試中。 –

回答

1

頁面對象定義:「PageObject不需要代表整個頁面,它可能代表在站點或頁面內多次出現的部分,如站點導航。」

一個PageObject的關鍵點:

- The public methods represent the services that the page offers 
- Try not to expose the internals of the page 
- Generally don't make assertions 
- Methods return other PageObjects 
- Need not represent an entire page 
- Different results for the same action are modelled as different methods 

SOURCE

你兩個設置不PageObject但有一些相似之處。

+0

你是什麼意思,「你的兩個設置不是PageObject,但有一些相似之處。」? –

0

我個人更喜歡使用像抽象的另一個層面:

public void typeEmail(String email){ 
     fillField(EMAIL_SELECTOR, email); 
    } 

和實施在SeleniumWrapper類

public void fillField(WebElement selector, String text){ 
     driver.findElement(selector).sendKeys(text); 
    } 

這使得代碼更好看

這與PageObjects沒有直接關係,但如果您不使用BDD或者ke,仍然可以通過這種方法來優化您的代碼yword驅動的方法