Объекты страницы в watir splash, как убедиться, что создан правильный объект страницы

Я использую инфраструктуру Watir Splash для тестирования веб-приложения и настроил два класса страниц. Первая — это страница «Вход», которая подробно описана здесь:

module App
 module Page
 class Login < WatirSplash::Page::Base
  url "http://[removed].com"

    def login_btn
        modify button(:id => 'btnLogin'), :click => lambda {redirect_to VehicleSelection}
    end

Другой класс страниц — это страница «Выбор автомобиля». Я использовал метод модификации, как показано в документации здесь, чтобы убедиться, что объект страницы выбора транспортного средства доступен для RSpec после успешного входа в систему.

Но что произойдет, если авторизация не удалась? У меня есть несколько тестовых случаев, которые преднамеренно передают неверную информацию в форму входа, чтобы убедиться, что аутентификация работает правильно. RSpec потребуются методы, определенные в классе «Вход», чтобы получить доступ к правильным элементам для завершения тестового примера. В этом случае, как я указал метод, объект «VehicleSeleciton» будет возвращен независимо. (или так кажется)

Любая помощь приветствуется. Кроме того, я открыт для других предложений по тестированию фреймворков, особенно если у меня есть больше примеров кода, на которые я могу ссылаться.


person Tushar Garg    schedule 28.11.2012    source источник


Ответы (2)


Ниже приведены несколько подходов, которые я пробовал. Я не использовал инфраструктуру WatirSplash, но применялись те же концепции (хотя код примера попытки WatirSplash может быть не точен на 100%).

Решение 1. Верните объекты страницы

Лично я предпочитаю, чтобы объекты страницы не возвращали объекты страницы. Вместо этого мне легче читать/работать с явной инициализацией каждого объекта страницы в тесте. Алистер Скотт рассказал об этом в своем блоге.

Тогда ваши тесты будут выглядеть так:

#For login successful tests
page = App::Page::Login.new
page.login_btn.click
page = App::Page::VehicleSelection.new  #The VehicleSelection page is explicitly initialized
page.validate_page #or whatever you want to do with the page

#For login failed tests
page = App::Page::Login.new
page.login_btn.click
page.validate_page #or whatever you want to do with the page

Решение 2. Создайте несколько методов входа

Другим решением было бы создать два метода входа в систему — один для успешного входа и один для неудачного входа.

Объект страницы может быть:

module App
    module Page
        class Login < WatirSplash::Page::Base
            url "http://[removed].com"

            def login(user, password)
                #Do whatever code to input name and password and then click the button

                #Then redirect to the VehicleSelection page since that is where you will want to go most often
                redirect_to VehicleSelection
            end

            def login_failed(user, password)
                login(user, password)               

                #Return the Login page (instead of the VehicleSelection page).
                redirect_to Login
            end
        end
    end
end

С тестами:

#For login successful tests
login_page = App::Page::Login.new
vehicle_page = login_page.login(user, password)
vehicle_page.validate_page #or whatever you want to do with the Vehicle Selection page

#For login failed tests
login_page = App::Page::Login.new
login_page.login_failed(user, password)
login_page.validate_page #or whatever you want to do with the Login page

Решение 3. Сообщите кнопке, куда она направляется

Другим решением было бы, чтобы кнопка входа знала, на какую страницу перенаправлять.

Объект страницы может быть:

module App
    module Page
        class Login < WatirSplash::Page::Base
            url "http://[removed].com"

            def login_btn(login_successful=true)
                if login_successful
                    modify button(:id => 'btnLogin'), :click => lambda {redirect_to VehicleSelection}
                else
                    modify button(:id => 'btnLogin'), :click => lambda {redirect_to Login}
                end
            end
        end
    end
end

С тестами:

#For login successful tests
login_page= App::Page::Login.new
vehicle_page = login_page.login_btn.click
vehicle_page.validate_page #or whatever you want to do with the Vehicle Selection page

#For login failed tests
login_page= App::Page::Login.new
login_page.login_btn(false).click
login_page.validate_page #or whatever you want to do with the Login page
person Justin Ko    schedule 29.11.2012
comment
Спасибо за ваш подробный ответ. Это было очень полезно. Вы упомянули, что не использовали фреймворк watirsplash; какие из них вы использовали, и не могли бы вы сказать несколько слов о том, почему вы выбрали именно этот путь? - person Tushar Garg; 29.11.2012
comment
Для фреймворка объекта страницы я использовал специально созданный. Он черпает функции/идеи из жемчужины объектов страницы Cheezy и Алистер Скотт. - person Justin Ko; 29.11.2012

Спасибо, что попробовали мой драгоценный камень WatirSplash. Я бы написал что-нибудь в строках решения № 2 - например. создайте два отдельных метода для успешного входа и неудачного входа. Использование #modify не требуется ни в одном из методов, как это сделал Джастин.

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

person Jarmo Pertman    schedule 29.11.2012
comment
Спасибо за ваше предложение. Я посмотрю на тестовой странице. Любые другие драгоценные камни, которые я должен использовать? Вы используете factory_girl? - person Tushar Garg; 30.11.2012
comment
Вы также можете использовать factory_girl, но это не обязательно. Однако я бы рекомендовал его вместо Rails Fixtures. - person Jarmo Pertman; 04.12.2012