2014-02-09 3 views
2

Я пытаюсь создать своего рода генерацию кода для объекта страницы в WebDriver.Генерация кода для WebDriver PageObjects

Я читал об этом, и смотрите следующую лекцию: http://www.youtube.com/watch?v=mSCFsUOgPpw

Я также видел некоторые инструменты, которые создают объект страницы для каждой новой страницы в моем приложении, поэтому я знаю, как определить и создать WebElement, которые актуальны для меня (по идентификатору или XPath) и создать новый объект страницы.

Но у меня есть 2 основные проблемы:

  1. Как я могу знать, что к с этими элементами? Некоторые из них нужно щелкнуть, некоторым нужно отправить ключи, некоторые нужно нажать, а затем нажать ENTER и т. Д.
  2. Навигация. В моем тестовом коде я хочу перемещаться между страницами (это все о шаблоне страницы). Как узнать связь между объектами моей страницы?
+0

Проблема, которую я предвижу это в целом будет иметь те же провалы, как делать записи и воспроизведения инструменты , Они будут генерировать ужасные селектора и код мусора, который можно сделать намного лучше вручную. – Arran

+0

@Arran Вы можете создать XPATH для каждого элемента, взяв его имя тега и все атрибуты этого элемента. –

ответ

5

Создайте объект страницы (для многократного использования) для каждого виджета (widget = button, combobox, textfield, ...). Конструктор виджета принимает объект WebElement или объект By. Каждый объект страницы должен использовать объект страницы многократного использования. Вот пример простой страницы входа.

public class MyLoginPage { 
    private TextField mUsername; 
    private TextField mPassword; 
    private Button mSignon; 

    ... 

    // getter 
    public TextField getUsername() { 
    return mUsername; 
    } 

} 

С помощью некоторых эвристик вы должны быть в состоянии выбрать правильный виджет для использования. Это должно ответить на ваш первый вопрос.

Для второго вопроса. Либо вы реализуете специальный метод для объекта страницы, который возвращает вам другой объект страницы. Что-то вроде этого:

public MyHomePage clickSignon() { 
    this.mSignon.click(); 
    return new MyHomePage(...); 
} 

Вы также можете реализовать кнопку в качестве общего класса. Метод нажмите на кнопку виджета:

public <T extends Widget> T click() { 
    ... // coe that makes the click 
    return new T(...); 
} 

Заявление члена внутри страницы входа:

private Button mSignon<MyHomePage>; 

Таким образом, вы можете написать:

MyHomePage hp = loginPage.getSignon().click(); 

Либо вы реализуете фабрику страницы объект. Завод может определить текущее состояние экрана и вернуть вам страницу, соответствующую тому, что вы видите. Вы можете определить это, пытаясь найти какой-то определенный элемент на экране (т. Е. Кнопка для входа в систему присутствует только на странице входа).

Отнюдь не окончательный ответ, но я надеюсь, что он уже дал вам направление. Не стесняйтесь оставлять вопрос в комментарии, и я обновлю этот ответ.

+0

Благодарим вас за ответ. У меня вопрос о 2. У меня много проблем с этой проблемой в моем приложении.Например, когда я нажимаю на один из моих флажков, он переключает другой элемент (//), который приводит к разным страницам. Как я могу знать, что щелчок по этому элементу изменили эти кнопки и привели к 2 различным тестам (и логике ..). –

+0

Кроме того, хронологический: Если мне нужно нажать OK, перед запуском sendKeys(), как я могу это узнать с помощью DOM и selenuim? –

+0

1-й вопрос: у вас может быть объект страницы, который содержит всю вашу кнопку, независимо от того, что они видны или нет. Вам придется закодировать метод «isVisble» на объекте страницы, который может быть полезен для кнопки. У вас будет тестовый пример, в котором вы проверяете видимость кнопки в зависимости от того, установлен флажок или нет, тестовый пример, чтобы проверить поведение вашей страницы, когда кнопка видна, и тестовый пример, чтобы проверить поведение вашей страницы, когда кнопка не видна. – Algiz

2

Я также был вдохновлен этой лекцией, и после некоторого изучения этой темы я бы сказал: такой подход автоматического создания объектов страницы возможен для некоторых веб-приложений: например, важные элементы управления по умолчанию. Страницы NET/ASPX имели бы id: ctxWebPageName_Container1_Panel1_btnLogin.
Вы можете легко проанализировать идентификатор и получить всю необходимую информацию.

Однако, в общем случае автоматическое создание объекта страницы невозможно или очень сложно и требует некоторого искусственного интеллекта.

Именно поэтому я создал свой собственный инструмент SWD Page Recorder для полуавтоматизации этого скучного процесса ручного создания класса объектов страницы.
Инструмент позволяет:

  • Добавить новые элементы на странице браузера
  • редактировать и отлаживать записанные веб-элементы: Тестирование и изменение локаторы
  • Генерация страницы Класс объекта файл

Для того, чтобы показать полную картину, я работаю над другим проектом, простой каркас с объектами PageObjects:
SWD.Starter, которые вводят следующие правила для PageObjects:

Каждая страница может быть самостоятельно испытываться:
Существует общий тест для каждого PageObject внутри рамки, которая открывает страницу и просит PageObject самостоятельно тестировать свои элементы.
Эти тесты реализованы как крошечный набор для тестирования дыма. Прежде всего, они тестируют приложение, но, с другой стороны, они также проверяют, что декларация объекта страницы внутри кода по-прежнему соответствует реальной странице.

Сервис-ориентированная архитектура
Веб-элементы Page1 не могут быть доступны вне класса Page1. Когда тестовый код или другая страница хочет выполнить некоторые действия на странице, они должны вызвать метод, объявленный внутри страницы. Все веб-элементы внутри Page1 объявляются с помощью частных или защищенных модификаторов.

Следуя этим правилам, я действительно упростили свою жизнь:

  • Процесс записи новых страниц с SWD Page Recorder и генерации кода PageObject становится гораздо быстрее и веселее.
  • Набор проб дыма быстро удаляется, когда объекты PageObject не соответствуют реальным страницам.
  • Чтобы исправить объект страницы, мне нужно перезаписать некоторые элементы вручную с помощью рекордера страниц SWD или внести изменения в ручную. Как я уже сказал, запрещается прямое использование веб-элементов вне данного объекта PageObject; так что исправления должны применяться только внутри сломанного объекта страницы. Другие страницы

Ссылки

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