2014-01-20 2 views
2

За последний год я создал очень приятную среду WebDriver для своей группы. Довольно стандартная плата за проезд: классы страниц обычно инкапсулируют полную функциональность страницы на нашей платформе (элементы управления как объекты, методы по мере необходимости). & расширяет базовый класс с помощью некоторых глобальных методов, вызывается несколько страниц в тестовых классах JUnit, типичных методах утверждения , яда-яда. Ничего экстравагантного - очень по книгам, но очень функциональный и гибкий.WebDriver PageObjects & Large Количество локаторов

В последнее время, однако, меня попросили использовать фреймворк для автоматизации большого количества страниц с формами, которые могут содержать 100 или более входов, выбрать, параметры и т. Д. Это вызывает у меня серьезное потрясение. Кроме того, идентификаторы многих пользовательских форм управления изменяются от среды к среде (к счастью, они остаются статическими для каждой среды после начальных нажатий). Так или иначе ...

Давайте рассмотрим типичную структуру PageObject, что я использую каждый день:

/** Constructor*/ 
public someConstructor(WebDriver driver){ 
    super(driver, pageTitle); 
} 

/**Locators*/ 
By searchBoxLocator = By.id("phSearchInput"); 
By searchBoxClearLocator = By.id("phSearchClearButton"); 
By searchButtonLocator = By.cssSelector("input[value='Search']"); 


/**Some Methods*/ 
public void selectFromTabBar(String tabName){ 
    driver.findElement(By.linkText(tabName)).click(); 
} 

public static void enterInputValue(WebDriver driver, By by, String val){ 

    List<WebElement> elements = null; 
    elements = driver.findElements(by); 

    if(!elements.isEmpty()){ 
    driver.findElement(by)).sendKeys(val);  
    }else{ 
    throw new NoSuchElementException("Message"); 
    } 
} 

Как я уже говорил, ничего экзотического здесь, но теперь мой вопрос к каждому. Возьмите ситуацию, когда у меня не будет традиционного 5-15 байтов на объект PageObject, но вам потребуется более 100 на 10 страниц. Бросьте на усложнение, что они также будут иметь уникальные значения для среды, которая полностью из всех рук и не может быть согласована. Итак, каков подходящий подход здесь ... Я укушу пулю и жесткий код 100 «На странице, я делаю экстернализацию всех файлов By, скажем, Excel, и тянуть все через via, I duno, JXL или что угодно, или я знаю, что это будет статическим и бросить все во внешний файл?

В конце дня я знаю, что нет правильного ответа, но мне просто любопытно, как другие подходят к этому. Прямо сейчас я вытеснил By's для страниц с таким количеством элементов формы и определял элементы управления, которые еще не изменяются внутри объекта PageObject, но он чувствует себя неуклюжим. Возможно, я стремлюсь к слишком высокой элегантности, но любые мысли будут действительно фантастическими.

ответ

3

Это, прежде всего, основанный на мнениях, но интересный вопрос.

Мое предложение будет модульной вашей страницы.

Например, у вас есть страница со 100 локаторами, но, безусловно, они не могут быть похожими на 100 похожих текстовых полей, чтобы пользователи могли их заполнить. (Если это так, вероятно, решение здесь состоит в том, чтобы перепроектировать ваш пользовательский интерфейс)

Если эти 100 элементов принадлежат к разным компонентам, скажем, 20 элементов в верхней панели инструментов, 20 элементов в виде списка, 20 элементов в форме и 20 в нижней панели инструментов. Затем вы можете создать разные классы для каждого из компонентов.

Например, обычный объект страницы.

public class FooPage { 

    private IWebDriver driver; 

    public FooPage(IWebDriver driver) { 
     this.driver = driver; 
    } 

    public IWebElement Element1 { 
     get { return driver.FindElement(By.CssSelector(".something1")); } 
    } 

    // ... 
    public IWebElement Element100 { 
     get { return driver.FindElement(By.CssSelector(".something100")); } 
    } 

    public void AddItem(){ 
    } 

    public void ClearList(){ 
    } 
} 

Вы могли бы разделить эти элементы в различные компоненты, например, FooPageTopToolbar, FooPageList и т.д.

public class FooPageTopToolbar { 

    private IWebDriver driver; 

    public FooPageTopToolbar(IWebDriver driver) { 
     this.driver = driver; 
    } 

    // ... 
    public IWebElement ToolbarElement10 { 
     get { return driver.FindElement(By.CssSelector(".something100")); } 
    } 

    public void AddItem(){ 
    } 
} 

public class FooPageList { 

    private IWebDriver driver; 

    public FooPageList(IWebDriver driver) { 
     this.driver = driver; 
    } 

    // ... 
    public IWebElement ListElement10 { 
     get { return driver.FindElement(By.CssSelector(".something100")); } 
    } 

    public void ClearList(){ 
    } 
} 

Теперь ваш FooPage будет выглядеть

public class FooPage { 

    private IWebDriver driver; 

    public FooPage(IWebDriver driver) { 
     this.driver = driver; 
    } 

    public FooPageTopToolbar { 
     get { return new FooPageTopToolbar(driver); } 
    } 

    // other components as well 
    public FooPageList { 
     get { return new FooPageList(driver); } 
    } 
} 

Примечания это просто демо, вы также можете рассмотреть вопрос о получении наследование, интерфейсов и абстракция участвует в создании объектов страницы.Например, если TopToolbar разделяется многими другими страницами, вам нужен только один класс для всех. Если разные страницы имеют похожие, но несколько разные панели инструментов, то создайте абстрактный класс панели инструментов.

Кроме того, вы упомянули, что у вас разные локаторы для разных условий, лучшим решением на мой взгляд было бы добавить идентификаторы элементов в ваш исходный код (под «идентификаторами», я имею в виду любые идентифицируемые части, возможно, HTML id, но большинство обычно уникальный class для целей тестирования). В этом случае вам понадобится только один набор локаторов тестирования, которые не часто меняются разработчиками пользовательского интерфейса.

+0

кажется странным, просто возвращая экземпляр «FooPageTopToolbar» по одному методу в классе FooPage. Я бы предположил, что у большего количества страниц будет панель инструментов. Было бы лучше, чем-то представить это в более OO-стиле? –

+0

@CopyandPaste: Цитата из ответа: «Обратите внимание, что это всего лишь демонстрация, вы также можете рассмотреть возможность наследования, интерфейсов и абстракции для создания ваших объектов страницы. Например, если TopToolbar разделяется многими другими страницами, вам нужно только один класс для всех ». –

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