Повторное использование шагов Specflow при использовании шаблона «Объекты страницы»

Я использую 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);
        }
    }
}

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

Спасибо.


person regisbsb    schedule 08.08.2011    source источник


Ответы (2)


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

Получив это, вы можете реализовать шаг, вызвав это свойство, ища ссылку с именем, указанным на шаге («ссылка1» или «ссылка2»), а затем щелкнув по нему.

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

person Sam Holder    schedule 29.07.2015
comment
Я знаю. Объекты страницы не очень хорошо сочетаются с этими сценариями, такими как сценарии, но иногда это все, что у нас есть. Я использовал аналогичный подход к тому, что вы сказали. - person regisbsb; 29.07.2015

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

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

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

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

person Tz_    schedule 28.08.2011