Повторное использование шагов Specflow при использовании шаблона Page Objects - PullRequest
2 голосов
/ 08 августа 2011

Я использую Specflow с объектами страницы, и у меня есть много сценариев, которые очень похожи. Например:

Given I view the 'page1'  
When I click 'link1'  
Then I should be on 'page2'  

Given I view the 'page1'  
When I click 'link2'  
Then I should be on 'page3'

Я изо всех сил пытаюсь понять, как можно было бы привязать один шаг к шагу "Когда я нажимаю ...". Если я следую шаблону объектов страницы, я всегда должен возвращать конкретный объект страницы, к которому я перешел, в шаге «Тогда я должен ...».

У меня есть класс определения базового шага, который содержит свойство, в котором хранится текущий объект страницы.

 public class BaseStep : Steps
{
    protected RemoteWebDriver Driver {
        get
        {
            return ScenarioContext.Current.Get<RemoteWebDriver>();
        }
        set
        {
            ScenarioContext.Current.Set(value);
        }
    }

    protected BasePageObject CurrentPageObject
    {
        get
        {
            return ScenarioContext.Current.Get<BasePageObject>();
        }
        set
        {
            ScenarioContext.Current.Set(value);
        }
    }
}

Я не хочу писать одношаговое определение для каждого сценария, так как в нем много кода, который я бы предпочел использовать в одном методе. Так как же я могу использовать определения шагов и по-прежнему использовать шаблон объекта страницы?

Спасибо.

Ответы [ 2 ]

1 голос
/ 29 июля 2015

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

Если у вас есть это, вы можете реализовать этот шаг, вызвав это свойство, ища ссылку с именем, указанным в шаге ('link1' или 'link2'), а затем щелкнув это.

Пока это будет работатьЯ бы порекомендовал вам попытаться не делать ваши сценарии настолько специфичными для реализации.Вместо того, чтобы «когда я нажимаю« ссылка1 »», лучше иметь что-то, более описывающее намерение, чем имплементацию, «когда я иду в корзину» или «когда я перехожу к деталям своего аккаунта».Это не так многократно, но оно также устойчиво к рефакторингу вашего дизайна и позволяет многократно использовать ваши шаги для разных устройств, когда «щелчок» по ссылке не имеет смысла (например, для сенсорных устройств)

0 голосов
/ 29 августа 2011

Меня также очень интересовали бы мнения и практики других, но вот мои мысли.

Если вы выберете универсальную привязку «Когда я нажимаю« ([^ '] *) », у вас будет не так много информации в универсальном сценарии« Когда ». Тем не менее, вы можете попытаться «подождать» следующей загруженной страницы и проверить URL-адрес (IWebDriver), чтобы выяснить, где вы находитесь (в зависимости от браузера). Вам потребуется сопоставление между URL-адресом и объектами вашей страницы, чтобы иметь возможность правильно выбрать текущий объект страницы. Для этого вы можете создать сопоставление вручную, использовать некоторые условные обозначения или использовать другую существующую «информацию сопоставления», например, маршрутизацию ASP.NET или карту сайта, или, скорее всего, некоторую их комбинацию. ;)

Другая возможность состоит в том, чтобы отложить оценку текущего URL до Then, но в этом случае, вероятно, получатель свойства CurrentPageObject должен инкапсулировать это. Я имею в виду, что стоимость имущества не должна зависеть от того, «позвоните» ли вы «тогда» или нет.

Я попробовал немного другой подход в одном из моих последних проектов. Я написал более конкретные операторы When для моих сценариев, поэтому вместо «Когда я нажимаю« Поиск »», «Когда я нажимаю« Заказ »» или «Когда я нажимаю« Подтверждение »», у меня было «Когда я запускаю поиск с параметрами заполнено »,« Когда я заказываю выбранные товары »или« Когда я подтверждаю заказ ». Поскольку эти операторы описывали конкретное действие, я делегировал их текущему объекту страницы (приведенному к конкретной рассматриваемой странице), где у объекта страницы были конкретные методы для этих действий. Реализация не только «нажала» на соответствующую кнопку (базовая функциональность), но также дождалась загрузки страницы и соответствующим образом установила объект текущей страницы. В таких конкретных случаях было либо очевидно, что представляет собой «следующий» объект текущей страницы, либо я мог более или менее легко проверить, что произошло, если бы было больше возможных результатов. Ценой, которую я заплатил, было то, что это был не просто общий тип. Когда определение шага для клика, преимущество (помимо того, что объяснялось выше) состояло в том, что формулировка сценариев была больше сосредоточена на намерении пользователя, а не на конкретном элементе управления пользовательского интерфейса. -уровневое взаимодействие (выполнение действия вместо нажатия чего-либо)

...