2016-09-11 7 views
0

У меня есть программа Ruby, которая использует webdriver (Watir) для просмотра страницы и выполнения тестов вместе с набором BDD под названием RSpec.Ruby - Программный модуль навигатора

Я пытаюсь оптимизировать его для медленного сервера, улучшая его способность эффективно перемещаться. До сих пор он создавал новый сеанс браузера для каждого тестового пакета, а затем закрывал его. Это очень неэффективно, потому что он снова попадает на страницу входа для каждого экземпляра. Конечно, я не хочу вставлять инструкции навигации в тесты, потому что добавление новых файлов спецификаций может изменить порядок, в котором они выполняются, а не на каждой странице webapp есть основная панель навигации, поэтому навигации может потребоваться изменение на основе последней спецификации браузера.

Мне нужна какая-то мастер-библиотека или модуль, который возьмет на какую страницу находится программа и на какую страницу она хочет перейти, а затем перевести браузер на эту страницу, чтобы он мог начать тестирование. Каков наилучший способ сделать это? Я не фантастически переживаю, поэтому мне бы очень понравились материалы от более опытных разработчиков. Должна ли каждая страница быть классом? Должен ли я просто придерживаться закрывающих браузеров после каждого тестового пакета? Должен ли я вручную кодировать методы грубой силы (gotoPage1FromPage2)? Хорошо, этот последний был шуткой. Серьезно, хотя, что лучший способ сделать это?

+0

Не подавать в суд на watir, но в селене возможно подключение к существующей сессии браузера. Таким образом, вы можете запустить процесс браузера в отдельном терминале и при необходимости подключиться к вашим приложениям. См. Http://stackoverflow.com/questions/18721404/connect-to-an-already-running-instance-of-chrome-using-selenium-in-python для некоторого кода на Python, который должен быть переводимым в Ruby, поскольку Selenium использует в основном тот же API для всех его пакетов. В качестве альтернативы вы можете посмотреть [автономный сервер selenium] (http://www.seleniumhq.org/download/) –

+0

Пожалуйста, не используйте идентификаторы сеанса для повторного использования экземпляров браузера. Это абсолютно не поддерживается командой Selenium, и это плохая идея практически во всех обстоятельствах. Используйте свой тестовый бегун так, как ваш тестовый бегун предназначен для использования. – titusfortner

+1

Кроме того, похоже, что у вас много общих вопросов, которые меньше подходят для переполнения стека.Не стесняйтесь присоединяться к каналу Watir Slack (часть Selenium Team Slack): http://seleniumhq.herokuapp.com/ – titusfortner

ответ

0

Вы точно знаете о трудностях сохранения состояния в своих тестах. Выключение браузера между сеансами - лучший способ убедиться, что вы всегда знаете состояние браузера в любое время для теста. Saucelabs доходит до того, чтобы развернуть новую виртуальную машину для каждого из проведенных ими тестов. В идеале вы уменьшаете время тестирования, параллельно используя несколько тестов.

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

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

Рекомендуется использовать методы из одного объекта страницы, возвращающего новые объекты страницы. Таким образом, пользователи могли писать такие методы в своих тестах: LoginPage.new.login.view_account.edit_address. Многие из нас были укушены этим подходом. Кроме того, он не так легко читать, как делать что-то вроде этого:

LoginPage.new.login 
HomePage.new.view_account 
AccountPage.new.edit_address 

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

+0

Моя текущая реализация заключалась в определении атрибутов каждой страницы в классе (например, элементов) с использованием hash (например, link (: ok, id: 'ok_button')), а затем создает экземпляр объекта для представления этой страницы. Конечным результатом является DSL, похожий на «dashboard_page.ok» или «login_page.user =« Joe ». Я просто готов приступить к интеграции части оптимизатора в эту функциональность, но вы, кажется, указываете, что это плохой ход. Можете ли вы объяснить, почему абстрагирование методов навигации - плохая идея? –

+0

Вам следует избегать повторного использования этого колеса и использовать один из камней объектов страницы. Мы только начинаем обсуждать в сообществе Watir больше об улучшении работы с объектным кодом страницы с Watir. Я буду склонен к моему (https://github.com/titusfortner/watir_drops), но у Alex есть отличный, который хорошо использует Watir (https://github.com/p0deje/watirsome/), и самый популярный из них - Cheezy (https://github.com/cheezy/page-object), но из-за некоторых ограничений дизайна он не поддерживает все, что делает Watir. – titusfortner

+0

Я уже использовал жемчужину страницы-объекта Cheezy. Мой вопрос - это больше о том, как интегрировать дополнительные функции межстрановой навигации с моей программой. Недавно я недавно обнаружил решения для создания камешек как объектов, поэтому в контексте основного вопроса это было бы очень полезно (так что вы на правильном пути) –

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