2016-02-03 3 views
1

Я начинаю внедрять шаблон дизайна PageFactory на Selenium .NET. У меня есть класс объектов страницы, называемый примером «ButtonControl», который я хочу рассматривать как IWebElement.PageFactory pattern - extend IWebElement C#

По умолчанию это выглядит следующим образом:

[FindsBy(How = How.CssSelector, Using = "someSelector")] 
public IWebElement button1; 

То, что я действительно хочу это:

// in the page object: 
[FindsBy(How = How.CssSelector, Using = "someSelector")] 
public ButtonControl button1; 

// in test code: 
page.button1.Click(); 

Так что мне нужно это ... Я не знаю. Может быть, custom Factory, который создаст объекты этой страницы?

Любые идеи?

+0

Возможно, вы неправильно поняли использование шаблона PageFactory. Зачем вам нужно реализовывать такие странные вещи? –

ответ

0

Page object model должен содержать только карту элементов пользовательского интерфейса, не более того. Во многих статьях вы увидите рекомендации по размещению методов, которые взаимодействуют со страницей, но это неправильно.

/** 
* Page Object encapsulates the Sign-in page. 
*/ 
public class LoginPage{ 

     private final WebDriver driver; 

    public LoginPage(WebDriver driver) { 
    this.driver = driver; 

    // Check that we're on the right page. 
    if (!"Login".equals(driver.getTitle())) { 
     // Alternatively, we could navigate to the login page, perhaps logging out first 
     throw new IllegalStateException("This is not the login page"); 
    } 
    } 

     // The login page contains several HTML elements that will be represented as WebElements. 
     // The locators for these elements should only be defined once. 
     By usernameLocator = By.id("username"); 
     By passwordLocator = By.id("passwd"); 
     By loginButtonLocator = By.id("login"); 

     /** 
     * Login as valid user 
     * 
     * @param userName 
     * @param password 
     * @return HomePage object 
     */ 
     public LoginPage loginValidUser(String userName, String password) { 

       driver.findElement(usernameLocator).sendKeys(userName); 
       driver.findElement(usernameLocator).sendKeys(password); 
       driver.findElement(loginButtonLocator).click(); 

       return new HomePage(selenium); 
     } 
} 

Это нарушает SRP, в приведенном выше примере, у вас есть две причины для изменения - если локатор изменяется, и если поток изменяется. ИМХО в большинстве случаев является предметом компромисса между интеллектуальными тестами и объектами интеллектуальной страницы. Но вы можете реализовать свой класс Action, который позаботится о взаимодействии со страницей.

Смежные вопросы