页面对象 - 方法的抽象级别

时间:2013-06-19 16:35:44

标签: webdriver selenium-webdriver pageobjects

我在互联网上搜索了一下但是我想通过在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();
   }
}

最初,我认为第二种方式会更好,因为如果登录流程由于某种原因而改变(这不太可能是登录,但你可以理解为其他类型的表格发生这种情况),你可以更新登录()方法和此更改将影响所有需要登录的测试。

但是,如果要在submit()之前验证错误条件或更多内容,则第二种解决方案不够灵活。

欢迎任何见解。

2 个答案:

答案 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,但有一些相似之处。

答案 1 :(得分: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或关键字驱动的方法,这仍然是一种美化代码的方法