├── .gitignore ├── .rspec ├── ChangeLog.txt ├── README.md ├── capybara-rspec ├── .rspec ├── Rakefile ├── agiletravel-capybara-rspec.tpr ├── agileway_utils.rb ├── buildwise.rake ├── buildwise_rspec_formatter.rb ├── pages │ ├── abstract_page.rb │ ├── flight_page.rb │ ├── passenger_page.rb │ └── payment_page.rb ├── spec │ ├── flight_spec.rb │ ├── login_spec.rb │ ├── passenger_spec.rb │ ├── payment_spec.rb │ └── spec_helper.rb └── test_helper.rb ├── load-testing ├── .rspec ├── Rakefile ├── agileway_utils.rb ├── buildwise.rake ├── buildwise_rspec_formatter.rb ├── load │ ├── flight_page_object_spec.rb │ ├── login_raw_spec.rb │ ├── login_repeat_spec.rb │ ├── payment_ajax_spec.rb │ └── spec_helper.rb ├── load_test_helper.rb ├── load_testing.tpr ├── pages │ ├── abstract_page.rb │ ├── flight_page.rb │ ├── login_page.rb │ ├── passenger_page.rb │ └── payment_page.rb ├── spec │ ├── 01_login_spec.rb │ ├── 02_flight_spec.rb │ ├── 03_passenger_spec.rb │ ├── 04_payment_spec.rb │ └── spec_helper.rb └── test_helper.rb ├── performance-comparision ├── Rakefile ├── ReadMe.md ├── agileway_utils.rb ├── buildwise.rake ├── install-lib.cmd ├── package-lock.json ├── package.json ├── pages │ ├── abstract_page.js │ ├── abstract_page.rb │ ├── flight_page.js │ ├── flight_page.rb │ ├── login_page.js │ ├── login_page.rb │ ├── passenger_page.js │ ├── passenger_page.rb │ ├── payment_page.js │ └── payment_page.rb ├── performance-compare.tpr ├── selenium │ ├── e2e_selenium_pom_spec.rb │ └── e2e_selenium_raw_spec.rb ├── test_helper.js └── tests │ ├── e2e_playwright_pom_spec.js │ └── e2e_playwright_raw_spec.js ├── performance-mechanize ├── .rspec ├── Rakefile ├── agileway_utils.rb ├── buildwise.rake ├── buildwise_rspec_formatter.rb ├── pages │ └── abstract_page.rb ├── performancetesting-mechanize.tpr ├── spec │ ├── flight_spec.rb │ ├── login_spec.rb │ └── spec_helper.rb └── test_helper.rb ├── performance-selenium ├── .rspec ├── Rakefile ├── agileway_utils.rb ├── buildwise.rake ├── buildwise_rspec_formatter.rb ├── load_test_helper.rb ├── pages │ └── abstract_page.rb ├── performance-selenium.tpr ├── spec │ ├── login_spec.rb │ ├── payment_ajax_spec.rb │ └── spec_helper.rb └── test_helper.rb ├── playwright-mocha-chrome ├── Rakefile ├── agiletravel-playwright-mocha.tpr ├── buildwise.rake ├── install-lib.cmd ├── package-lock.json ├── package.json ├── pages │ ├── abstract_page.js │ ├── flight_page.js │ ├── passenger_page.js │ └── payment_page.js ├── results │ └── 01_login_spec.xml ├── test_helper.js └── tests │ ├── 01_login_spec.js │ └── 02_flight_spec.js ├── playwright-mocha ├── Rakefile ├── ReadMe.md ├── agiletravel-playwright-mocha.tpr ├── buildwise.rake ├── install-lib.cmd ├── package-lock.json ├── package.json ├── pages │ ├── abstract_page.js │ ├── flight_page.js │ ├── passenger_page.js │ └── payment_page.js ├── test_helper.js └── tests │ ├── 01_login_spec.js │ └── 02_flight_spec.js ├── pre-refactoring ├── Rakefile ├── agileway_utils.rb ├── pages │ └── abstract_page.rb ├── pre-refactoring-rspec.tpr ├── spec │ ├── end_2_end_spec.rb │ ├── flight_spec.rb │ ├── login_spec.rb │ ├── passenger_spec.rb │ └── payment_spec.rb └── test_helper.rb ├── selenium-webdriver-cucumber ├── Rakefile ├── ReadMe.txt ├── agiletravel-selenium-webdriver.tpr ├── agileway_utils.rb ├── buildwise.rake ├── config │ └── cucumber.yml ├── features │ ├── 01_login.feature │ ├── 02_flight.feature │ ├── 03_passenger.feature │ ├── 04_payment.feature │ ├── 05_login_outline.feature │ ├── login.feature │ ├── step_definitions │ │ ├── flight_steps.rb │ │ ├── login_steps.rb │ │ ├── passenger_steps.rb │ │ └── payment_steps.rb │ └── support │ │ ├── env.rb │ │ ├── hooks.rb │ │ ├── step_helper.rb │ │ └── testwise_formatter_loader.rb ├── install-lib.cmd ├── pages │ ├── abstract_page.rb │ ├── flight_page.rb │ ├── login_page.rb │ ├── passenger_page.rb │ └── payment_page.rb └── selenium-cucumber.tpr ├── selenium-webdriver-junit └── tests │ ├── LoginPage.java │ └── LoginTestCase.java ├── selenium-webdriver-nodejs-jasmine ├── Rakefile ├── agiletravel-selenium-webdriver.tpr ├── agiletravel-selenium-webdriver.tws ├── buildwise.rake ├── install-lib.cmd ├── jasmine-reporter.sh ├── package-lock.json ├── package.json ├── pages │ ├── abstract_page.js │ ├── flight_page.js │ ├── passenger_page.js │ └── payment_page.js ├── spec │ ├── 01_login_spec.js │ ├── 02_flight_spec.js │ ├── 03_passenger_spec.js │ └── 04_payment_spec.js └── test_helper.js ├── selenium-webdriver-nodejs-mocha ├── Rakefile ├── agiletravel-selenium-webdriver.tpr ├── buildwise.rake ├── install-lib.cmd ├── package-lock.json ├── package.json ├── pages │ ├── abstract_page.js │ ├── flight_page.js │ ├── passenger_page.js │ └── payment_page.js ├── spec │ ├── 01_login_spec.js │ ├── 02_flight_spec.js │ ├── 03_passenger_spec.js │ └── 04_payment_spec.js └── test_helper.js ├── selenium-webdriver-python-unittest-raw ├── .gitignore ├── Rakefile ├── agiletravel-selenium-webdriver.tpr ├── buildwise.rake └── tests │ ├── 1_login_test.py │ ├── 2_flight_test.py │ ├── 3_passenger_test.py │ └── 4_payment_test.py ├── selenium-webdriver-python-unittest ├── .gitignore ├── Rakefile ├── agiletravel-selenium-webdriver.tpr ├── buildwise.rake ├── install-lib.cmd ├── pages │ ├── __init__.py │ ├── abstract_page.py │ ├── flight_page.py │ ├── login_page.py │ ├── passenger_page.py │ └── payment_page.py ├── test_helper.py └── tests │ ├── 1_login_test.py │ ├── 2_flight_test.py │ ├── 3_passenger_test.py │ └── 4_payment_test.py ├── selenium-webdriver-rspec-cucumber ├── .rspec ├── Rakefile ├── agiletravel-selenium-webdriver.tpr ├── agileway_utils.rb ├── buildwise.rake ├── buildwise_rspec_formatter.rb ├── features │ ├── 01_login.feature │ ├── 02_flight.feature │ ├── 03_passenger.feature │ ├── 04_payment.feature │ ├── 05_login_outline.feature │ ├── step_definitions │ │ ├── flight_steps.rb │ │ ├── login_steps.rb │ │ ├── passenger_steps.rb │ │ └── payment_steps.rb │ ├── support │ │ ├── env.rb │ │ ├── hooks.rb │ │ ├── step_helper.rb │ │ └── testwise_formatter_loader.rb │ └── tmp_syntax_check.feature ├── install-lib.cmd ├── pages │ ├── abstract_page.rb │ ├── flight_page.rb │ ├── login_page.rb │ ├── passenger_page.rb │ └── payment_page.rb ├── spec │ ├── 01_login_spec.rb │ ├── 02_flight_spec.rb │ ├── 03_passenger_spec.rb │ ├── 04_payment_spec.rb │ └── spec_helper.rb └── test_helper.rb ├── selenium-webdriver-rspec ├── .rspec ├── Rakefile ├── agiletravel-selenium-webdriver.tpr ├── agileway_utils.rb ├── buildwise.rake ├── buildwise_rspec_formatter.rb ├── install-lib.cmd ├── pages │ ├── abstract_page.rb │ ├── flight_page.rb │ ├── login_page.rb │ ├── passenger_page.rb │ └── payment_page.rb ├── spec │ ├── 01_login_spec.rb │ ├── 02_flight_spec.rb │ ├── 03_passenger_spec.rb │ ├── 04_payment_spec.rb │ └── spec_helper.rb └── test_helper.rb ├── spec └── spec_helper.rb ├── user-stories-new.csv ├── user-stories.csv └── watir-rspec ├── .rspec ├── Rakefile ├── agiletravel-watir.tpr ├── agiletravel-watir.tws ├── agileway_utils.rb ├── buildwise.rake ├── buildwise_rspec_formatter.rb ├── install-lib.cmd ├── pages ├── abstract_page.rb ├── confirmation_page.rb ├── flight_page.rb ├── home_page.rb ├── passenger_page.rb └── payment_page.rb ├── spec ├── flight_spec.rb ├── login_spec.rb ├── passenger_spec.rb ├── payment_spec.rb └── spec_helper.rb └── test_helper.rb /.gitignore: -------------------------------------------------------------------------------- 1 | selenium-webdriver-cucumber/log/*.xml 2 | selenium-webdriver-cucumber/log/*.log 3 | selenium-webdriver-cucumber/log/*.html 4 | selenium-webdriver-python-unittest/reports/*.html 5 | selenium-webdriver-python-unittest/reports/*.xml 6 | .DS_Store 7 | selenium-webdriver-gauge/logs/ 8 | selenium-webdriver-gauge/reports/ 9 | selenium-webdriver-python-unittest/.cache/ 10 | selenium-webdriver-python-unittest/test/.cache/ 11 | selenium-webdriver-python-unittest/test/__pycache__/ 12 | capybara-rspec/spec/reports/ 13 | selenium-webdriver-nodejs-mocha/reports/ 14 | selenium-webdriver-python-unittest/.pytest_cache/ 15 | watir-rspec/spec/reports/ 16 | .pytest_cache/ 17 | spec/reports/ 18 | test-results.xml 19 | selenium-webdriver-rspec/agiletravel-selenium-webdriver.tws 20 | selenium-webdriver-junit/.idea/ 21 | selenium-webdriver-junit/lib/ 22 | selenium-webdriver-junit/out/ 23 | selenium-webdriver-junit/selenium-webdriver-junit.iml 24 | selenium-webdriver-python-unittest/pages/__pycache__/ 25 | selenium-webdriver-python-unittest/test/debugging_test.py 26 | selenium-webdriver-cucumber/agiletravel-selenium-webdriver.tws 27 | selenium-webdriver-nodejs-mocha/agiletravel-selenium-webdriver.tws 28 | selenium-webdriver-python-unittest/agiletravel-selenium-webdriver.tws 29 | selenium-webdriver-rspec/spec/debugging_spec.rb 30 | watir-rspec/agiletravel-watir.tws 31 | capybara-rspec/agiletravel-capybara-rspec.tws 32 | selenium-webdriver-nodejs-mocha/node_modules/ 33 | selenium-webdriver-nodejs-mocha/spec/debugging_spec.js 34 | load-testing/load_testing.tws 35 | selenium-webdriver-nodejs-mocha/port_number.txt 36 | selenium-webdriver-python-unittest/__pycache__/ 37 | selenium-webdriver-python-unittest/tests/__pycache__/ 38 | selenium-webdriver-rspec-cucumber/agiletravel-selenium-webdriver.tws 39 | selenium-webdriver-nodejs-mocha/node_modules 40 | selenium-webdriver-nodejs-jasmine/port_number.txt 41 | selenium-webdriver-nodejs-jasmine/testresults/results.xml 42 | node_modules/ 43 | playwright-mocha-chrome/agiletravel-playwright-mocha.tws 44 | playwright-mocha/agiletravel-playwright-mocha.tws 45 | performance-comparision/performance-compare.tws 46 | performance-comparision/reports/ 47 | performance-mechanize/performancetesting-mechanize.tws 48 | playwright-mocha/reports/ 49 | reports/ 50 | 51 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | 3 | -------------------------------------------------------------------------------- /ChangeLog.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 2020-01-04 4 | 5 | - Remove Watir deprecation, :id, "ABc" => id: "abc" 6 | 7 | - Change #visible? to #present? 8 | #visible? behavior will be changing slightly, consider switching to #present? (more details: http://watir.com/element-existentialism/) 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # agiletravel-ui-tests 2 | 3 | Sample UI test scripts in open source frameworks such as Selenium WebDriver, Watir, RWebSpec, Capybara and Cucumber. 4 | 5 | 6 | -------------------------------------------------------------------------------- /capybara-rspec/.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | 3 | -------------------------------------------------------------------------------- /capybara-rspec/agiletravel-capybara-rspec.tpr: -------------------------------------------------------------------------------- 1 | 2 | agiletravel-capybara-rspec.tpr 3 | Chrome 4 | Selenium 5 | RSpec 6 | 7 | 8 | https://travel.agileway.net 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | load File.dirname(__FILE__) + '/../test_helper.rb' 17 | 18 | describe "{{ TEST_SUITE }}" do 19 | include TestHelper 20 | 21 | before(:all) do 22 | Capybara.register_driver :selenium do |app| 23 | Capybara::Selenium::Driver.new(app, browser: browser_type) 24 | end 25 | end 26 | 27 | after(:all) do 28 | end 29 | 30 | it "{{ TEST_CASE }}" do 31 | # Test Steps go here 32 | end 33 | 34 | end 35 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 36 | 37 | class {{ PAGE_NAME }} < AbstractPage 38 | 39 | def initialize(driver) 40 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 41 | end 42 | 43 | # page functions here ... 44 | end 45 | 46 | -------------------------------------------------------------------------------- /capybara-rspec/buildwise_rspec_formatter.rb: -------------------------------------------------------------------------------- 1 | require 'ci/reporter/rspec' # version 1.0.0 2 | require 'fileutils' 3 | # Overrides default example failed behaviour to add saving screenshot to the reports dir. 4 | # 5 | # Prerequiste: the test script requires defines $driver 6 | # @driver = $driver = Selenium::WebDriver.for(browser_type) 7 | # 8 | # 9 | # Save to folder: ENV['CI_REPORTS'] || reports under current folder 10 | # File name: screenshot-(FULL Test Case Name).png 11 | # 12 | module CI::Reporter 13 | module RSpec3 14 | class Formatter 15 | 16 | def example_failed(notification) 17 | 18 | # In case we fail in before(:all) 19 | example_started(nil) if @suite.testcases.empty? 20 | 21 | failure = Failure.new(notification) 22 | 23 | current_spec.finish 24 | current_spec.name = notification.example.full_description 25 | current_spec.failures << failure 26 | 27 | if $driver && $driver.respond_to?("save_screenshot") # shall be set in test script 28 | reports_dir = ENV['CI_REPORTS'] || File.expand_path("#{Dir.getwd}/spec/reports") 29 | begin 30 | screenshots_dir = File.join(reports_dir, "screenshots") 31 | FileUtils.mkdir_p(screenshots_dir) unless File.exist?(screenshots_dir) 32 | 33 | spec_file_name = File.basename(notification.example.file_path) 34 | saved_to = File.join(screenshots_dir, spec_file_name) 35 | 36 | FileUtils.mkdir_p(saved_to) unless File.exist?(saved_to) 37 | example_name = notification.example.description 38 | # with folder, not using full_description 39 | $driver.save_screenshot(File.join(saved_to, "#{example_name}.png")) 40 | rescue => e 41 | # don't cause build to stop if errors happens 42 | fio = File.open( File.join(reports_dir, "error.log"), "a") 43 | fio.puts(e) 44 | fio.puts(e.backtrace) 45 | fio.flush 46 | fio.close 47 | end 48 | 49 | end 50 | 51 | end 52 | 53 | end 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /capybara-rspec/pages/abstract_page.rb: -------------------------------------------------------------------------------- 1 | require 'capybara/dsl' 2 | 3 | # This is the parent page for all page objects, for operations across all pages, define here 4 | class AbstractPage 5 | 6 | include Capybara::DSL 7 | 8 | if defined?(TestWiseRuntimeSupport) 9 | include TestWiseRuntimeSupport 10 | end 11 | 12 | 13 | def initialize(text = "") 14 | # raise "Page text '#{text}' not found on #{self.class.name}" unless @browser.text.include?(text) 15 | end 16 | 17 | end 18 | -------------------------------------------------------------------------------- /capybara-rspec/pages/flight_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class FlightPage < AbstractPage 4 | 5 | def initialize() 6 | super("") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def select_trip_type(trip_type) 10 | choose("tripType", option: trip_type) 11 | end 12 | 13 | def select_depart_from(from_port) 14 | select(from_port, :from => 'fromPort') 15 | end 16 | 17 | def select_arrive_at(to_port) 18 | select(to_port, :from => 'toPort') 19 | end 20 | 21 | def select_departure_day(depart_day) 22 | select(depart_day, :from => 'departDay') 23 | end 24 | 25 | def select_departure_month(depart_month) 26 | select(depart_month, :from => 'departMonth') 27 | end 28 | 29 | def select_return_date(day, month) 30 | select(day, :from => 'returnDay') 31 | select(month, :from => 'returnMonth') 32 | end 33 | 34 | def click_continue 35 | click_button("Continue") 36 | end 37 | 38 | end 39 | -------------------------------------------------------------------------------- /capybara-rspec/pages/passenger_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PassengerPage < AbstractPage 4 | 5 | def initialize() 6 | super("") # 7 | end 8 | 9 | def click_next() 10 | click_button("Next") 11 | end 12 | 13 | def enter_first_name(passenger_first_name) 14 | fill_in 'passengerFirstName', :with => passenger_first_name 15 | end 16 | 17 | def enter_last_name(passenger_last_name) 18 | fill_in 'passengerLastName', :with => passenger_last_name 19 | end 20 | 21 | end 22 | -------------------------------------------------------------------------------- /capybara-rspec/pages/payment_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PaymentPage < AbstractPage 4 | 5 | def initialize() 6 | super("") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def select_card_type(card_type) 10 | choose("card_type", option: card_type) 11 | end 12 | 13 | def enter_holder_name(holder_name) 14 | fill_in 'holder_name', :with => holder_name 15 | end 16 | 17 | def enter_card_number(card_number) 18 | fill_in 'card_number', :with => card_number 19 | end 20 | 21 | def select_expiry_month(expiry_month) 22 | select(expiry_month, :from => "expiry_month") 23 | end 24 | 25 | def select_expiry_year(expiry_year) 26 | select(expiry_year, :from => "expiry_year") 27 | end 28 | 29 | def click_pay_now 30 | click_button("Pay now") 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /capybara-rspec/spec/flight_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Select Flights" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | Capybara.register_driver :selenium do |app| 8 | Capybara::Selenium::Driver.new(app, :browser => browser_type) 9 | end 10 | visit("/") 11 | sign_in("agileway", "testwise") 12 | end 13 | 14 | before(:each) do 15 | visit("/flights/start") 16 | end 17 | 18 | after(:all) do 19 | # close_browser unless debugging? 20 | end 21 | 22 | it "One-way trip" do 23 | flight_page = FlightPage.new 24 | flight_page.select_trip_type("oneway") 25 | expect(page).to have_selector('#returnTrip', visible: false) 26 | flight_page.select_depart_from("Sydney") 27 | flight_page.select_arrive_at("New York") 28 | flight_page.select_departure_day("02") 29 | flight_page.select_departure_month("May 2016") 30 | flight_page.click_continue 31 | sleep 0.5 32 | expect(page.has_content?("2016-05-02 Sydney to New York")).to be_truthy 33 | end 34 | 35 | it "Return trip" do 36 | flight_page = FlightPage.new 37 | flight_page.select_trip_type("return") 38 | flight_page.select_depart_from("Sydney") 39 | flight_page.select_arrive_at("New York") 40 | flight_page.select_departure_day("02") 41 | flight_page.select_departure_month("May 2016") 42 | flight_page.select_return_date("04", "June 2016") 43 | flight_page.click_continue 44 | expect(page.has_content?("2016-05-02 Sydney to New York")).to be_truthy 45 | expect(page.has_content?("2016-06-04 New York to Sydney")).to be_truthy 46 | end 47 | 48 | end 49 | -------------------------------------------------------------------------------- /capybara-rspec/spec/login_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "User Can Login" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | Capybara.register_driver :selenium do |app| 8 | Capybara::Selenium::Driver.new(app, :browser => browser_type) 9 | end 10 | end 11 | 12 | before(:each) do 13 | visit("/") 14 | end 15 | 16 | it "User can login" do 17 | sign_in("agileway", "testwise") 18 | expect(page.has_content?('Signed in!')).to be_truthy 19 | sign_off 20 | end 21 | 22 | it "User failed to sign in due to invalid password" do 23 | sign_in("agileway", "badpass") 24 | expect(page.has_content?('Invalid email or password')).to be_truthy 25 | end 26 | 27 | end 28 | -------------------------------------------------------------------------------- /capybara-rspec/spec/passenger_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Passenger" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | Capybara.register_driver :selenium do |app| 8 | Capybara::Selenium::Driver.new(app, :browser => browser_type) 9 | end 10 | visit("/") 11 | sign_in("agileway", "testwise") 12 | end 13 | 14 | before(:each) do 15 | end 16 | 17 | after(:all) do 18 | # close_browser unless debugging? 19 | end 20 | 21 | it "Can enter passenger details" do 22 | flight_page = FlightPage.new 23 | flight_page.select_trip_type("return") 24 | flight_page.select_depart_from("New York") 25 | flight_page.select_arrive_at("Sydney") 26 | flight_page.select_departure_day("04") 27 | flight_page.select_departure_month("March 2016") 28 | flight_page.select_return_date("07", "April 2016") 29 | flight_page.click_continue 30 | 31 | # now on passenger page 32 | passenger_page = PassengerPage.new 33 | passenger_page.click_next 34 | expect(page.has_content?("Must provide last name")).to be_truthy 35 | 36 | passenger_page.enter_first_name("Bob") 37 | passenger_page.enter_last_name("Tester") 38 | passenger_page.click_next 39 | 40 | expect(page.html).to include("Bob Tester") 41 | end 42 | 43 | end 44 | -------------------------------------------------------------------------------- /capybara-rspec/spec/payment_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Payment" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | Capybara.register_driver :selenium do |app| 8 | Capybara::Selenium::Driver.new(app, :browser => browser_type) 9 | end 10 | visit("/") 11 | sign_in("agileway", "testwise") 12 | end 13 | 14 | before(:each) do 15 | end 16 | 17 | after(:all) do 18 | # close_browser unless debugging? 19 | end 20 | 21 | it "Get booking confirmation after payment " do 22 | flight_page = FlightPage.new 23 | flight_page.select_trip_type("oneway") 24 | flight_page.select_depart_from("Sydney") 25 | flight_page.select_arrive_at("New York") 26 | flight_page.select_departure_day("02") 27 | flight_page.select_departure_month("May 2016") 28 | flight_page.click_continue 29 | 30 | passenger_page = PassengerPage.new 31 | passenger_page.enter_first_name("Bob") 32 | passenger_page.enter_last_name("Tester") 33 | passenger_page.click_next() 34 | 35 | payment_page = PaymentPage.new 36 | payment_page.select_card_type("master") 37 | payment_page.enter_holder_name("Bob the Tester") 38 | payment_page.enter_card_number("4242424242424242") 39 | payment_page.select_expiry_month("04") 40 | payment_page.select_expiry_year("2016") 41 | payment_page.click_pay_now 42 | wait_for_ajax(10) 43 | expect(page.has_content?("Booking number")).to be_truthy 44 | end 45 | 46 | def wait_for_ajax(max_time) 47 | Timeout.timeout(max_time) do 48 | active = page.evaluate_script('jQuery.active') 49 | until active == 0 50 | active = page.evaluate_script('jQuery.active') 51 | end 52 | end 53 | end 54 | 55 | end 56 | -------------------------------------------------------------------------------- /capybara-rspec/spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # spec_helper.rb 2 | 3 | RSpec.configure do |config| 4 | # register around filter that captures stdout and stderr 5 | config.around(:each) do |example| 6 | $stdout = StringIO.new 7 | $stderr = StringIO.new 8 | 9 | example.run 10 | 11 | example.metadata[:stdout] = $stdout.string 12 | example.metadata[:stderr] = $stderr.string 13 | 14 | $stdout = STDOUT 15 | $stderr = STDERR 16 | end 17 | end -------------------------------------------------------------------------------- /load-testing/.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | 3 | -------------------------------------------------------------------------------- /load-testing/buildwise_rspec_formatter.rb: -------------------------------------------------------------------------------- 1 | require 'ci/reporter/rspec' # version 1.0.0 2 | require 'fileutils' 3 | # Overrides default example failed behaviour to add saving screenshot to the reports dir. 4 | # 5 | # Prerequiste: the test script requires defines $browser 6 | # @driver = $browser = Selenium::WebDriver.for(browser_type) 7 | # 8 | # 9 | # Save to folder: ENV['CI_REPORTS'] || reports under current folder 10 | # File name: screenshot-(FULL Test Case Name).png 11 | # 12 | module CI::Reporter 13 | module RSpec3 14 | class Formatter 15 | 16 | def example_failed(notification) 17 | 18 | # In case we fail in before(:all) 19 | example_started(nil) if @suite.testcases.empty? 20 | 21 | failure = Failure.new(notification) 22 | 23 | current_spec.finish 24 | current_spec.name = notification.example.full_description 25 | current_spec.failures << failure 26 | 27 | if $browser && $browser.respond_to?("save_screenshot") # shall be set in test script 28 | reports_dir = ENV['CI_REPORTS'] || File.expand_path("#{Dir.getwd}/spec/reports") 29 | begin 30 | screenshots_dir = File.join(reports_dir, "screenshots") 31 | FileUtils.mkdir_p(screenshots_dir) unless File.exist?(screenshots_dir) 32 | 33 | spec_file_name = File.basename(notification.example.file_path) 34 | saved_to = File.join(screenshots_dir, spec_file_name) 35 | 36 | FileUtils.mkdir_p(saved_to) unless File.exist?(saved_to) 37 | example_name = notification.example.description 38 | # with folder, not using full_description 39 | $browser.save_screenshot(File.join(saved_to, "#{example_name}.png")) 40 | rescue => e 41 | # don't cause build to stop if errors happens 42 | fio = File.open( File.join(reports_dir, "error.log"), "a") 43 | fio.puts(e) 44 | fio.puts(e.backtrace) 45 | fio.flush 46 | fio.close 47 | end 48 | 49 | end 50 | 51 | end 52 | 53 | end 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /load-testing/load/flight_page_object_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + "/../test_helper.rb" 2 | load File.dirname(__FILE__) + "/../load_test_helper.rb" 3 | 4 | describe "Select Flights" do 5 | include TestHelper 6 | include LoadTestHelper 7 | 8 | before(:all) do 9 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 10 | driver.get(site_url) 11 | end 12 | 13 | after(:all) do 14 | dump_timings 15 | driver.quit unless debugging? 16 | end 17 | 18 | it "[2] Return trip" do 19 | log_time("Visit Home Page") { 20 | driver.get(site_url) 21 | expect(driver.title).to eq("Agile Travel") 22 | } 23 | driver.find_element(:id, "username").send_keys("agileway") 24 | driver.find_element(:id, "password").send_keys("testwise") 25 | log_time("Sign in") { 26 | driver.find_element(:name, "commit").click 27 | expect(driver.find_element(:id, "flash_notice").text).to include("Signed in!") 28 | } 29 | 30 | flight_page = FlightPage.new(driver) 31 | flight_page.select_trip_type("oneway") 32 | flight_page.select_depart_from("Sydney") 33 | flight_page.select_arrive_at("New York") 34 | 35 | log_time("Select Flight") { 36 | flight_page.click_continue 37 | # simple page get_page_text costs about 0.03 seconds 38 | # start_time = Time.now 39 | expect(page_text).to include("2016-01-01 Sydney to New York") 40 | # puts("#{Time.now - start_time}: check flight") 41 | } 42 | 43 | log_time("Sign out") { logout } 44 | end 45 | end 46 | -------------------------------------------------------------------------------- /load-testing/load/login_raw_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + "/../test_helper.rb" 2 | load File.dirname(__FILE__) + "/../load_test_helper.rb" 3 | 4 | describe "User Login" do 5 | include TestHelper 6 | include LoadTestHelper 7 | 8 | before(:all) do 9 | # browser_type, browser_options, site_url are defined in test_helper.rb 10 | @driver = $browser = Selenium::WebDriver.for(browser_type, browser_options) 11 | # driver.manage().window().resize_to(1280, 720) 12 | driver.get(site_url) 13 | end 14 | 15 | after(:all) do 16 | dump_timings 17 | @driver.quit unless debugging? 18 | end 19 | 20 | it "[1] User sign in and sign out" do 21 | # add simple verification after visit a URL, to make sure it is correct, 22 | # the `driver.title` costs only 0.005 seconds 23 | log_time("Visit Home Page") { 24 | driver.get(site_url) 25 | # start_time = Time.now 26 | expect(driver.title).to eq("Agile Travel") 27 | # puts "#{Time.now - start_time} s" 28 | } 29 | 30 | # this is user supplying information, not hitting the server 31 | driver.find_element(:id, "username").send_keys("agileway") 32 | driver.find_element(:id, "password").send_keys("testwise") 33 | 34 | # the `driver.find_element(:id)` costs only 0.03 seconds 35 | log_time("Sign in") { 36 | driver.find_element(:name, "commit").click 37 | # start_time = Time.now 38 | expect(driver.find_element(:id, "flash_notice").text).to include("Signed in!") 39 | # puts("#{Time.now - start_time}: check signed in") 40 | } 41 | 42 | log_time("Sign out") { 43 | visit("/logout") 44 | # start_time = Time.now 45 | expect(driver.find_element(:id, "flash_notice").text).to include("Signed out!") 46 | # puts("#{Time.now - start_time}: check signed out") 47 | } 48 | end 49 | end 50 | -------------------------------------------------------------------------------- /load-testing/load/login_repeat_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + "/../test_helper.rb" 2 | load File.dirname(__FILE__) + "/../load_test_helper.rb" 3 | 4 | describe "User Login Repeat" do 5 | include TestHelper 6 | include LoadTestHelper 7 | 8 | before(:all) do 9 | # browser_type, browser_options, site_url are defined in test_helper.rb 10 | @driver = $browser = Selenium::WebDriver.for(browser_type, browser_options) 11 | # driver.manage().window().resize_to(1280, 720) 12 | driver.get(site_url) 13 | end 14 | 15 | after(:all) do 16 | dump_timings 17 | @driver.quit unless debugging? 18 | end 19 | 20 | it "[1] User sign in and sign out repeatedly" do 21 | load_test_repeat.times do 22 | # add simple verification after visit a URL, to make sure it is correct, 23 | # the `driver.title` costs only 0.005 seconds 24 | log_time("Visit Home Page") { 25 | driver.get(site_url) 26 | # start_time = Time.now 27 | expect(driver.title).to eq("Agile Travel") 28 | # puts "#{Time.now - start_time} s" 29 | } 30 | 31 | # this is user supplying information, not hitting the server 32 | driver.find_element(:id, "username").send_keys("agileway") 33 | driver.find_element(:id, "password").send_keys("testwise") 34 | 35 | # the `driver.find_element(:id)` costs only 0.03 seconds 36 | log_time("Sign in") { 37 | driver.find_element(:name, "commit").click 38 | # start_time = Time.now 39 | expect(driver.find_element(:id, "flash_notice").text).to include("Signed in!") 40 | # puts("#{Time.now - start_time}: check signed in") 41 | } 42 | 43 | log_time("Sign out") { 44 | visit("/logout") 45 | # start_time = Time.now 46 | expect(driver.find_element(:id, "flash_notice").text).to include("Signed out!") 47 | # puts("#{Time.now - start_time}: check signed out") 48 | } 49 | end 50 | end 51 | end 52 | -------------------------------------------------------------------------------- /load-testing/load/payment_ajax_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + "/../test_helper.rb" 2 | load File.dirname(__FILE__) + "/../load_test_helper.rb" 3 | 4 | describe "Payment Load (AJAX)" do 5 | include TestHelper 6 | include LoadTestHelper 7 | 8 | before(:all) do 9 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 10 | driver.get(site_url) 11 | end 12 | 13 | before(:each) do 14 | log_time("Visit Home Page") { 15 | driver.get(site_url) 16 | expect(driver.title).to eq("Agile Travel") 17 | } 18 | driver.find_element(:id, "username").send_keys("agileway") 19 | driver.find_element(:id, "password").send_keys("testwise") 20 | log_time("Sign in") { 21 | driver.find_element(:name, "commit").click 22 | expect(driver.find_element(:id, "flash_notice").text).to include("Signed in!") 23 | } 24 | end 25 | 26 | after(:all) do 27 | dump_timings 28 | driver.quit unless debugging? 29 | end 30 | 31 | it "[3] Payment with AJAX" do 32 | 33 | flight_page = FlightPage.new(driver) 34 | flight_page.select_trip_type("oneway") 35 | flight_page.select_depart_from("Sydney") 36 | flight_page.select_arrive_at("New York") 37 | log_time("Select Flight") { 38 | flight_page.click_continue 39 | expect(page_text).to include("2016-01-01 Sydney to New York") 40 | } 41 | 42 | # now on passenger page 43 | passenger_page = PassengerPage.new(driver) 44 | passenger_page.enter_last_name("Tester") 45 | log_time("Passenger") { 46 | passenger_page.click_next 47 | } 48 | 49 | payment_page = PaymentPage.new(driver) 50 | payment_page.select_card_type("master") 51 | payment_page.enter_holder_name("Bob the Tester") 52 | payment_page.enter_card_number("4242424242424242") 53 | payment_page.enter_expiry_month("04") 54 | payment_page.enter_expiry_year("2016") 55 | 56 | log_time("Payment") { 57 | payment_page.click_pay_now 58 | wait = Selenium::WebDriver::Wait.new(:timeout => 10) 59 | wait.until { driver.page_source.include?("Booking number") } 60 | } 61 | 62 | log_time("Sign out") { logout } 63 | end 64 | end 65 | -------------------------------------------------------------------------------- /load-testing/load/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # spec_helper.rb 2 | # 3 | # Different from test_helper.rb in up directory, this is a speical file to configure RSpec execution. 4 | # This one tell RSpec include stdout and stderr in test report. 5 | # 6 | 7 | # if use below, ci/rspec_reporter does not get output 8 | # only when run in BuildWise Agent, catpure output in result junit xml files 9 | if ENV["RUN_IN_BUILDWISE_AGENT"] == "true" 10 | RSpec.configure do |config| 11 | 12 | # register around filter that captures stdout and stderr 13 | config.around(:each) do |example| 14 | 15 | stdout, stderr = StringIO.new, StringIO.new 16 | $stdout, $stderr = stdout, stderr 17 | 18 | example.run 19 | 20 | example.metadata[:stdout] = $stdout.string 21 | example.metadata[:stderr] = $stderr.string 22 | 23 | $stdout = STDOUT 24 | $stderr = STDERR 25 | end 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /load-testing/load_testing.tpr: -------------------------------------------------------------------------------- 1 | 2 | Load Testing 3 | WebApp 4 | Chrome 5 | Selenium 6 | RSpec 7 | 8 | 9 | https://travel.agileway.net 10 | 11 | 12 | 13 | 14 | load File.dirname(__FILE__) + '/../test_helper.rb' 15 | 16 | describe "{{ TEST_SUITE }}" do 17 | include TestHelper 18 | 19 | before(:all) do 20 | # browser_type, browser_options, site_url are defined in test_helper.rb 21 | @driver = $browser = Selenium::WebDriver.for(browser_type, browser_options) 22 | driver.manage().window().resize_to(1280, 720) 23 | driver.get(site_url) 24 | end 25 | 26 | after(:all) do 27 | driver.quit unless debugging? 28 | end 29 | 30 | it "{{ TEST_CASE }}" do 31 | # driver.find_element(...) 32 | # expect(page_text).to include(..) 33 | end 34 | 35 | end 36 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 37 | 38 | class {{ PAGE_NAME }} < AbstractPage 39 | 40 | def initialize(driver) 41 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 42 | end 43 | 44 | # page functions here ... 45 | 46 | end 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /load-testing/pages/abstract_page.rb: -------------------------------------------------------------------------------- 1 | # use utils in RWebSpec and better integration with TestWise 2 | require "#{File.dirname(__FILE__)}/../agileway_utils.rb" 3 | 4 | # This is the parent page for all page objects, for operations across all pages, define here 5 | class AbstractPage 6 | 7 | 8 | # If want to use utility methods such as fail_safe { }, uncomment the line below 9 | # 10 | include AgilewayUtils 11 | 12 | # If want to use debug('message') to TestWise Console, uncomment the line below 13 | # 14 | if defined?(TestWiseRuntimeSupport) 15 | ::TestWise::Runtime.load_webdriver_support # for selenium webdriver support 16 | end 17 | 18 | 19 | def initialize(driver, text = "") 20 | @browser = driver 21 | # TODO check the page text contains the given text 22 | end 23 | 24 | 25 | def browser 26 | @browser 27 | end 28 | 29 | def driver 30 | @browser 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /load-testing/pages/flight_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class FlightPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def select_trip_type(trip_type) 10 | driver.find_elements(:name => "tripType").each { |elem| elem.click && break if elem.attribute("value") == trip_type && elem.attribute("type") == "radio" } 11 | end 12 | 13 | def select_depart_from(from_port) 14 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "fromPort")).select_by(:text, from_port) 15 | end 16 | 17 | def select_arrive_at(to_port) 18 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "toPort")).select_by(:text, to_port) 19 | end 20 | 21 | def select_depart_day(depart_day) 22 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departDay")).select_by(:text, depart_day) 23 | end 24 | 25 | def select_depart_month(depart_month) 26 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departMonth")).select_by(:text, depart_month) 27 | end 28 | 29 | def select_return_day(return_day) 30 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnDay")).select_by(:text, return_day) 31 | end 32 | 33 | def select_return_month(return_month) 34 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnMonth")).select_by(:text, return_month) 35 | end 36 | 37 | def click_continue 38 | driver.find_element(:xpath,"//input[@value='Continue']").click 39 | end 40 | 41 | end 42 | -------------------------------------------------------------------------------- /load-testing/pages/login_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class LoginPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def login(user, pass) 10 | @browser.find_element(:id, "username").send_keys(user) 11 | @browser.find_element(:id, "password").send_keys(pass) 12 | @browser.find_element(:id, "username").submit 13 | 14 | end 15 | 16 | end 17 | -------------------------------------------------------------------------------- /load-testing/pages/passenger_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PassengerPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def enter_first_name(passenger_first_name) 10 | browser.find_element(:name, "passengerFirstName").send_keys(passenger_first_name) 11 | end 12 | 13 | def enter_last_name(passenger_last_name) 14 | browser.find_element(:name, "passengerLastName").send_keys(passenger_last_name) 15 | end 16 | 17 | def click_next 18 | browser.find_element(:name, "passengerLastName").submit # submit the form, ie click 'Next' 19 | end 20 | 21 | end 22 | -------------------------------------------------------------------------------- /load-testing/pages/payment_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PaymentPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def enter_holder_name(holder_name) 10 | driver.find_element(:name, "holder_name").send_keys(holder_name) 11 | end 12 | 13 | def enter_card_number(card_number) 14 | driver.find_element(:name, "card_number").send_keys(card_number) 15 | end 16 | 17 | def enter_expiry_month(expiry_month) 18 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_month")).select_by(:text, expiry_month) 19 | end 20 | 21 | def enter_expiry_year(expiry_year) 22 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_year")).select_by(:text, expiry_year) 23 | end 24 | 25 | def click_pay_now 26 | driver.find_element(:xpath,"//input[@value='Pay now']").click 27 | end 28 | 29 | def select_card_type(card_type) 30 | driver.find_element(:xpath, "//input[@name='card_type' and @value='#{card_type}']").click 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /load-testing/spec/01_login_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "User Login" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | # for windows, when unable auto-detect firefox binary 8 | # Please note Firefox on 32 bit is "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" 9 | # Selenium::WebDriver::Firefox::Binary.path="C:/Program Files/Mozilla Firefox/firefox.exe" 10 | 11 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 12 | driver.manage().window().resize_to(1280, 720) 13 | driver.manage().window().move_to(30, 78) 14 | driver.get(site_url) 15 | 16 | driver.navigate.to(site_url) 17 | end 18 | 19 | after(:all) do 20 | driver.quit unless debugging? 21 | end 22 | 23 | it "[1] Can sign in OK" do 24 | visit("/login") 25 | login_page = LoginPage.new(driver) 26 | login_page.login("agileway", "testwise") 27 | # selenium does not have browser.text yet 28 | try_for(3) { expect(driver.page_source).to include("Welcome")} 29 | driver.find_element(:link_text, "Sign off").click 30 | puts "[stdout] Signed out" 31 | end 32 | 33 | it "[1] User failed to sign in due to invalid password", :tag => "showcase" do 34 | visit("/login") 35 | login_page = LoginPage.new(driver) 36 | login_page.login("agileway", "badpass") 37 | expect(driver.page_source).to include("Invalid email or password") 38 | end 39 | 40 | end 41 | -------------------------------------------------------------------------------- /load-testing/spec/02_flight_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Select Flights" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 8 | driver.manage().window().resize_to(1280, 720) 9 | driver.manage().window().move_to(30, 78) 10 | driver.get(site_url) 11 | 12 | login_page = LoginPage.new(driver) 13 | login_page.login("agileway", "testwise") 14 | end 15 | 16 | before(:each) do 17 | visit("/") 18 | sleep 1 # for some webdriver verson, it might not wait page loaded 19 | end 20 | 21 | after(:all) do 22 | driver.quit unless debugging? 23 | end 24 | 25 | it "[3] Return trip" do 26 | flight_page = FlightPage.new(driver) 27 | flight_page.select_trip_type("return") 28 | flight_page.select_depart_from("Sydney") 29 | flight_page.select_arrive_at("New York") 30 | 31 | flight_page.select_depart_day("02") 32 | flight_page.select_depart_month("May 2016") 33 | flight_page.select_return_day("04") 34 | flight_page.select_return_month("June 2016") 35 | flight_page.click_continue 36 | 37 | expect(page_text).to include("2016-05-02 Sydney to New York") 38 | expect(page_text).to include("2016-06-04 New York to Sydney") 39 | end 40 | 41 | it "[2] One-way trip" do 42 | flight_page = FlightPage.new(driver) 43 | flight_page.select_trip_type("oneway") 44 | flight_page.select_trip_type("return") 45 | flight_page.select_depart_from("Sydney") 46 | flight_page.select_arrive_at("New York") 47 | 48 | flight_page.select_depart_day("02") 49 | flight_page.select_depart_month("May 2016") 50 | flight_page.click_continue 51 | 52 | expect(page_text).to include("2016-05-02 Sydney to New York") 53 | end 54 | 55 | 56 | end 57 | -------------------------------------------------------------------------------- /load-testing/spec/03_passenger_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Passenger" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | # by setting $driver global variable for build_rspec_formatter can save screenshot if error occurs 8 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 9 | driver.manage().window().resize_to(1280, 720) 10 | driver.manage().window().move_to(30, 78) 11 | driver.get(site_url) 12 | 13 | login_page = LoginPage.new(driver) 14 | login_page.login("agileway", "testwise") 15 | end 16 | 17 | after(:all) do 18 | fail_safe { driver.find_element(:link_text, "Sign off").click } unless debugging? 19 | driver.quit unless debugging? 20 | end 21 | 22 | it "[4] Can enter passenger details (using page objects)" do 23 | flight_page = FlightPage.new(driver) 24 | flight_page.select_trip_type("return") 25 | flight_page.select_depart_from("Sydney") 26 | flight_page.select_arrive_at("New York") 27 | 28 | flight_page.select_depart_day("02") 29 | flight_page.select_depart_month("May 2016") 30 | flight_page.select_return_day("04") 31 | flight_page.select_return_month("June 2016") 32 | flight_page.click_continue 33 | 34 | # now on passenger page 35 | passenger_page = PassengerPage.new(driver) 36 | passenger_page.click_next 37 | try_for(3) { expect(page_text).to include("Must provide last name") } 38 | passenger_page.enter_first_name("Bob") 39 | passenger_page.enter_last_name("Tester") 40 | passenger_page.click_next 41 | 42 | # the step below fails: "Wendy" => "Bob" 43 | expect(driver.find_element(:name, "holder_name").attribute("value")).to eq("Wendy Tester") 44 | end 45 | 46 | end 47 | -------------------------------------------------------------------------------- /load-testing/spec/04_payment_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Payment" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 8 | driver.manage().window().resize_to(1280, 720) 9 | driver.manage().window().move_to(30, 78) 10 | driver.get(site_url) 11 | 12 | login_page = LoginPage.new(driver) 13 | login_page.login("agileway", "testwise") 14 | end 15 | 16 | after(:all) do 17 | driver.quit unless debugging? 18 | end 19 | 20 | it "[5] Book flight with payment", :tag => "showcase" do 21 | 22 | flight_page = FlightPage.new(driver) 23 | flight_page.select_trip_type("oneway") 24 | flight_page.select_depart_from("Sydney") 25 | flight_page.select_arrive_at("New York") 26 | 27 | flight_page.select_depart_day("02") 28 | flight_page.select_depart_month("May 2016") 29 | flight_page.click_continue 30 | 31 | # now on passenger page 32 | passenger_page = PassengerPage.new(driver) 33 | passenger_page.enter_last_name("Tester") 34 | passenger_page.click_next 35 | 36 | payment_page = PaymentPage.new(driver) 37 | try_for(3) { payment_page.select_card_type("master") } 38 | payment_page.enter_holder_name("Bob the Tester") 39 | payment_page.enter_card_number("4242424242424242") 40 | payment_page.enter_expiry_month("04") 41 | payment_page.enter_expiry_year("2016") 42 | payment_page.click_pay_now 43 | try_for(10) { expect(driver.page_source).to include("Booking number")} 44 | puts("booking number: " + driver.find_element(:id, 'booking_number').text) 45 | end 46 | 47 | end 48 | -------------------------------------------------------------------------------- /load-testing/spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # spec_helper.rb 2 | 3 | RSpec.configure do |config| 4 | # register around filter that captures stdout and stderr 5 | config.around(:each) do |example| 6 | $stdout = StringIO.new 7 | $stderr = StringIO.new 8 | 9 | example.run 10 | 11 | example.metadata[:stdout] = $stdout.string 12 | example.metadata[:stderr] = $stderr.string 13 | 14 | $stdout = STDOUT 15 | $stderr = STDERR 16 | end 17 | end -------------------------------------------------------------------------------- /performance-comparision/ReadMe.md: -------------------------------------------------------------------------------- 1 | # Installation 2 | npm i -D @playwright/test 3 | npx playwright install 4 | npm i -g playwright 5 | ***Note: am experiencing issues when using global (-g) flag with @playwright/test install. DON'T USE GLOBAL INSTALL*** 6 | 7 | # Running Tests on Command Line 8 | ## Options 9 | ### Headed mode 10 | --headed 11 | 12 | ### Non Parallel 13 | --workers=1 14 | 15 | ## Run all tests in `tests` folder 16 | npx playwright test 17 | 18 | ## Run specific file/s 19 | npx playwright test tests/01_login.spec.js tests/02_flight.spec.js 20 | 21 | ## Run test in file 22 | npx playwright test -g "login OK" 23 | npx playwright test tests/01_login.spec.js:3 24 | 25 | # Generate XML 26 | Playwright reporting. 27 | 28 | ### JUnit Reporter 29 | On bash: 30 | PLAYWRIGHT_JUNIT_OUTPUT_NAME=results.xml npx playwright test --reporter=junit 31 | 32 | On playwright config file: 33 | // playwright.config.js 34 | // @ts-check 35 | 36 | /** @type {import('@playwright/test').PlaywrightTestConfig} */ 37 | const config = { 38 | reporter: [ ['junit', { outputFile: 'results.xml' }] ], 39 | }; 40 | 41 | module.exports = config; 42 | 43 | 44 | # Jest 45 | ## Installation 46 | npm install --save-dev jest 47 | 48 | ## Running tests 49 | npm run test -------------------------------------------------------------------------------- /performance-comparision/install-lib.cmd: -------------------------------------------------------------------------------- 1 | npm install -U mocha-junit-reporter 2 | -------------------------------------------------------------------------------- /performance-comparision/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "selenium-webdriver-nodejs-mocha", 3 | "version": "1.5.1", 4 | "description": "Sample tests for Selenium WebDriver Node.js v4", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Zhimin Zhan", 10 | "license": "ISC", 11 | "dependencies": { 12 | "jasmine": "^3.8.0", 13 | "jasmine-xml-reporter": "^1.2.1", 14 | "playwright": "^1.18.1", 15 | "selenium-webdriver": "^4.0.0-beta.4" 16 | }, 17 | "devDependencies": { 18 | "@playwright/test": "^1.18.1", 19 | "jest": "^27.4.7" 20 | }, 21 | "scripts": { 22 | "test": "jest" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /performance-comparision/pages/abstract_page.js: -------------------------------------------------------------------------------- 1 | 2 | class AbstractPage { 3 | 4 | constructor(driver) { 5 | this.driver = driver; 6 | } 7 | 8 | }; 9 | 10 | 11 | module.exports = AbstractPage; 12 | -------------------------------------------------------------------------------- /performance-comparision/pages/abstract_page.rb: -------------------------------------------------------------------------------- 1 | # use utils in RWebSpec and better integration with TestWise 2 | require "#{File.dirname(__FILE__)}/../agileway_utils.rb" 3 | 4 | # This is the parent page for all page objects, for operations across all pages, define here 5 | class AbstractPage 6 | 7 | 8 | # If want to use utility methods such as fail_safe { }, uncomment the line below 9 | # 10 | include AgilewayUtils 11 | 12 | # If want to use debug('message') to TestWise Console, uncomment the line below 13 | # 14 | if defined?(TestWiseRuntimeSupport) 15 | ::TestWise::Runtime.load_webdriver_support # for selenium webdriver support 16 | end 17 | 18 | 19 | def initialize(driver, text = "") 20 | @browser = driver 21 | # TODO check the page text contains the given text 22 | end 23 | 24 | 25 | def browser 26 | @browser 27 | end 28 | 29 | def driver 30 | @browser 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /performance-comparision/pages/flight_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | class FlightPage extends AbstractPage { 4 | 5 | constructor(driver) { 6 | super(driver); 7 | } 8 | 9 | async selectTripType(trip_type) { 10 | const radios = await this.driver.$$("input[name=tripType]"); 11 | if (trip_type == "oneway") { 12 | await radios[1].check(); 13 | } else { 14 | await radios[0].check(); 15 | } 16 | } 17 | 18 | async selectDepartFrom(city) { 19 | await this.driver.selectOption("select[name='fromPort']", city); 20 | } 21 | 22 | async selectArriveAt(city) { 23 | await this.driver.selectOption("select[name='toPort']", city); 24 | } 25 | 26 | async selectDepartDay(day) { 27 | await this.driver.selectOption("select[name='departDay']", day); 28 | } 29 | 30 | async selectDepartMonth(month_year) { 31 | await this.driver.selectOption("#departMonth", month_year); 32 | } 33 | 34 | async selectReturnDay(day) { 35 | await this.driver.selectOption("select[name='returnDay']", day); 36 | 37 | } 38 | 39 | async selectReturnMonth(month_year) { 40 | await this.driver.selectOption("#returnMonth", month_year); 41 | } 42 | 43 | async clickContinue() { 44 | await this.driver.click("input:has-text('Continue')"); 45 | } 46 | }; 47 | 48 | module.exports = FlightPage; 49 | -------------------------------------------------------------------------------- /performance-comparision/pages/flight_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class FlightPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def select_trip_type(trip_type) 10 | driver.find_element(:xpath, "//input[@name='tripType' and @value='" + trip_type + "']").click 11 | end 12 | 13 | def select_depart_from(from_port) 14 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "fromPort")).select_by(:text, from_port) 15 | end 16 | 17 | def select_arrive_at(to_port) 18 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "toPort")).select_by(:text, to_port) 19 | end 20 | 21 | def select_depart_day(depart_day) 22 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departDay")).select_by(:text, depart_day) 23 | end 24 | 25 | def select_depart_month(depart_month) 26 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departMonth")).select_by(:text, depart_month) 27 | end 28 | 29 | def select_return_day(return_day) 30 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnDay")).select_by(:text, return_day) 31 | end 32 | 33 | def select_return_month(return_month) 34 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnMonth")).select_by(:text, return_month) 35 | end 36 | 37 | def click_continue 38 | driver.find_element(:xpath,"//input[@value='Continue']").click 39 | end 40 | 41 | end 42 | -------------------------------------------------------------------------------- /performance-comparision/pages/login_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | class LoginPage extends AbstractPage { 4 | 5 | constructor(driver) { 6 | super(driver); 7 | } 8 | 9 | async selectTripType(trip_type) { 10 | const radios = await this.driver.$$("input[name=tripType]"); 11 | if (trip_type == "oneway") { 12 | await radios[1].check(); 13 | } else { 14 | await radios[0].check(); 15 | } 16 | } 17 | 18 | async enterUsername(username) { 19 | await this.driver.fill("#username", username); 20 | } 21 | 22 | async enterPassword(passwd) { 23 | await this.driver.fill("#password", passwd); 24 | } 25 | 26 | async checkRememberMe() { 27 | await this.driver.click("#remember_me"); 28 | } 29 | 30 | async clickSignIn() { 31 | await this.driver.click("input:has-text('Sign in')"); 32 | } 33 | 34 | }; 35 | 36 | module.exports = LoginPage; 37 | -------------------------------------------------------------------------------- /performance-comparision/pages/login_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class LoginPage < AbstractPage 4 | def initialize(driver) 5 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 6 | end 7 | 8 | def check_remember_me 9 | driver.find_element(:id, "remember_me").click 10 | end 11 | 12 | def enter_username(user) 13 | driver.find_element(:id, "username").send_keys(user) 14 | end 15 | 16 | def enter_password(passwd) 17 | driver.find_element(:id, "password").send_keys(passwd) 18 | end 19 | 20 | def click_sign_in 21 | driver.find_element(:id, "username").submit 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /performance-comparision/pages/passenger_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class PassengerPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async enterFirstName(first_name) { 14 | await this.driver.fill("input[name='passengerFirstName']", first_name); 15 | } 16 | 17 | async enterLastName(last_name) { 18 | await this.driver.fill("input[name='passengerLastName']", last_name); 19 | } 20 | 21 | async clickNext() { 22 | await this.driver.click("input:has-text('Next')"); 23 | } 24 | }; 25 | 26 | module.exports = PassengerPage; 27 | -------------------------------------------------------------------------------- /performance-comparision/pages/passenger_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PassengerPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def enter_first_name(passenger_first_name) 10 | driver.find_element(:name, "passengerFirstName").send_keys(passenger_first_name) 11 | end 12 | 13 | def enter_last_name(passenger_last_name) 14 | driver.find_element(:name, "passengerLastName").send_keys(passenger_last_name) 15 | end 16 | 17 | def click_next 18 | # submit the form, ie click 'Next' 19 | driver.find_element(:name, "passengerLastName").submit 20 | sleep 0.5 21 | end 22 | 23 | end 24 | -------------------------------------------------------------------------------- /performance-comparision/pages/payment_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class PaymentPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async enterHolderName(holder_name) { 14 | await this.driver.locator("[name=holder_name]").fill(holder_name); 15 | } 16 | 17 | async enterCardNumber(card_number) { 18 | await this.driver.locator("[name=card_number]").fill(card_number); 19 | } 20 | 21 | async enterExpiryMonth(expiry_month) { 22 | await this.driver.selectOption("select[name='expiry_month']", expiry_month); 23 | } 24 | 25 | async enterExpiryYear(expiry_year) { 26 | await this.driver.selectOption("select[name='expiry_year']", expiry_year); 27 | } 28 | 29 | async selectCardType(card_type) { 30 | await this.driver.locator("//input[@name='card_type' and @value='" + card_type + "']").click(); 31 | // await driver.find_element(:xpath, "//input[@name='card_type' and @value='" + card_type + "']").click 32 | } 33 | 34 | async clickPayNow() { 35 | await this.driver.click("input:has-text('Pay now')"); 36 | } 37 | 38 | }; 39 | 40 | module.exports = PaymentPage; 41 | -------------------------------------------------------------------------------- /performance-comparision/pages/payment_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PaymentPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def enter_holder_name(holder_name) 10 | driver.find_element(:name, "holder_name").send_keys(holder_name) 11 | end 12 | 13 | def enter_card_number(card_number) 14 | driver.find_element(:name, "card_number").send_keys(card_number) 15 | end 16 | 17 | def enter_expiry_month(expiry_month) 18 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_month")).select_by(:text, expiry_month) 19 | end 20 | 21 | def enter_expiry_year(expiry_year) 22 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_year")).select_by(:text, expiry_year) 23 | end 24 | 25 | def click_pay_now 26 | driver.find_element(:xpath,"//input[@value='Pay now']").click 27 | end 28 | 29 | def select_card_type(card_type) 30 | driver.find_element(:xpath, "//input[@name='card_type' and @value='" + card_type + "']").click 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /performance-comparision/performance-compare.tpr: -------------------------------------------------------------------------------- 1 | 2 | agiletravel-selenium-webdriver.tpr 3 | Chrome 4 | Selenium 5 | Mocha 6 | 7 | 8 | http://agiletravel.herokuapp.com 9 | 10 | 11 | http://test.agiletravel.macmini 12 | 13 | 14 | https://travel.agileway.net 15 | 16 | 17 | http://ci1.agiletravel.dev 18 | 19 | 20 | http://ci2.agiletravel.dev 21 | 22 | 23 | node_modules 24 | 25 | load File.dirname(__FILE__) + '/../test_helper.rb' 26 | 27 | describe "{{ TEST_SUITE }}" do 28 | include TestHelper 29 | 30 | before(:all) do 31 | @browser = $browser = Selenium::WebDriver.for(browser_type, browser_options) 32 | @browser.get(site_url) 33 | end 34 | 35 | after(:all) do 36 | @browser.quit unless debugging? 37 | end 38 | 39 | it "{{ TEST_CASE }}" do 40 | # Test Steps go here 41 | end 42 | 43 | end 44 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 45 | 46 | class {{ PAGE_NAME }} < AbstractPage 47 | 48 | def initialize(driver) 49 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 50 | end 51 | 52 | # page functions here ... 53 | end 54 | 55 | -------------------------------------------------------------------------------- /performance-comparision/selenium/e2e_selenium_pom_spec.rb: -------------------------------------------------------------------------------- 1 | require "rspec" 2 | require "selenium-webdriver" 3 | 4 | require "#{File.dirname(__FILE__)}/../pages/abstract_page.rb" 5 | Dir["#{File.dirname(__FILE__)}/../pages/*_page.rb"].each { |file| load file } 6 | 7 | describe "End To End" do 8 | before(:all) do 9 | @driver = Selenium::WebDriver.for(:chrome) 10 | @driver.get("https://travel.agileway.net") 11 | driver.find_element(:link_text, "Login").click 12 | end 13 | 14 | after(:all) do 15 | @driver.quit 16 | end 17 | 18 | def driver 19 | @driver 20 | end 21 | 22 | it "End-to-End Selenium POM" do 23 | login_page = LoginPage.new(driver) 24 | login_page.enter_username("agileway") 25 | login_page.enter_password("testwise") 26 | login_page.check_remember_me 27 | login_page.click_sign_in 28 | expect(driver.find_element(:tag_name, 'body').text).to include("Signed in") 29 | 30 | flight_page = FlightPage.new(driver) 31 | flight_page.select_trip_type("oneway") 32 | flight_page.select_depart_from("Sydney") 33 | flight_page.select_arrive_at("New York") 34 | flight_page.select_depart_day("02") 35 | flight_page.select_depart_month("May 2016") 36 | flight_page.click_continue 37 | 38 | passenger_page = PassengerPage.new(driver) 39 | passenger_page.enter_first_name("Bob") 40 | passenger_page.enter_last_name("Tester") 41 | passenger_page.click_next 42 | 43 | payment_page = PaymentPage.new(driver) 44 | payment_page.select_card_type("master") 45 | payment_page.enter_holder_name("Bob the Tester") 46 | payment_page.enter_card_number("4242424242424242") 47 | payment_page.enter_expiry_month("04") 48 | payment_page.enter_expiry_year("2016") 49 | payment_page.click_pay_now 50 | end 51 | end 52 | -------------------------------------------------------------------------------- /performance-comparision/selenium/e2e_selenium_raw_spec.rb: -------------------------------------------------------------------------------- 1 | require "rspec" 2 | require "selenium-webdriver" 3 | 4 | describe "End To End" do 5 | before(:all) do 6 | @driver = Selenium::WebDriver.for(:chrome) 7 | @driver.get("https://travel.agileway.net") 8 | driver.find_element(:link_text, "Login").click 9 | end 10 | 11 | after(:all) do 12 | @driver.quit 13 | end 14 | 15 | def driver 16 | @driver 17 | end 18 | 19 | it "End-to-End Selenium Raw" do 20 | driver.find_element(:id, "username").send_keys("agileway") 21 | driver.find_element(:id, "password").send_keys("testwise") 22 | driver.find_element(:id, "remember_me").click 23 | driver.find_element(:id, "username").submit 24 | expect(driver.find_element(:tag_name, 'body').text).to include("Signed in") 25 | 26 | driver.find_element(:xpath, "//input[@name='tripType' and @value='oneway']").click 27 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "fromPort")).select_by(:text, "Sydney") 28 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "toPort")).select_by(:text, "New York") 29 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departDay")).select_by(:text, "02") 30 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departMonth")).select_by(:text, "May 2016") 31 | driver.find_element(:xpath, "//input[@value='Continue']").click 32 | 33 | # now on passenger page 34 | driver.find_element(:name, "passengerFirstName").send_keys("Bob") 35 | driver.find_element(:name, "passengerLastName").send_keys("Tester") 36 | driver.find_element(:name, "passengerLastName").submit 37 | 38 | # one payment page 39 | driver.find_element(:xpath, "//input[@name='card_type' and @value='master']").click 40 | driver.find_element(:name, "holder_name").send_keys("Bob the Tester") 41 | driver.find_element(:name, "card_number").send_keys("4242424242424242") 42 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_month")).select_by(:text, "04") 43 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_year")).select_by(:text, "2016") 44 | driver.find_element(:xpath, "//input[@value='Pay now']").click 45 | end 46 | end 47 | -------------------------------------------------------------------------------- /performance-mechanize/.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | 3 | -------------------------------------------------------------------------------- /performance-mechanize/buildwise_rspec_formatter.rb: -------------------------------------------------------------------------------- 1 | require 'ci/reporter/rspec' # version 1.0.0 2 | require 'fileutils' 3 | # Overrides default example failed behaviour to add saving screenshot to the reports dir. 4 | # 5 | # Prerequiste: the test script requires defines $browser 6 | # @driver = $driver = Selenium::WebDriver.for(browser_type) 7 | # 8 | # 9 | # Save to folder: ENV['CI_REPORTS'] || reports under current folder 10 | # File name: screenshot-(FULL Test Case Name).png 11 | # 12 | module CI::Reporter 13 | module RSpec3 14 | class Formatter 15 | 16 | def example_failed(notification) 17 | 18 | # In case we fail in before(:all) 19 | example_started(nil) if @suite.testcases.empty? 20 | 21 | failure = Failure.new(notification) 22 | 23 | current_spec.finish 24 | current_spec.name = notification.example.full_description 25 | current_spec.failures << failure 26 | 27 | if $driver && $driver.respond_to?("save_screenshot") # shall be set in test script 28 | reports_dir = ENV['CI_REPORTS'] || File.expand_path("#{Dir.getwd}/spec/reports") 29 | begin 30 | screenshots_dir = File.join(reports_dir, "screenshots") 31 | FileUtils.mkdir_p(screenshots_dir) unless File.exist?(screenshots_dir) 32 | 33 | spec_file_name = File.basename(notification.example.file_path) 34 | saved_to = File.join(screenshots_dir, spec_file_name) 35 | 36 | FileUtils.mkdir_p(saved_to) unless File.exist?(saved_to) 37 | example_name = notification.example.description 38 | # with folder, not using full_description 39 | $driver.save_screenshot(File.join(saved_to, "#{example_name}.png")) 40 | rescue => e 41 | # don't cause build to stop if errors happens 42 | fio = File.open( File.join(reports_dir, "error.log"), "a") 43 | fio.puts(e) 44 | fio.puts(e.backtrace) 45 | fio.flush 46 | fio.close 47 | end 48 | 49 | end 50 | 51 | end 52 | 53 | end 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /performance-mechanize/pages/abstract_page.rb: -------------------------------------------------------------------------------- 1 | # use utils in RWebSpec and better integration with TestWise 2 | require "#{File.dirname(__FILE__)}/../agileway_utils.rb" 3 | 4 | # This is the parent page for all page objects, for operations across all pages, define here 5 | class AbstractPage 6 | 7 | # Optional: 8 | # provide some general utility functions such as fail_safe { } 9 | # 10 | include AgilewayUtils 11 | 12 | # Optional: 13 | # TestWise Integration, supporting output text to TestWise Console with puts('message') to TestWise Console 14 | # 15 | if defined?(TestWiseRuntimeSupport) 16 | include TestWiseRuntimeSupport 17 | end 18 | 19 | 20 | def initialize(driver, text = "") 21 | page_delay 22 | @driver = driver 23 | # TODO check the page text contains the given text 24 | end 25 | 26 | 27 | def driver 28 | @driver 29 | end 30 | 31 | alias browser driver 32 | 33 | # add delay on landing a web page. the default implementation is using a setting in TestWise IDE 34 | def page_delay 35 | 36 | end 37 | 38 | end 39 | -------------------------------------------------------------------------------- /performance-mechanize/performancetesting-mechanize.tpr: -------------------------------------------------------------------------------- 1 | 2 | PerformanceTesting-Mechanize 3 | WebApp 4 | Chrome 5 | Selenium 6 | RSpec 7 | 8 | 9 | http://localhost 10 | 11 | 12 | https://travel.agileway.net 13 | 14 | 15 | 16 | features/tmp_syntax_check.feature 17 | 18 | load File.dirname(__FILE__) + '/../test_helper.rb' 19 | 20 | describe "{{ TEST_SUITE }}" do 21 | include TestHelper 22 | 23 | before(:all) do 24 | # browser_type, browser_options, site_url are defined in test_helper.rb 25 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 26 | driver.manage().window().resize_to(1280, 720) 27 | driver.get(site_url) 28 | end 29 | 30 | after(:all) do 31 | driver.quit unless debugging? 32 | end 33 | 34 | it "{{ TEST_CASE }}" do 35 | # driver.find_element(...) 36 | # expect(page_text).to include(..) 37 | end 38 | 39 | end 40 | 41 | 42 | 43 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 44 | 45 | class {{ PAGE_NAME }} < AbstractPage 46 | 47 | def initialize(driver) 48 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 49 | end 50 | 51 | # page functions here ... 52 | 53 | 54 | end 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /performance-mechanize/spec/flight_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + "/../test_helper.rb" 2 | 3 | describe "Performance Testing - Select Flight" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @vu_reports = {} 8 | @browser = ::Mechanize.new 9 | @browser.redirect_ok = true 10 | end 11 | 12 | after(:all) do 13 | end 14 | 15 | it "Select Flight" do 16 | log_time("Visit home page") { @browser.get(site_url) } # with redirect 17 | login_form = @browser.page.forms.first 18 | login_form.field_with(name: "username").value = "agileway" 19 | login_form.field_with(:name => "password").value = "testwise" 20 | log_time("Login") { @browser.submit(login_form, login_form.button_with(:name => "commit")) } 21 | expect(@browser.page.body).to include("Signed in!") 22 | 23 | flight_form = @browser.page.forms.first 24 | flight_form.radiobutton_with(:name => "tripType", :value => "oneway").check 25 | flight_form.field_with(:name => "fromPort").value = "Sydney" 26 | flight_form.field_with(:name => "toPort").value = "New York" 27 | log_time("Select Flight") { @browser.submit(flight_form) } 28 | expect(@browser.page.body).to include("oneway trip") 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /performance-mechanize/spec/login_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + "/../test_helper.rb" 2 | 3 | describe "Performance Testing - Login" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @vu_reports = {} 8 | @browser = ::Mechanize.new 9 | @browser.redirect_ok = true 10 | end 11 | 12 | after(:all) do 13 | #@browser.quit 14 | end 15 | 16 | it "Sign in and sign off" do 17 | log_time("Visit home page") { @browser.get(site_url) } # with redirect 18 | #File.open("/tmp/a.html", "w").write(page_resp.body) 19 | login_form = @browser.page.forms.first 20 | login_form.field_with(name: "username").value = "agileway" 21 | login_form.field_with(:name => "password").value = "testwise" 22 | log_time("Login") { @browser.submit(login_form, login_form.button_with(:name => "commit")) } 23 | expect(@browser.page.body).to include("Signed in!") 24 | log_time("Sign off") { @browser.page.link_with(:text => "Sign off").click } 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /performance-mechanize/spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # spec_helper.rb 2 | # 3 | # Different from test_helper.rb in up directory, this is a speical file to configure RSpec execution. 4 | # This one tell RSpec include stdout and stderr in test report. 5 | # 6 | 7 | # if use below, ci/rspec_reporter does not get output 8 | # only when run in BuildWise Agent, catpure output in result junit xml files 9 | if ENV["RUN_IN_BUILDWISE_AGENT"] == "true" 10 | RSpec.configure do |config| 11 | 12 | # register around filter that captures stdout and stderr 13 | config.around(:each) do |example| 14 | 15 | stdout, stderr = StringIO.new, StringIO.new 16 | $stdout, $stderr = stdout, stderr 17 | 18 | example.run 19 | 20 | example.metadata[:stdout] = $stdout.string 21 | example.metadata[:stderr] = $stderr.string 22 | 23 | $stdout = STDOUT 24 | $stderr = STDERR 25 | end 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /performance-selenium/.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | 3 | -------------------------------------------------------------------------------- /performance-selenium/buildwise_rspec_formatter.rb: -------------------------------------------------------------------------------- 1 | require 'ci/reporter/rspec' # version 1.0.0 2 | require 'fileutils' 3 | # Overrides default example failed behaviour to add saving screenshot to the reports dir. 4 | # 5 | # Prerequiste: the test script requires defines $browser 6 | # @driver = $driver = Selenium::WebDriver.for(browser_type) 7 | # 8 | # 9 | # Save to folder: ENV['CI_REPORTS'] || reports under current folder 10 | # File name: screenshot-(FULL Test Case Name).png 11 | # 12 | module CI::Reporter 13 | module RSpec3 14 | class Formatter 15 | 16 | def example_failed(notification) 17 | 18 | # In case we fail in before(:all) 19 | example_started(nil) if @suite.testcases.empty? 20 | 21 | failure = Failure.new(notification) 22 | 23 | current_spec.finish 24 | current_spec.name = notification.example.full_description 25 | current_spec.failures << failure 26 | 27 | if $driver && $driver.respond_to?("save_screenshot") # shall be set in test script 28 | reports_dir = ENV['CI_REPORTS'] || File.expand_path("#{Dir.getwd}/spec/reports") 29 | begin 30 | screenshots_dir = File.join(reports_dir, "screenshots") 31 | FileUtils.mkdir_p(screenshots_dir) unless File.exist?(screenshots_dir) 32 | 33 | spec_file_name = File.basename(notification.example.file_path) 34 | saved_to = File.join(screenshots_dir, spec_file_name) 35 | 36 | FileUtils.mkdir_p(saved_to) unless File.exist?(saved_to) 37 | example_name = notification.example.description 38 | # with folder, not using full_description 39 | $driver.save_screenshot(File.join(saved_to, "#{example_name}.png")) 40 | rescue => e 41 | # don't cause build to stop if errors happens 42 | fio = File.open( File.join(reports_dir, "error.log"), "a") 43 | fio.puts(e) 44 | fio.puts(e.backtrace) 45 | fio.flush 46 | fio.close 47 | end 48 | 49 | end 50 | 51 | end 52 | 53 | end 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /performance-selenium/pages/abstract_page.rb: -------------------------------------------------------------------------------- 1 | # use utils in RWebSpec and better integration with TestWise 2 | require "#{File.dirname(__FILE__)}/../agileway_utils.rb" 3 | 4 | # This is the parent page for all page objects, for operations across all pages, define here 5 | class AbstractPage 6 | 7 | # Optional: 8 | # provide some general utility functions such as fail_safe { } 9 | # 10 | include AgilewayUtils 11 | 12 | # Optional: 13 | # TestWise Integration, supporting output text to TestWise Console with puts('message') to TestWise Console 14 | # 15 | if defined?(TestWiseRuntimeSupport) 16 | include TestWiseRuntimeSupport 17 | end 18 | 19 | 20 | def initialize(driver, text = "") 21 | page_delay 22 | @driver = driver 23 | # TODO check the page text contains the given text 24 | end 25 | 26 | 27 | def driver 28 | @driver 29 | end 30 | 31 | alias browser driver 32 | 33 | # add delay on landing a web page. the default implementation is using a setting in TestWise IDE 34 | def page_delay 35 | 36 | end 37 | 38 | end 39 | -------------------------------------------------------------------------------- /performance-selenium/performance-selenium.tpr: -------------------------------------------------------------------------------- 1 | 2 | first-load-test 3 | WebApp 4 | Chrome 5 | Selenium 6 | RSpec 7 | 8 | 9 | http://travel.agileway.net 10 | 11 | 12 | 13 | features/tmp_syntax_check.feature 14 | 15 | load File.dirname(__FILE__) + '/../test_helper.rb' 16 | load File.dirname(__FILE__) + '/../load_test_helper.rb' 17 | 18 | describe "{{ TEST_SUITE }}" do 19 | include TestHelper 20 | include LoadTestHelper 21 | 22 | before(:all) do 23 | # browser_type, browser_options, site_url are defined in test_helper.rb 24 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 25 | driver.manage().window().resize_to(1280, 720) 26 | log_time("Visit Home Page") { driver.get(site_url) } 27 | end 28 | 29 | after(:all) do 30 | dump_timings 31 | driver.quit unless debugging? 32 | end 33 | 34 | it "{{ TEST_CASE }}" do 35 | load_test_repeat.times do 36 | # driver.find_element(...) 37 | # expect(page_text).to include(..) 38 | end 39 | end 40 | 41 | end 42 | 43 | 44 | 45 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 46 | 47 | class {{ PAGE_NAME }} < AbstractPage 48 | 49 | def initialize(driver) 50 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 51 | end 52 | 53 | # page functions here ... 54 | 55 | 56 | end 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /performance-selenium/spec/login_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | load File.dirname(__FILE__) + '/../load_test_helper.rb' 3 | 4 | describe "Load - User Authentication" do 5 | include TestHelper 6 | include LoadTestHelper 7 | 8 | before(:all) do 9 | # browser_type, browser_options, site_url are defined in test_helper.rb 10 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 11 | driver.manage().window().resize_to(1280, 720) 12 | log_time("Visit Home Page") { driver.get(site_url) } 13 | end 14 | 15 | after(:all) do 16 | dump_timings 17 | driver.quit unless debugging? 18 | end 19 | 20 | it "Login" do 21 | load_test_repeat.times do 22 | driver.find_element(:id, "username").send_keys("agileway") 23 | driver.find_element(:id, "password").send_keys("testwise") 24 | log_time('Login') { driver.find_element(:name, "commit").click } 25 | expect(driver.find_element(:id, "flash_notice").text).to eq("Signed in!") 26 | log_time('Sign off') { driver.find_element(:link_text, "Sign off").click } 27 | end 28 | end 29 | 30 | end 31 | -------------------------------------------------------------------------------- /performance-selenium/spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # spec_helper.rb 2 | # 3 | # Different from test_helper.rb in up directory, this is a speical file to configure RSpec execution. 4 | # This one tell RSpec include stdout and stderr in test report. 5 | # 6 | 7 | # if use below, ci/rspec_reporter does not get output 8 | # only when run in BuildWise Agent, catpure output in result junit xml files 9 | if ENV["RUN_IN_BUILDWISE_AGENT"] == "true" 10 | RSpec.configure do |config| 11 | 12 | # register around filter that captures stdout and stderr 13 | config.around(:each) do |example| 14 | 15 | stdout, stderr = StringIO.new, StringIO.new 16 | $stdout, $stderr = stdout, stderr 17 | 18 | example.run 19 | 20 | example.metadata[:stdout] = $stdout.string 21 | example.metadata[:stderr] = $stderr.string 22 | 23 | $stdout = STDOUT 24 | $stderr = STDERR 25 | end 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /playwright-mocha-chrome/agiletravel-playwright-mocha.tpr: -------------------------------------------------------------------------------- 1 | 2 | agiletravel-selenium-webdriver.tpr 3 | Chrome 4 | Selenium 5 | Mocha 6 | 7 | 8 | http://agiletravel.herokuapp.com 9 | 10 | 11 | http://test.agiletravel.macmini 12 | 13 | 14 | https://travel.agileway.net 15 | 16 | 17 | http://ci1.agiletravel.dev 18 | 19 | 20 | http://ci2.agiletravel.dev 21 | 22 | 23 | node_modules 24 | 25 | load File.dirname(__FILE__) + '/../test_helper.rb' 26 | 27 | describe "{{ TEST_SUITE }}" do 28 | include TestHelper 29 | 30 | before(:all) do 31 | @browser = $browser = Selenium::WebDriver.for(browser_type, browser_options) 32 | @browser.get(site_url) 33 | end 34 | 35 | after(:all) do 36 | @browser.quit unless debugging? 37 | end 38 | 39 | it "{{ TEST_CASE }}" do 40 | # Test Steps go here 41 | end 42 | 43 | end 44 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 45 | 46 | class {{ PAGE_NAME }} < AbstractPage 47 | 48 | def initialize(driver) 49 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 50 | end 51 | 52 | # page functions here ... 53 | end 54 | 55 | -------------------------------------------------------------------------------- /playwright-mocha-chrome/install-lib.cmd: -------------------------------------------------------------------------------- 1 | npm install -U mocha-junit-reporter 2 | -------------------------------------------------------------------------------- /playwright-mocha-chrome/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "selenium-webdriver-nodejs-mocha", 3 | "version": "1.5.1", 4 | "description": "Sample tests for Selenium WebDriver Node.js v4", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Zhimin Zhan", 10 | "license": "ISC", 11 | "dependencies": { 12 | "jasmine": "^3.8.0", 13 | "jasmine-xml-reporter": "^1.2.1", 14 | "playwright": "^1.18.1", 15 | "selenium-webdriver": "^4.0.0-beta.4" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /playwright-mocha-chrome/pages/abstract_page.js: -------------------------------------------------------------------------------- 1 | 2 | class AbstractPage { 3 | 4 | constructor(driver) { 5 | this.driver = driver; 6 | } 7 | 8 | }; 9 | 10 | 11 | module.exports = AbstractPage; 12 | -------------------------------------------------------------------------------- /playwright-mocha-chrome/pages/flight_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | class FlightPage extends AbstractPage { 4 | 5 | constructor(driver) { 6 | super(driver); 7 | } 8 | 9 | async selectTripType(trip_type) { 10 | const radios = await this.driver.$$("input[name=tripType]"); 11 | if (trip_type == "oneway") { 12 | await radios[1].check(); 13 | } else { 14 | await radios[0].check(); 15 | } 16 | } 17 | 18 | async selectDepartFrom(city) { 19 | await this.driver.selectOption("select[name='fromPort']", city); 20 | } 21 | 22 | async selectArriveAt(city) { 23 | await this.driver.selectOption("select[name='toPort']", city); 24 | } 25 | 26 | async selectDepartDay(day) { 27 | await this.driver.selectOption("select[name='departDay']", day); 28 | } 29 | 30 | async selectDepartMonth(month_year) { 31 | await this.driver.selectOption("#departMonth", month_year); 32 | } 33 | 34 | async selectReturnDay(day) { 35 | await this.driver.selectOption("select[name='returnDay']", day); 36 | 37 | } 38 | 39 | async selectReturnMonth(month_year) { 40 | await this.driver.selectOption("#returnMonth", month_year); 41 | } 42 | 43 | async clickContinue() { 44 | await this.driver.click("input:has-text('Continue')"); 45 | } 46 | }; 47 | 48 | module.exports = FlightPage; 49 | -------------------------------------------------------------------------------- /playwright-mocha-chrome/pages/passenger_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class PassengerPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async enterFirstName(first_name) { 14 | await this.driver.findElement(By.name("passengerFirstName")).sendKeys(first_name); 15 | } 16 | 17 | async enterLastName(last_name) { 18 | await this.driver.findElement(By.name("passengerLastName")).sendKeys(last_name); 19 | } 20 | 21 | async clickNext() { 22 | await this.driver.findElement(By.xpath("//input[@value='Next']")).click(); 23 | } 24 | }; 25 | 26 | module.exports = PassengerPage; 27 | -------------------------------------------------------------------------------- /playwright-mocha-chrome/pages/payment_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class PaymentPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async select_visa() { 14 | await this.driver.findElement(By.xpath("//input[@name='card_type' and @value='visa']")).click(); 15 | } 16 | 17 | async enterCardNumber(card_no) { 18 | await this.driver.findElement(By.name("card_number")).sendKeys(card_no); 19 | } 20 | 21 | async clickPayNow() { 22 | await this.driver.findElement(By.xpath("//input[@value='Pay now']")).click() 23 | } 24 | 25 | }; 26 | 27 | module.exports = PaymentPage; 28 | -------------------------------------------------------------------------------- /playwright-mocha-chrome/results/01_login_spec.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /playwright-mocha-chrome/tests/01_login_spec.js: -------------------------------------------------------------------------------- 1 | const { test, expect } = require('@playwright/test'); 2 | const { chromium } = require('playwright'); 3 | var assert = require('assert'); 4 | 5 | const timeOut = 15000; 6 | let driver, page, browser, context 7 | 8 | String.prototype.contains = function(it) { 9 | return this.indexOf(it) != -1; 10 | }; 11 | 12 | var helper = require('../test_helper'); 13 | 14 | // An example in below: var FlightPage = require('../pages/flight_page.js') 15 | // BEGIN: import pages 16 | // END: import pages 17 | describe('User Authentication', function() { 18 | 19 | before(async function() { 20 | browser = await chromium.launch({ 21 | headless: false, 22 | executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', 23 | }); 24 | context = await browser.newContext(); 25 | driver = page = await context.newPage(); 26 | }); 27 | 28 | beforeEach(async function() { 29 | await driver.goto('https://travel.agileway.net'); 30 | }); 31 | 32 | after(async function() { 33 | if (!helper.is_debugging()) { 34 | browser.close(); 35 | } 36 | }); 37 | 38 | it('[1,2] Invalid user', async function() { 39 | await driver.title().then(function(the_title) { 40 | // console.log(the_title) 41 | }) 42 | await driver.fill("#username", "agileway") 43 | await driver.fill("#password", "playwright") 44 | await driver.click("input:has-text('Sign in')") 45 | await driver.textContent("body").then(function(body_text) { 46 | //console.log(body_text) 47 | assert(body_text.contains("Invalid email or password")) 48 | }) 49 | }); 50 | 51 | it('User can login successfully', async function() { 52 | await driver.fill("#username", "agileway") 53 | await driver.fill("#password", "testwise") 54 | await driver.click("input:has-text('Sign in')") 55 | await driver.textContent("body").then(function(body_text) { 56 | //console.log(body_text) 57 | assert(body_text.contains("Signed in")) 58 | }) 59 | await driver.click("a:has-text('Sign off')") 60 | }); 61 | 62 | }); 63 | -------------------------------------------------------------------------------- /playwright-mocha/ReadMe.md: -------------------------------------------------------------------------------- 1 | # Installation 2 | npm i -D @playwright/test 3 | npx playwright install 4 | npm i -g playwright 5 | ***Note: am experiencing issues when using global (-g) flag with @playwright/test install. DON'T USE GLOBAL INSTALL*** 6 | 7 | # Running Tests on Command Line 8 | ## Options 9 | ### Headed mode 10 | --headed 11 | 12 | ### Non Parallel 13 | --workers=1 14 | 15 | ## Run all tests in `tests` folder 16 | npx playwright test 17 | 18 | ## Run specific file/s 19 | npx playwright test tests/01_login.spec.js tests/02_flight.spec.js 20 | 21 | ## Run test in file 22 | npx playwright test -g "login OK" 23 | npx playwright test tests/01_login.spec.js:3 24 | 25 | # Generate XML 26 | Playwright reporting. 27 | 28 | ### JUnit Reporter 29 | On bash: 30 | PLAYWRIGHT_JUNIT_OUTPUT_NAME=results.xml npx playwright test --reporter=junit 31 | 32 | On playwright config file: 33 | // playwright.config.js 34 | // @ts-check 35 | 36 | /** @type {import('@playwright/test').PlaywrightTestConfig} */ 37 | const config = { 38 | reporter: [ ['junit', { outputFile: 'results.xml' }] ], 39 | }; 40 | 41 | module.exports = config; 42 | 43 | 44 | # Jest 45 | ## Installation 46 | npm install --save-dev jest 47 | 48 | ## Running tests 49 | npm run test -------------------------------------------------------------------------------- /playwright-mocha/agiletravel-playwright-mocha.tpr: -------------------------------------------------------------------------------- 1 | 2 | agiletravel-selenium-webdriver.tpr 3 | Chrome 4 | Selenium 5 | Mocha 6 | 7 | 8 | http://agiletravel.herokuapp.com 9 | 10 | 11 | http://test.agiletravel.macmini 12 | 13 | 14 | https://travel.agileway.net 15 | 16 | 17 | http://ci1.agiletravel.dev 18 | 19 | 20 | http://ci2.agiletravel.dev 21 | 22 | 23 | node_modules 24 | 25 | load File.dirname(__FILE__) + '/../test_helper.rb' 26 | 27 | describe "{{ TEST_SUITE }}" do 28 | include TestHelper 29 | 30 | before(:all) do 31 | @browser = $browser = Selenium::WebDriver.for(browser_type, browser_options) 32 | @browser.get(site_url) 33 | end 34 | 35 | after(:all) do 36 | @browser.quit unless debugging? 37 | end 38 | 39 | it "{{ TEST_CASE }}" do 40 | # Test Steps go here 41 | end 42 | 43 | end 44 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 45 | 46 | class {{ PAGE_NAME }} < AbstractPage 47 | 48 | def initialize(driver) 49 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 50 | end 51 | 52 | # page functions here ... 53 | end 54 | 55 | -------------------------------------------------------------------------------- /playwright-mocha/install-lib.cmd: -------------------------------------------------------------------------------- 1 | npm install -U mocha-junit-reporter 2 | -------------------------------------------------------------------------------- /playwright-mocha/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "selenium-webdriver-nodejs-mocha", 3 | "version": "1.5.1", 4 | "description": "Sample tests for Selenium WebDriver Node.js v4", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Zhimin Zhan", 10 | "license": "ISC", 11 | "dependencies": { 12 | "jasmine": "^3.8.0", 13 | "jasmine-xml-reporter": "^1.2.1", 14 | "playwright": "^1.18.1", 15 | "selenium-webdriver": "^4.0.0-beta.4" 16 | }, 17 | "devDependencies": { 18 | "@playwright/test": "^1.18.1", 19 | "jest": "^27.4.7" 20 | }, 21 | "scripts": { 22 | "test": "jest" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /playwright-mocha/pages/abstract_page.js: -------------------------------------------------------------------------------- 1 | 2 | class AbstractPage { 3 | 4 | constructor(driver) { 5 | this.driver = driver; 6 | } 7 | 8 | }; 9 | 10 | 11 | module.exports = AbstractPage; 12 | -------------------------------------------------------------------------------- /playwright-mocha/pages/flight_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | class FlightPage extends AbstractPage { 4 | 5 | constructor(driver) { 6 | super(driver); 7 | } 8 | 9 | async selectTripType(trip_type) { 10 | const radios = await this.driver.$$("input[name=tripType]"); 11 | if (trip_type == "oneway") { 12 | await radios[1].check(); 13 | } else { 14 | await radios[0].check(); 15 | } 16 | } 17 | 18 | async selectDepartFrom(city) { 19 | await this.driver.selectOption("select[name='fromPort']", city); 20 | } 21 | 22 | async selectArriveAt(city) { 23 | await this.driver.selectOption("select[name='toPort']", city); 24 | } 25 | 26 | async selectDepartDay(day) { 27 | await this.driver.selectOption("select[name='departDay']", day); 28 | } 29 | 30 | async selectDepartMonth(month_year) { 31 | await this.driver.selectOption("#departMonth", month_year); 32 | } 33 | 34 | async selectReturnDay(day) { 35 | await this.driver.selectOption("select[name='returnDay']", day); 36 | 37 | } 38 | 39 | async selectReturnMonth(month_year) { 40 | await this.driver.selectOption("#returnMonth", month_year); 41 | } 42 | 43 | async clickContinue() { 44 | await this.driver.click("input:has-text('Continue')"); 45 | } 46 | }; 47 | 48 | module.exports = FlightPage; 49 | -------------------------------------------------------------------------------- /playwright-mocha/pages/passenger_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class PassengerPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async enterFirstName(first_name) { 14 | await this.driver.findElement(By.name("passengerFirstName")).sendKeys(first_name); 15 | } 16 | 17 | async enterLastName(last_name) { 18 | await this.driver.findElement(By.name("passengerLastName")).sendKeys(last_name); 19 | } 20 | 21 | async clickNext() { 22 | await this.driver.findElement(By.xpath("//input[@value='Next']")).click(); 23 | } 24 | }; 25 | 26 | module.exports = PassengerPage; 27 | -------------------------------------------------------------------------------- /playwright-mocha/pages/payment_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class PaymentPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async select_visa() { 14 | await this.driver.findElement(By.xpath("//input[@name='card_type' and @value='visa']")).click(); 15 | } 16 | 17 | async enterCardNumber(card_no) { 18 | await this.driver.findElement(By.name("card_number")).sendKeys(card_no); 19 | } 20 | 21 | async clickPayNow() { 22 | await this.driver.findElement(By.xpath("//input[@value='Pay now']")).click() 23 | } 24 | 25 | }; 26 | 27 | module.exports = PaymentPage; 28 | -------------------------------------------------------------------------------- /pre-refactoring/Rakefile: -------------------------------------------------------------------------------- 1 | # You need Ruby (Rake, RWebSpec, ci_reporter gems installed) 2 | # Simplest way on Windows is to install RubyShell (http://testwisely.com/downloads) 3 | 4 | require 'rubygems' 5 | gem 'ci_reporter' 6 | gem 'rspec' 7 | require 'rspec/core/rake_task' 8 | require 'ci/reporter/rake/rspec' # use this if you're using RSpec 9 | 10 | task :default => ["go"] 11 | 12 | # List tests you want to exclude 13 | # 14 | def excluded_test_files 15 | ["ignore_spec.rb", "bad_spec.rb"] 16 | end 17 | 18 | desc "run all tests in this folder" 19 | RSpec::Core::RakeTask.new("go") do |t| 20 | test_files = Dir.glob("*_spec.rb") + Dir.glob("*_test.rb") - excluded_test_files 21 | t.pattern = [test_files] 22 | t.warning = false 23 | end 24 | -------------------------------------------------------------------------------- /pre-refactoring/pages/abstract_page.rb: -------------------------------------------------------------------------------- 1 | # use utils in RWebSpec and better integration with TestWise 2 | require "#{File.dirname(__FILE__)}/../agileway_utils.rb" 3 | 4 | # This is the parent page for all page objects, for operations across all pages, define here 5 | class AbstractPage 6 | 7 | 8 | # If want to use utility methods such as fail_safe { }, uncomment the line below 9 | # 10 | include AgilewayUtils 11 | 12 | # If want to use debug('message') to TestWise Console, uncomment the line below 13 | # 14 | if defined?(TestWiseRuntimeSupport) 15 | ::TestWise::Runtime.load_webdriver_support # for selenium webdriver support 16 | end 17 | 18 | 19 | def initialize(driver, text = "") 20 | @browser = driver 21 | # TODO check the page text contains the given text 22 | end 23 | 24 | 25 | def browser 26 | @browser 27 | end 28 | 29 | def driver 30 | @browser 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /pre-refactoring/pre-refactoring-rspec.tpr: -------------------------------------------------------------------------------- 1 | 2 | agiletravel-ui-tests.tpr 3 | WinApp 4 | Chrome 5 | Selenium 6 | RSpec 7 | 8 | 9 | http://travel.agileway.net 10 | 11 | 12 | http://agiletravel.herokuapp.com 13 | 14 | 15 | 16 | 17 | load File.dirname(__FILE__) + '/../test_helper.rb' 18 | 19 | describe "{{ TEST_SUITE }}" do 20 | include TestHelper 21 | 22 | before(:all) do 23 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 24 | @driver.get(site_url) 25 | end 26 | 27 | after(:all) do 28 | @driver.quit unless debugging? 29 | end 30 | 31 | it "{{ TEST_CASE }}" do 32 | # Test Steps go here 33 | end 34 | 35 | end 36 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 37 | 38 | class {{ PAGE_NAME }} < AbstractPage 39 | 40 | def initialize(driver) 41 | super(driver, "") # &lt;= TEXT UNIQUE TO THIS PAGE 42 | end 43 | 44 | # page functions here ... 45 | 46 | end 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /pre-refactoring/spec/login_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "User Login" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @driver = $browser = Selenium::WebDriver.for(browser_type, browser_options) 8 | @driver.navigate.to(site_url) # 9 | end 10 | 11 | after(:all) do 12 | @driver.quit unless debugging? 13 | end 14 | 15 | it "User can sign in OK" do 16 | driver.find_element(:id, "username").send_keys("agileway") 17 | driver.find_element(:id, "password").send_keys("testwise") 18 | driver.find_element(:xpath,"//input[@value='Sign in']").click 19 | expect(driver.find_element(:tag_name, "body").text).to include("Welcome agileway") 20 | driver.find_element(:link_text, "Sign off").click 21 | end 22 | 23 | it "User failed to sign in due to invalid password" do 24 | driver.find_element(:id, "username").send_keys("agileway") 25 | driver.find_element(:id, "password").send_keys("badpass") 26 | driver.find_element(:xpath,"//input[@value='Sign in']").click 27 | expect(driver.find_element(:tag_name, "body").text).to include("Invalid email or password") 28 | end 29 | 30 | end 31 | -------------------------------------------------------------------------------- /pre-refactoring/spec/passenger_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Passenger" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @driver = $browser = Selenium::WebDriver.for(browser_type, browser_options) 8 | @driver.navigate.to(site_url) # you may 9 | 10 | driver.find_element(:id, "username").send_keys("agileway") 11 | driver.find_element(:id, "password").send_keys("testwise") 12 | driver.find_element(:xpath,"//input[@value='Sign in']").click 13 | end 14 | 15 | before(:each) do 16 | end 17 | 18 | after(:all) do 19 | fail_safe { @driver.quit } unless debugging? 20 | end 21 | 22 | 23 | it "Can enter passenger details" do 24 | driver.find_element(:xpath, "//input[@name='tripType' and @value='oneway']").click 25 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "fromPort")).select_by(:text, "New York") 26 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "toPort")).select_by(:text, "Sydney") 27 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departDay")).select_by(:text, "04") 28 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departMonth")).select_by(:text, "March 2016") 29 | driver.find_element(:xpath,"//input[@value='Continue']").click 30 | 31 | # now on passenger page 32 | driver.find_element(:xpath,"//input[@value='Next']").click 33 | expect(driver.page_source).to include("Must provide last name") 34 | driver.find_element(:name, "passengerFirstName").send_keys("Bob") 35 | driver.find_element(:name, "passengerLastName").send_keys("Tester") 36 | driver.find_element(:xpath,"//input[@value='Next']").click 37 | 38 | expect(driver.find_element(:name, "holder_name")["value"]).to eq("Bob Tester") 39 | end 40 | 41 | end 42 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/ReadMe.txt: -------------------------------------------------------------------------------- 1 | To run a test from command line 2 | 3 | cd selenium-webdriver-cucumber 4 | cucumber features/login.feature 5 | 6 | ! don't `cd features; cucumber login.feature` which won't find step definitions -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/config/cucumber.yml: -------------------------------------------------------------------------------- 1 | default: --publish-quiet -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/01_login.feature: -------------------------------------------------------------------------------- 1 | @feature 2 | Feature: User Authentication 3 | As a registered user 4 | I can log in 5 | 6 | Scenario: Deny access due to invalid password 7 | Given I am on the home page 8 | When enter user name "agileway" and password "badpass" 9 | And click "Sign in" button 10 | Then I should see an log in error message 11 | 12 | Scenario: Registered user can log in sucessfully 13 | Given I am on the home page 14 | When enter user name "agileway" and password "testwise" 15 | And click "Sign in" button 16 | Then I am logged in 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/02_flight.feature: -------------------------------------------------------------------------------- 1 | @feature 2 | Feature: Select Flights 3 | As a regiestered user 4 | I can select flights 5 | 6 | Scenario: Oneway Trip 7 | Given I am signed in as "agileway" 8 | When select oneway trip 9 | And select depart from "Sydney" to "New York" on "07" of "May 2021" 10 | And click "Continue" 11 | Then I should see "2021-05-07", "New York" and "Sydney" on next page 12 | 13 | Scenario: Return Trip 14 | Given I am signed in as "agileway" 15 | When select return trip 16 | And select depart from "Sydney" to "New York" on "07" of "May 2021" 17 | And return on "12" of "June 2021" 18 | And click "Continue" 19 | Then I should see "2021-05-07", "New York" and "Sydney" on next page 20 | And I should see "2021-06-12", "Sydney" and "New York" on next page 21 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/03_passenger.feature: -------------------------------------------------------------------------------- 1 | @feature 2 | Feature: Passenger 3 | As a reigstered user 4 | I can enter passenger details 5 | 6 | Scenario: Passenger Details 7 | Given I am signed in as "agileway" 8 | And select oneway trip 9 | And select depart from "Sydney" to "New York" on "07" of "May 2021" 10 | And click "Continue" 11 | When I enter "Bob" and "Tester" as passenger name 12 | And click 'Next' on the passenger page 13 | Then I should see "Bob Tester" shown in card holder name on the next payment page 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/04_payment.feature: -------------------------------------------------------------------------------- 1 | @feature 2 | Feature: Payment 3 | As a reigstered user 4 | I can pay the flight using my credit card 5 | 6 | Scenario: Passenger Details 7 | Given I am signed in as "agileway" 8 | And select oneway trip 9 | And select depart from "Sydney" to "New York" on "07" of "May 2021" 10 | When click "Continue" 11 | And I enter "Bob" and "Tester" as passenger name 12 | When click 'Next' on the passenger page 13 | And select 'Visa' card 14 | And enter card holder name "Bob the Tester" 15 | And enter card number "4242424242424242" 16 | And select card expiry date "07" of "2021" 17 | When I click 'Pay now' 18 | Then I should see 'Booking Number' in confirmation section 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/05_login_outline.feature: -------------------------------------------------------------------------------- 1 | @feature 2 | Feature: User Authentication Outline 3 | As a reigstered user 4 | I can log in 5 | 6 | Scenario Outline: Registered user with different role can log in sucessfully 7 | Given I am on the home page 8 | When enter user name "" and password "" 9 | And click "Sign in" button 10 | Then I am logged in 11 | And I sign off 12 | Examples: 13 | | username | password | 14 | | admin | secret | 15 | | agileway | testwise | 16 | 17 | 18 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/login.feature: -------------------------------------------------------------------------------- 1 | Feature: FEATURE 2 | 3 | Scenario: SCENARIO 4 | When STEP_1 5 | Then STEP_2 6 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/step_definitions/flight_steps.rb: -------------------------------------------------------------------------------- 1 | # Enter your step denfitions below 2 | 3 | # Once you created the step skeleton (right click from feature file), 4 | # add test steps like below: 5 | # driver.find_element(:text, "Start here").click 6 | # Then perform refactorings to extract the steps into Page Objects. 7 | 8 | 9 | 10 | Given('I am signed in as {string}') do |user| 11 | begin 12 | driver.find_element(:link, "Login") 13 | sign_in("agileway", "testwise") 14 | rescue 15 | # already logged in 16 | driver.get(site_url) 17 | end 18 | @flight_page = FlightPage.new(driver) 19 | end 20 | 21 | When('select oneway trip') do 22 | @flight_page.select_trip_type("oneway") 23 | end 24 | 25 | 26 | When('select return trip') do 27 | @flight_page.select_trip_type("return") 28 | end 29 | 30 | 31 | When('select depart from {string} to {string} on {string} of {string}') do |from, to, day, month_year| 32 | @flight_page.select_depart_from(from) 33 | @flight_page.select_arrive_at(to) 34 | @flight_page.select_depart_day(day) 35 | @flight_page.select_depart_month(month_year) 36 | end 37 | 38 | 39 | When('click {string}') do |string| 40 | sleep 0.5 41 | @flight_page.click_continue 42 | end 43 | 44 | Then('I should see {string}, {string} and {string} on next page') do |text1, text2, text3| 45 | the_page_source = driver.page_source 46 | expect(the_page_source).to include(text1) 47 | expect(the_page_source).to include(text2) 48 | expect(the_page_source).to include(text3) 49 | end 50 | 51 | When('return on {string} of {string}') do |day, month| 52 | @flight_page.select_return_date(day, month) 53 | end 54 | 55 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/step_definitions/login_steps.rb: -------------------------------------------------------------------------------- 1 | # Enter your step denfitions below 2 | 3 | # Once you created the step skeleton (right click from feature file), 4 | # add test steps like below: 5 | # driver.find_element(:text, "Start here").click 6 | # Then perform refactorings to extract the steps into Page Objects. 7 | 8 | 9 | 10 | Given('I am on the home page') do 11 | driver.navigate.to($BASE_URL ) 12 | end 13 | 14 | When('enter user name {string} and password {string}') do |user, pass| 15 | driver.find_element(:id, "username").send_keys(user) 16 | driver.find_element(:id, "password").send_keys(pass) 17 | end 18 | 19 | When('click {string} button') do |button| 20 | driver.find_element(:xpath,"//input[@value=\"#{button}\"]").click 21 | end 22 | 23 | Then('I should see an log in error message') do 24 | expect(driver.page_source).to include("Invalid email or password") 25 | end 26 | 27 | Then('I am logged in') do 28 | expect(driver.page_source).to include("Signed in!") 29 | end 30 | 31 | Then('I sign off') do 32 | driver.find_element(:link_text, "Sign off").click 33 | end -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/step_definitions/passenger_steps.rb: -------------------------------------------------------------------------------- 1 | # Enter your step denfitions below 2 | 3 | # Once you created the step skeleton (right click from feature file), 4 | # add test steps like below: 5 | # driver.find_element(:text, "Start here").click 6 | # Then perform refactorings to extract the steps into Page Objects. 7 | 8 | When('I enter {string} and {string} as passenger name') do |first_name, last_name| 9 | sleep 1 10 | @passenger_page = PassengerPage.new(driver) 11 | @passenger_page.enter_first_name(first_name) 12 | @passenger_page.enter_last_name(last_name) 13 | end 14 | 15 | Then('I should see {string} shown in card holder name on the next payment page') do |name| 16 | sleep 1 17 | expect(driver.find_element(:name, "holder_name").attribute("value")).to eq(name) 18 | end 19 | 20 | When('click {string} on the passenger page') do |button_name| 21 | @passenger_page.click_next 22 | end 23 | 24 | 25 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/step_definitions/payment_steps.rb: -------------------------------------------------------------------------------- 1 | # Enter your step denfitions below 2 | 3 | # Once you created the step skeleton (right click from feature file), 4 | # add test steps like below: 5 | # @browser.find_element(:text, "Start here").click 6 | # Then perform refactorings to extract the steps into Page Objects. 7 | 8 | 9 | 10 | 11 | When('select {string} card') do |card_type| 12 | @payment_page = PaymentPage.new(driver) 13 | @payment_page.select_card_type(card_type.downcase) 14 | end 15 | 16 | When('enter card holder name {string}') do |holder| 17 | @payment_page.enter_card_number(holder) 18 | end 19 | 20 | When('enter card number {string}') do |card_number| 21 | @payment_page.enter_card_number(card_number) 22 | end 23 | 24 | When('select card expiry date {string} of {string}') do |month, year| 25 | @payment_page.select_expiry_month(month) 26 | @payment_page.select_expiry_year(year) 27 | end 28 | 29 | When('I click {string}') do |button_name| 30 | @payment_page.click_pay_now 31 | end 32 | 33 | Then('I should see {string} in confirmation section') do |booking_number| 34 | #AJAX 35 | wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds 36 | wait.until{ driver.find_element(:id => "booking_number").text.to_i > 100 } 37 | puts "Booking number is " + driver.find_element(:id => "booking_number").text 38 | end 39 | 40 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/support/hooks.rb: -------------------------------------------------------------------------------- 1 | # Cucumber hooks 2 | # See https://www.relishapp.com/cucumber/cucumber/docs/writing-support-code 3 | 4 | # Example hoook after each scenario 5 | After do |scenario| 6 | if scenario.failed? 7 | # puts "* Scenario failed: " 8 | end 9 | end 10 | 11 | =begin 12 | Before('@feature') do 13 | # do something useful 14 | puts "before feature" 15 | end 16 | 17 | After('@feature') do 18 | # do something useful 19 | puts "after feature: #{driver}" 20 | driver.close if driver 21 | end 22 | =end -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/support/step_helper.rb: -------------------------------------------------------------------------------- 1 | 2 | if ENV["TESTWISE_RUNTIME_DIR"] && !ENV["TESTWISE_RUNTIME_DIR"].strip.empty? && Dir.exist?(ENV["TESTWISE_RUNTIME_DIR"]) 3 | require File.join(ENV["TESTWISE_RUNTIME_DIR"], "testwise_listener.rb") 4 | require File.join(ENV["TESTWISE_RUNTIME_DIR"], "testwise_runtime_support.rb") 5 | end 6 | 7 | module StepHelper 8 | 9 | if defined?(TestWiseRuntimeSupport) 10 | include TestWiseRuntimeSupport 11 | end 12 | 13 | def driver 14 | @driver ||= Selenium::WebDriver.for(browser_type, browser_options) 15 | end 16 | 17 | ## Helper methods 18 | # 19 | 20 | def goto_home_page 21 | home_url = site_url 22 | home_url += "/index.html" if site_url.include?("file://") 23 | driver.get(home_url ) 24 | end 25 | 26 | # if your applicant supports reset datbase 27 | def reset_database 28 | driver.navigate.to("#{site_url()}/reset") 29 | goto_home_page 30 | end 31 | 32 | def site_url(default = $BASE_URL) 33 | the_site_url = $TESTWISE_PROJECT_BASE_URL || ENV["BASE_URL"] 34 | if the_site_url.nil? || the_site_url.empty? 35 | the_site_url = default 36 | end 37 | return the_site_url 38 | end 39 | 40 | def sign_in(user, pass) 41 | driver.find_element(:id, "username").send_keys(user) 42 | driver.find_element(:id, "password").send_keys(pass) 43 | driver.find_element(:xpath, "//input[@value=\"Sign in\"]").click 44 | end 45 | 46 | def sign_off 47 | driver.find_element(:link_text, "Sign off").click 48 | end 49 | 50 | end 51 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/features/support/testwise_formatter_loader.rb: -------------------------------------------------------------------------------- 1 | # Cucumber changed, if use --require, then steps/env not loaded 2 | # --help for details 3 | if ENV["TESTWISE_CUCUMBER_FORMATTER"] 4 | require "#{ENV['TESTWISE_CUCUMBER_FORMATTER']}" 5 | else ENV["TESTWISE_RUNTIME_DIR"] && Dir.exist?(ENV["TESTWISE_RUNTIME_DIR"]) 6 | if File.exist?("#{ENV['TESTWISE_RUNTIME_DIR']}/testwise_cucumber_formatter.rb") 7 | require "#{ENV['TESTWISE_RUNTIME_DIR']}/testwise_cucumber_formatter.rb" 8 | end 9 | end -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/install-lib.cmd: -------------------------------------------------------------------------------- 1 | gem install cucumber selenium-webdriver webdrivers -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/pages/abstract_page.rb: -------------------------------------------------------------------------------- 1 | # use utils in RWebSpec and better integration with TestWise 2 | # This is the parent page for all page objects, for operations across all pages, define here 3 | class AbstractPage 4 | 5 | # If want to use debug('message') to TestWise Console, uncomment the line below 6 | # 7 | if defined?(TestWiseRuntimeSupport) 8 | ::TestWise::Runtime.load_webdriver_support # for selenium webdriver support 9 | end 10 | 11 | 12 | def initialize(driver, text = "") 13 | @browser = driver 14 | # TODO check the page text contains the given text 15 | end 16 | 17 | 18 | def browser 19 | @browser 20 | end 21 | 22 | def driver 23 | @browser 24 | end 25 | 26 | end 27 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/pages/flight_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class FlightPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def select_trip_type(trip_type) 10 | driver.find_elements(:name => "tripType").each { |elem| elem.click && break if elem.attribute("value") == trip_type && elem.attribute("type") == "radio" } 11 | end 12 | 13 | def select_depart_from(from_port) 14 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "fromPort")).select_by(:text, from_port) 15 | end 16 | 17 | def select_arrive_at(to_port) 18 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "toPort")).select_by(:text, to_port) 19 | end 20 | 21 | def select_depart_day(depart_day) 22 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departDay")).select_by(:text, depart_day) 23 | end 24 | 25 | def select_depart_month(depart_month) 26 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departMonth")).select_by(:text, depart_month) 27 | end 28 | 29 | def select_return_day(return_day) 30 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnDay")).select_by(:text, return_day) 31 | end 32 | 33 | def select_return_month(return_month) 34 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnMonth")).select_by(:text, return_month) 35 | end 36 | 37 | def select_return_date(return_day, return_month) 38 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnDay")).select_by(:text, return_day) 39 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnMonth")).select_by(:text, return_month) 40 | end 41 | 42 | def click_continue 43 | driver.find_element(:xpath,"//input[@value='Continue']").click 44 | end 45 | 46 | end 47 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/pages/login_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class LoginPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def login(user, pass) 10 | @browser.find_element(:id, "username").send_keys(user) 11 | @browser.find_element(:id, "password").send_keys(pass) 12 | @browser.find_element(:id, "username").submit 13 | 14 | end 15 | 16 | end 17 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/pages/passenger_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PassengerPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def enter_first_name(passenger_first_name) 10 | browser.find_element(:name, "passengerFirstName").send_keys(passenger_first_name) 11 | end 12 | 13 | def enter_last_name(passenger_last_name) 14 | browser.find_element(:name, "passengerLastName").send_keys(passenger_last_name) 15 | end 16 | 17 | def click_next 18 | browser.find_element(:name, "passengerLastName").submit # submit the form, ie click 'Next' 19 | end 20 | 21 | end 22 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/pages/payment_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PaymentPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def enter_holder_name(holder_name) 10 | driver.find_element(:name, "holder_name").send_keys(holder_name) 11 | end 12 | 13 | def enter_card_number(card_number) 14 | driver.find_element(:name, "card_number").send_keys(card_number) 15 | end 16 | 17 | def select_expiry_month(expiry_month) 18 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_month")).select_by(:text, expiry_month) 19 | end 20 | 21 | def select_expiry_year(expiry_year) 22 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_year")).select_by(:text, expiry_year) 23 | end 24 | 25 | def click_pay_now 26 | driver.find_element(:xpath,"//input[@value='Pay now']").click 27 | end 28 | 29 | def select_card_type(card_type) 30 | driver.find_element(:xpath, "//input[@name='card_type' and @value='#{card_type}']").click 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /selenium-webdriver-cucumber/selenium-cucumber.tpr: -------------------------------------------------------------------------------- 1 | 2 | 3 | selenium-cucumber.tpr 4 | Chrome 5 | Selenium 6 | Cucumber 7 | 8 | 9 | https://travel.agileway.net 10 | 11 | 12 | 13 | ;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature;tmp_syntax_check.feature 14 | specification 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /selenium-webdriver-junit/tests/LoginPage.java: -------------------------------------------------------------------------------- 1 | import org.openqa.selenium.By; 2 | import org.openqa.selenium.WebDriver; 3 | 4 | public class LoginPage { 5 | public WebDriver driver; 6 | public LoginPage(WebDriver driver) { 7 | this.driver = driver; 8 | } 9 | 10 | public void enterUsername(String username) { 11 | driver.findElement(By.id("username")).clear(); 12 | driver.findElement(By.id("username")).sendKeys(username); 13 | } 14 | 15 | public void enterPassword(String password) { 16 | driver.findElement(By.id("password")).clear(); 17 | driver.findElement(By.id("password")).sendKeys(password); 18 | } 19 | 20 | public void clickSignIn() { 21 | driver.findElement(By.xpath("//input[@value='Sign in']")).click(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /selenium-webdriver-junit/tests/LoginTestCase.java: -------------------------------------------------------------------------------- 1 | import org.junit.*; 2 | import org.openqa.selenium.By; 3 | import org.openqa.selenium.WebDriver; 4 | import org.openqa.selenium.chrome.ChromeDriver; 5 | 6 | public class LoginTestCase { 7 | static WebDriver driver; 8 | 9 | @BeforeClass 10 | public static void setUp() throws Exception { 11 | driver = new ChromeDriver(); 12 | driver.get("https://travel.agileway.net"); 13 | } 14 | 15 | @AfterClass 16 | public static void tearDown() { 17 | driver.quit(); 18 | } 19 | 20 | @Test 21 | public void testSignInFailed() { 22 | LoginPage loginPage = new LoginPage(driver); 23 | loginPage.enterUsername("agileway"); 24 | loginPage.enterPassword("guess"); 25 | loginPage.clickSignIn(); 26 | assert driver.findElement(By.tagName("body")).getText().contains("Invalid"); 27 | } 28 | 29 | @Test 30 | public void testSignInOK() { 31 | LoginPage loginPage = new LoginPage(driver); 32 | loginPage.enterUsername("agileway"); 33 | loginPage.enterPassword("testwise"); 34 | loginPage.clickSignIn(); 35 | assert driver.findElement(By.tagName("body")).getText().contains("Signed in!"); 36 | } 37 | 38 | 39 | } -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-jasmine/agiletravel-selenium-webdriver.tpr: -------------------------------------------------------------------------------- 1 | 2 | agiletravel-selenium-webdriver.tpr 3 | Chrome 4 | Selenium 5 | Mocha 6 | 7 | 8 | http://agiletravel.herokuapp.com 9 | 10 | 11 | http://test.agiletravel.macmini 12 | 13 | 14 | https://travel.agileway.net 15 | 16 | 17 | http://ci1.agiletravel.dev 18 | 19 | 20 | http://ci2.agiletravel.dev 21 | 22 | 23 | node_modules 24 | 25 | load File.dirname(__FILE__) + '/../test_helper.rb' 26 | 27 | describe "{{ TEST_SUITE }}" do 28 | include TestHelper 29 | 30 | before(:all) do 31 | @browser = $browser = Selenium::WebDriver.for(browser_type, browser_options) 32 | @browser.get(site_url) 33 | end 34 | 35 | after(:all) do 36 | @browser.quit unless debugging? 37 | end 38 | 39 | it "{{ TEST_CASE }}" do 40 | # Test Steps go here 41 | end 42 | 43 | end 44 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 45 | 46 | class {{ PAGE_NAME }} < AbstractPage 47 | 48 | def initialize(driver) 49 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 50 | end 51 | 52 | # page functions here ... 53 | end 54 | 55 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-jasmine/agiletravel-selenium-webdriver.tws: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-jasmine/install-lib.cmd: -------------------------------------------------------------------------------- 1 | npm install -U mocha-junit-reporter 2 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-jasmine/jasmine-reporter.sh: -------------------------------------------------------------------------------- 1 | # Only one file 2 | 3 | ./node_modules/jasmine-xml-reporter/bin/jasmine.js --junitreport --output=testresults/ spec/01_login_spec.js 4 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-jasmine/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "selenium-webdriver-nodejs-mocha", 3 | "version": "2.0.0", 4 | "description": "Sample tests for Selenium WebDriver Node.js v5", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Zhimin Zhan", 10 | "license": "ISC", 11 | "dependencies": { 12 | "jasmine": "^3.8.0", 13 | "jasmine-xml-reporter": "^1.2.1", 14 | "selenium-webdriver": "^4.0.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-jasmine/pages/abstract_page.js: -------------------------------------------------------------------------------- 1 | var webdriver = require('selenium-webdriver'), 2 | By = webdriver.By, 3 | until = webdriver.until; 4 | 5 | class AbstractPage { 6 | 7 | constructor(driver) { 8 | this.driver = driver; 9 | } 10 | 11 | }; 12 | 13 | 14 | module.exports = AbstractPage; 15 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-jasmine/pages/flight_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class FlightPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async selectTripType(trip_type) { 14 | await this.driver.findElement(By.xpath("//input[@name='tripType' and @value='" + trip_type + "']")).click(); 15 | } 16 | 17 | async selectDepartFrom(city) { 18 | await this.driver.findElement(By.name("fromPort")).sendKeys(city); 19 | } 20 | 21 | async selectArriveAt(city) { 22 | await this.driver.findElement(By.name("toPort")).sendKeys(city); 23 | } 24 | 25 | async selectDepartDay(day) { 26 | await this.driver.findElement(By.name("departDay")).sendKeys(day); 27 | } 28 | 29 | async selectDepartMonth(month_year) { 30 | await this.driver.findElement(By.name("departMonth")).sendKeys(month_year); 31 | } 32 | 33 | async selectReturnDay(day) { 34 | await this.driver.findElement(By.name("returnDay")).sendKeys(day); 35 | } 36 | 37 | async selectReturnMonth(month_year) { 38 | await this.driver.findElement(By.name("returnMonth")).sendKeys(month_year); 39 | } 40 | 41 | async clickContinue() { 42 | await this.driver.findElement(By.xpath("//input[@value='Continue']")).click(); 43 | } 44 | }; 45 | 46 | module.exports = FlightPage; 47 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-jasmine/pages/passenger_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class PassengerPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async enterFirstName(first_name) { 14 | await this.driver.findElement(By.name("passengerFirstName")).sendKeys(first_name); 15 | } 16 | 17 | async enterLastName(last_name) { 18 | await this.driver.findElement(By.name("passengerLastName")).sendKeys(last_name); 19 | } 20 | 21 | async clickNext() { 22 | await this.driver.findElement(By.xpath("//input[@value='Next']")).click(); 23 | } 24 | }; 25 | 26 | module.exports = PassengerPage; 27 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-jasmine/pages/payment_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class PaymentPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async select_visa() { 14 | await this.driver.findElement(By.xpath("//input[@name='card_type' and @value='visa']")).click(); 15 | } 16 | 17 | async enterCardNumber(card_no) { 18 | await this.driver.findElement(By.name("card_number")).sendKeys(card_no); 19 | } 20 | 21 | async clickPayNow() { 22 | await this.driver.findElement(By.xpath("//input[@value='Pay now']")).click() 23 | } 24 | 25 | }; 26 | 27 | module.exports = PaymentPage; 28 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-jasmine/spec/01_login_spec.js: -------------------------------------------------------------------------------- 1 | var webdriver = require('selenium-webdriver'), 2 | By = webdriver.By, 3 | until = webdriver.until; 4 | // var test = require('selenium-webdriver/testing'); 5 | var assert = require('assert'); 6 | 7 | var driver; 8 | const timeOut = 15000; 9 | 10 | String.prototype.contains = function(it) { 11 | return this.indexOf(it) != -1; 12 | }; 13 | 14 | var helper = require('../test_helper'); 15 | 16 | // An example in below: var FlightPage = require('../pages/flight_page.js') 17 | // BEGIN: import pages 18 | 19 | // END: import pages 20 | 21 | describe('User Authentication', function() { 22 | 23 | beforeAll(async function() { 24 | driver = new webdriver.Builder().forBrowser('chrome').setChromeOptions(helper.chromeOptions()).build(); 25 | driver.manage().window().setRect({width: 1027, height: 700, x: 30, y: 78}) 26 | //OLD version: driver.manage().window().setSize(1280, 720); 27 | //OLD version: driver.manage().window().setPosition(30, 78); 28 | }); 29 | 30 | beforeEach(async function() { 31 | await driver.get(helper.site_url()); 32 | }); 33 | 34 | afterAll(async function() { 35 | if (!helper.is_debugging()) { 36 | driver.quit(); 37 | } 38 | }); 39 | 40 | it('[1,2] Invalid user', async function() { 41 | await helper.login(driver, "agileway", "badpass") 42 | await driver.getPageSource().then(function(page_source) { 43 | assert(page_source.contains("Invalid email or password")) 44 | }); 45 | }); 46 | 47 | it('User can login successfully', async function() { 48 | await driver.findElement(webdriver.By.name('username')).sendKeys('agileway'); 49 | await driver.findElement(webdriver.By.name('password')).sendKeys('testwise'); 50 | await driver.findElement(webdriver.By.name('commit')).click(); 51 | await driver.getPageSource().then(function(page_source) { 52 | assert(page_source.contains("Welcome")) 53 | }); 54 | await driver.findElement(By.linkText("Sign off")).click(); 55 | 56 | }); 57 | 58 | 59 | }); 60 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-mocha/agiletravel-selenium-webdriver.tpr: -------------------------------------------------------------------------------- 1 | 2 | agiletravel-selenium-webdriver.tpr 3 | Chrome 4 | Selenium 5 | Mocha 6 | 7 | 8 | http://agiletravel.herokuapp.com 9 | 10 | 11 | http://test.agiletravel.macmini 12 | 13 | 14 | https://travel.agileway.net 15 | 16 | 17 | http://ci1.agiletravel.dev 18 | 19 | 20 | http://ci2.agiletravel.dev 21 | 22 | 23 | node_modules 24 | 25 | load File.dirname(__FILE__) + '/../test_helper.rb' 26 | 27 | describe "{{ TEST_SUITE }}" do 28 | include TestHelper 29 | 30 | before(:all) do 31 | @browser = $browser = Selenium::WebDriver.for(browser_type, browser_options) 32 | @browser.get(site_url) 33 | end 34 | 35 | after(:all) do 36 | @browser.quit unless debugging? 37 | end 38 | 39 | it "{{ TEST_CASE }}" do 40 | # Test Steps go here 41 | end 42 | 43 | end 44 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 45 | 46 | class {{ PAGE_NAME }} < AbstractPage 47 | 48 | def initialize(driver) 49 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 50 | end 51 | 52 | # page functions here ... 53 | end 54 | 55 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-mocha/install-lib.cmd: -------------------------------------------------------------------------------- 1 | npm install -U mocha-junit-reporter 2 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-mocha/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "selenium-webdriver-nodejs-mocha", 3 | "version": "2.0.0", 4 | "description": "Sample tests for Selenium WebDriver Node.js v5", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Zhimin Zhan", 10 | "license": "ISC", 11 | "dependencies": { 12 | "mocha": "^8.0.1", 13 | "mocha-junit-reporter": "^1.23.3", 14 | "selenium-webdriver": "^4.0.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-mocha/pages/abstract_page.js: -------------------------------------------------------------------------------- 1 | var webdriver = require('selenium-webdriver'), 2 | By = webdriver.By, 3 | until = webdriver.until; 4 | 5 | class AbstractPage { 6 | 7 | constructor(driver) { 8 | this.driver = driver; 9 | } 10 | 11 | }; 12 | 13 | 14 | module.exports = AbstractPage; 15 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-mocha/pages/flight_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class FlightPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async selectTripType(trip_type) { 14 | await this.driver.findElement(By.xpath("//input[@name='tripType' and @value='" + trip_type + "']")).click(); 15 | } 16 | 17 | async selectDepartFrom(city) { 18 | await this.driver.findElement(By.name("fromPort")).sendKeys(city); 19 | } 20 | 21 | async selectArriveAt(city) { 22 | await this.driver.findElement(By.name("toPort")).sendKeys(city); 23 | } 24 | 25 | async selectDepartDay(day) { 26 | await this.driver.findElement(By.name("departDay")).sendKeys(day); 27 | } 28 | 29 | async selectDepartMonth(month_year) { 30 | await this.driver.findElement(By.name("departMonth")).sendKeys(month_year); 31 | } 32 | 33 | async selectReturnDay(day) { 34 | await this.driver.findElement(By.name("returnDay")).sendKeys(day); 35 | } 36 | 37 | async selectReturnMonth(month_year) { 38 | await this.driver.findElement(By.name("returnMonth")).sendKeys(month_year); 39 | } 40 | 41 | async clickContinue() { 42 | await this.driver.findElement(By.xpath("//input[@value='Continue']")).click(); 43 | } 44 | }; 45 | 46 | module.exports = FlightPage; 47 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-mocha/pages/passenger_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class PassengerPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async enterFirstName(first_name) { 14 | await this.driver.findElement(By.name("passengerFirstName")).sendKeys(first_name); 15 | } 16 | 17 | async enterLastName(last_name) { 18 | await this.driver.findElement(By.name("passengerLastName")).sendKeys(last_name); 19 | } 20 | 21 | async clickNext() { 22 | await this.driver.findElement(By.xpath("//input[@value='Next']")).click(); 23 | } 24 | }; 25 | 26 | module.exports = PassengerPage; 27 | -------------------------------------------------------------------------------- /selenium-webdriver-nodejs-mocha/pages/payment_page.js: -------------------------------------------------------------------------------- 1 | const AbstractPage = require('./abstract_page'); 2 | 3 | var webdriver = require('selenium-webdriver'), 4 | By = webdriver.By, 5 | until = webdriver.until; 6 | 7 | class PaymentPage extends AbstractPage { 8 | 9 | constructor(driver) { 10 | super(driver); 11 | } 12 | 13 | async select_visa() { 14 | await this.driver.findElement(By.xpath("//input[@name='card_type' and @value='visa']")).click(); 15 | } 16 | 17 | async enterCardNumber(card_no) { 18 | await this.driver.findElement(By.name("card_number")).sendKeys(card_no); 19 | } 20 | 21 | async clickPayNow() { 22 | await this.driver.findElement(By.xpath("//input[@value='Pay now']")).click() 23 | } 24 | 25 | }; 26 | 27 | module.exports = PaymentPage; 28 | -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest-raw/.gitignore: -------------------------------------------------------------------------------- 1 | test/__pycache__ 2 | -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest-raw/tests/1_login_test.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import xmlrunner 3 | import time 4 | import datetime 5 | import sys 6 | import os 7 | from selenium import webdriver 8 | from selenium.webdriver.support.ui import Select 9 | from selenium.webdriver.common.by import By 10 | from selenium.webdriver.support.ui import WebDriverWait 11 | from selenium.webdriver.support import expected_conditions as EC 12 | 13 | class LoginTestCase(unittest.TestCase): 14 | @classmethod 15 | def setUpClass(cls): 16 | if os.environ.get('BROWSER') == "firefox": 17 | cls.driver = webdriver.Firefox() 18 | else: 19 | cls.driver = webdriver.Chrome() 20 | 21 | cls.driver.set_window_size(1280, 720) 22 | cls.driver.set_window_position(30, 78) 23 | 24 | @classmethod 25 | def tearDownClass(cls): 26 | cls.driver.quit() 27 | 28 | def setUp(self): 29 | self.driver.get("https://travel.agileway.net") 30 | 31 | def test_sign_in_failed(self): 32 | # ... 33 | self.driver.find_element_by_id("username").send_keys("agileway") 34 | self.driver.find_element_by_id("password").send_keys("guess") 35 | self.driver.find_element_by_xpath("//input[@value='Sign in']").click() 36 | # self.assertIn("Demo Fail this test case", self.driver.find_element_by_tag_name("body").text) 37 | 38 | def test_sign_in_ok(self): 39 | # ... 40 | self.driver.find_element_by_id("username").send_keys("agileway") 41 | self.driver.find_element_by_id("password").send_keys("testwise") 42 | self.driver.find_element_by_xpath("//input[@value='Sign in']").click() 43 | 44 | # if __name__ == '__main__': 45 | # unittest.main( 46 | # testRunner=xmlrunner.XMLTestRunner(output='reports'), 47 | # failfast=False, buffer=False, catchbreak=False) -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest/.gitignore: -------------------------------------------------------------------------------- 1 | test/__pycache__ 2 | -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest/install-lib.cmd: -------------------------------------------------------------------------------- 1 | pip3 install -U pytest selenium xmlrunner -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest/pages/__init__.py: -------------------------------------------------------------------------------- 1 | __all__ = ['base_page', 'login_page', 'payment_page', 'passenger_page', 'flight_page'] -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest/pages/abstract_page.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.support.ui import Select 3 | 4 | class AbstractPage(object): 5 | 6 | def __init__(self, driver): 7 | self.driver = driver 8 | -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest/pages/flight_page.py: -------------------------------------------------------------------------------- 1 | from pages.abstract_page import AbstractPage 2 | 3 | from selenium import webdriver 4 | from selenium.webdriver.support.ui import Select 5 | 6 | class FlightPage(AbstractPage): 7 | 8 | def select_trip_type(self, trip_type): 9 | self.driver.find_element_by_xpath("//input[@name='tripType' and @value='" + trip_type + "']").click() 10 | 11 | def select_depart_from(self, from_port): 12 | Select(self.driver.find_element_by_name("fromPort")).select_by_visible_text(from_port) 13 | 14 | def select_arrive_at(self, to_port): 15 | Select(self.driver.find_element_by_name("toPort")).select_by_visible_text(to_port) 16 | 17 | def select_depart_day(self, depart_day): 18 | Select(self.driver.find_element_by_name("departDay")).select_by_visible_text(depart_day) 19 | 20 | def select_depart_month(self, depart_month): 21 | Select(self.driver.find_element_by_name("departMonth")).select_by_visible_text(depart_month) 22 | 23 | def select_return_day(self, return_day): 24 | Select(self.driver.find_element_by_name("returnDay")).select_by_visible_text(return_day) 25 | 26 | def select_return_month(self, return_month): 27 | Select(self.driver.find_element_by_id("returnMonth")).select_by_visible_text(return_month) 28 | 29 | def click_continue(self): 30 | self.driver.find_element_by_xpath("//input[@value='Continue']").click() 31 | -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest/pages/login_page.py: -------------------------------------------------------------------------------- 1 | from pages.abstract_page import AbstractPage 2 | 3 | class LoginPage(AbstractPage): 4 | 5 | def enter_username(self, user): 6 | self.driver.find_element_by_id("username").send_keys(user) 7 | 8 | def enter_password(self, password): 9 | self.driver.find_element_by_id("password").send_keys(password) 10 | 11 | def click_sign_in(self): 12 | self.driver.find_element_by_xpath("//input[@value='Sign in']").click() 13 | -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest/pages/passenger_page.py: -------------------------------------------------------------------------------- 1 | from pages.abstract_page import AbstractPage 2 | 3 | from selenium import webdriver 4 | from selenium.webdriver.support.ui import Select 5 | 6 | class PassengerPage(AbstractPage): 7 | 8 | def enter_first_name(self, passenger_first_name): 9 | self.driver.find_element_by_name("passengerFirstName").send_keys(passenger_first_name) 10 | 11 | def enter_last_name(self, passenger_last_name): 12 | self.driver.find_element_by_name("passengerLastName").send_keys(passenger_last_name) 13 | 14 | def click_next(self): 15 | self.driver.find_element_by_name("passengerLastName").submit() -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest/pages/payment_page.py: -------------------------------------------------------------------------------- 1 | from pages.abstract_page import AbstractPage 2 | 3 | from selenium import webdriver 4 | from selenium.webdriver.support.ui import Select 5 | 6 | class PaymentPage(AbstractPage): 7 | 8 | def enter_holder_name(self, holder_name): 9 | self.driver.find_element_by_name("holder_name").send_keys(holder_name) 10 | 11 | def enter_card_number(self, card_number): 12 | self.driver.find_element_by_name("card_number").send_keys(card_number) 13 | 14 | def enter_expiry_month(self, expiry_month): 15 | Select(self.driver.find_element_by_name("expiry_month")).select_by_visible_text(expiry_month) 16 | 17 | def enter_expiry_year(self, expiry_year): 18 | Select(self.driver.find_element_by_name("expiry_year")).select_by_visible_text(expiry_year) 19 | 20 | def click_pay_now(self): 21 | self.driver.find_element_by_xpath("//input[@value='Pay now']").click() 22 | 23 | def select_card_type(self, card_type): 24 | self.driver.find_element_by_xpath("//input[@name='card_type' and @value='" + card_type + "']").click() 25 | -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest/tests/1_login_test.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import xmlrunner 3 | import time 4 | import datetime 5 | import sys 6 | import os 7 | from selenium import webdriver 8 | from selenium.webdriver.support.ui import Select 9 | from selenium.webdriver.common.by import By 10 | from selenium.webdriver.support.ui import WebDriverWait 11 | from selenium.webdriver.support import expected_conditions as EC 12 | 13 | # load modules from parent dir, pages will be referred from there too. 14 | sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + "/../") 15 | from test_helper import TestHelper 16 | from pages.login_page import LoginPage 17 | 18 | class LoginTestCase(unittest.TestCase, TestHelper): 19 | 20 | @classmethod 21 | def setUpClass(cls): 22 | # open_browser method defined in test_helper.py 23 | cls.driver = cls.open_browser(); 24 | cls.driver.set_window_size(1280, 720) 25 | cls.driver.set_window_position(30, 78) 26 | 27 | executor_url = cls.driver.command_executor._url 28 | session_id = cls.driver.session_id 29 | print("WDURL: " + executor_url + ", session id: " + session_id); 30 | cls.puts("session id: " + session_id + ", WDURL: " + executor_url + "|"); 31 | 32 | 33 | @classmethod 34 | def tearDownClass(cls): 35 | if not cls.is_debugging(): 36 | cls.driver.quit() 37 | print("Not quiting"); 38 | 39 | def setUp(self): 40 | self.driver.get(self.site_url()) 41 | 42 | def test_sign_in_failed(self): 43 | # ... 44 | login_page = LoginPage(self.driver) 45 | login_page.enter_username("agileway") 46 | login_page.enter_password("badpass") 47 | login_page.click_sign_in() 48 | # self.assertIn("Demo Fail this test case", self.driver.find_element_by_tag_name("body").text) 49 | 50 | def test_sign_in_ok(self): 51 | # ... 52 | login_page = LoginPage(self.driver) 53 | login_page.enter_username("agileway") 54 | login_page.enter_password("testwise") 55 | login_page.click_sign_in() 56 | 57 | # if __name__ == '__main__': 58 | # unittest.main( 59 | # testRunner=xmlrunner.XMLTestRunner(output='reports'), 60 | # failfast=False, buffer=False, catchbreak=False) 61 | -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest/tests/2_flight_test.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import xmlrunner 3 | import time 4 | import datetime 5 | import sys 6 | import os 7 | from selenium import webdriver 8 | from selenium.webdriver.support.ui import Select 9 | from selenium.webdriver.common.by import By 10 | from selenium.webdriver.support.ui import WebDriverWait 11 | from selenium.webdriver.support import expected_conditions as EC 12 | 13 | sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + "/../") 14 | from test_helper import TestHelper 15 | 16 | from pages.login_page import LoginPage 17 | from pages.flight_page import FlightPage 18 | 19 | class FlightTestCase(unittest.TestCase, TestHelper): 20 | 21 | @classmethod 22 | def setUpClass(cls): 23 | # open_browser method defined in test_helper.py 24 | cls.driver = cls.open_browser(); 25 | cls.driver.set_window_size(1280, 720) 26 | cls.driver.set_window_position(30, 78) 27 | 28 | cls.driver.get(cls.site_url()) 29 | login_page = LoginPage(cls.driver) 30 | login_page.enter_username("agileway") 31 | login_page.enter_password("testwise") 32 | login_page.click_sign_in() 33 | 34 | @classmethod 35 | def tearDownClass(cls): 36 | time.sleep(1) 37 | cls.driver.quit() 38 | 39 | def setUp(self): 40 | self.driver.get(self.site_url()) 41 | 42 | def test_select_return_flight(self): 43 | flight_page = FlightPage(self.driver) 44 | flight_page.select_trip_type("return") 45 | flight_page.select_depart_from("Sydney") 46 | flight_page.select_arrive_at("New York") 47 | 48 | flight_page.select_depart_day("02") 49 | flight_page.select_depart_month("May 2016") 50 | flight_page.select_return_day("04") 51 | flight_page.select_return_month("June 2016") 52 | flight_page.click_continue 53 | 54 | time.sleep(1) 55 | 56 | # if __name__ == '__main__': 57 | # unittest.main( 58 | # testRunner=xmlrunner.XMLTestRunner(output='reports'), 59 | # failfast=False, buffer=False, catchbreak=False) 60 | -------------------------------------------------------------------------------- /selenium-webdriver-python-unittest/tests/3_passenger_test.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import xmlrunner 3 | import time 4 | import datetime 5 | import sys 6 | import os 7 | from selenium import webdriver 8 | from selenium.webdriver.support.ui import Select 9 | from selenium.webdriver.common.by import By 10 | from selenium.webdriver.support.ui import WebDriverWait 11 | from selenium.webdriver.support import expected_conditions as EC 12 | 13 | sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + "/../") 14 | from test_helper import TestHelper 15 | 16 | from pages.login_page import LoginPage 17 | from pages.flight_page import FlightPage 18 | from pages.passenger_page import PassengerPage 19 | 20 | class PassengerTestCase(unittest.TestCase, TestHelper): 21 | 22 | @classmethod 23 | def setUpClass(cls): 24 | # open_browser method defined in test_helper.py 25 | cls.driver = cls.open_browser(); 26 | cls.driver.set_window_size(1280, 720) 27 | cls.driver.set_window_position(30, 78) 28 | 29 | cls.driver.get(cls.site_url()) 30 | login_page = LoginPage(cls.driver) 31 | login_page.enter_username("agileway") 32 | login_page.enter_password("testwise") 33 | login_page.click_sign_in() 34 | 35 | @classmethod 36 | def tearDownClass(cls): 37 | time.sleep(1) 38 | cls.driver.quit() 39 | 40 | def test_enter_passenger_details(self): 41 | flight_page = FlightPage(self.driver) 42 | flight_page.select_trip_type("oneway") 43 | flight_page.select_depart_from("New York") 44 | flight_page.select_arrive_at("Sydney") 45 | flight_page.select_depart_day("04") 46 | flight_page.select_depart_month("March 2016") 47 | flight_page.click_continue() 48 | 49 | time.sleep(1) 50 | passenger_page = PassengerPage(self.driver) 51 | passenger_page.enter_first_name("Bob") 52 | passenger_page.enter_last_name("Tester") 53 | passenger_page.click_next() 54 | 55 | # purposely assertion failure 56 | self.assertEqual("Wendy Tester", self.driver.find_element_by_name("holder_name").get_attribute("value")) 57 | 58 | # if __name__ == '__main__': 59 | # unittest.main( 60 | # testRunner=xmlrunner.XMLTestRunner(output='reports'), 61 | # failfast=False, buffer=False, catchbreak=False) 62 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | 3 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/agiletravel-selenium-webdriver.tpr: -------------------------------------------------------------------------------- 1 | 2 | agiletravel-selenium-rpsec-cucumber 3 | WebApp 4 | Chrome 5 | Selenium 6 | RSpec 7 | 8 | 9 | http://agiletravel.herokuapp.com 10 | 11 | 12 | http://test.agiletravel.macmini 13 | 14 | 15 | https://travel.agileway.net 16 | 17 | 18 | http://ci1.agiletravel.dev 19 | 20 | 21 | http://ci2.agiletravel.dev 22 | 23 | 24 | 25 | tmp_syntax_check.feature 26 | load File.dirname(__FILE__) + '/../test_helper.rb' 27 | 28 | describe "{{ TEST_SUITE }}" do 29 | include TestHelper 30 | 31 | before(:all) do 32 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 33 | @driver.get(site_url) 34 | end 35 | 36 | after(:all) do 37 | @driver.quit unless debugging? 38 | end 39 | 40 | it "{{ TEST_CASE }}" do 41 | # Test Steps go here 42 | end 43 | 44 | end 45 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 46 | 47 | class {{ PAGE_NAME }} < AbstractPage 48 | 49 | def initialize(driver) 50 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 51 | end 52 | 53 | # page functions here ... 54 | end 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/buildwise_rspec_formatter.rb: -------------------------------------------------------------------------------- 1 | require 'ci/reporter/rspec' # version 1.0.0 2 | require 'fileutils' 3 | # Overrides default example failed behaviour to add saving screenshot to the reports dir. 4 | # 5 | # Prerequiste: the test script requires defines $driver 6 | # @driver = $driver = Selenium::WebDriver.for(browser_type) 7 | # 8 | # 9 | # Save to folder: ENV['CI_REPORTS'] || reports under current folder 10 | # File name: screenshot-(FULL Test Case Name).png 11 | # 12 | module CI::Reporter 13 | module RSpec3 14 | class Formatter 15 | 16 | def example_failed(notification) 17 | 18 | # In case we fail in before(:all) 19 | example_started(nil) if @suite.testcases.empty? 20 | 21 | failure = Failure.new(notification) 22 | 23 | current_spec.finish 24 | current_spec.name = notification.example.full_description 25 | current_spec.failures << failure 26 | 27 | if $driver && $driver.respond_to?("save_screenshot") # shall be set in test script 28 | reports_dir = ENV['CI_REPORTS'] || File.expand_path("#{Dir.getwd}/spec/reports") 29 | begin 30 | screenshots_dir = File.join(reports_dir, "screenshots") 31 | FileUtils.mkdir_p(screenshots_dir) unless File.exist?(screenshots_dir) 32 | 33 | spec_file_name = File.basename(notification.example.file_path) 34 | saved_to = File.join(screenshots_dir, spec_file_name) 35 | 36 | FileUtils.mkdir_p(saved_to) unless File.exist?(saved_to) 37 | example_name = notification.example.description 38 | # with folder, not using full_description 39 | $driver.save_screenshot(File.join(saved_to, "#{example_name}.png")) 40 | rescue => e 41 | # don't cause build to stop if errors happens 42 | fio = File.open( File.join(reports_dir, "error.log"), "a") 43 | fio.puts(e) 44 | fio.puts(e.backtrace) 45 | fio.flush 46 | fio.close 47 | end 48 | 49 | end 50 | 51 | end 52 | 53 | end 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/01_login.feature: -------------------------------------------------------------------------------- 1 | @feature 2 | Feature: User Authentication 3 | As a registered user 4 | I can log in 5 | 6 | Scenario: Deny access due to invalid password 7 | Given I am on the home page 8 | When enter user name "agileway" and password "badpass" 9 | And click "Sign in" button 10 | Then I should see an log in error message 11 | 12 | Scenario: Registered user can log in sucessfully 13 | Given I am on the home page 14 | When enter user name "agileway" and password "testwise" 15 | And click "Sign in" button 16 | Then I am logged in 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/02_flight.feature: -------------------------------------------------------------------------------- 1 | @feature 2 | Feature: Select Flights 3 | As a regiestered user 4 | I can select flights 5 | 6 | Scenario: Oneway Trip 7 | Given I am signed in as "agileway" 8 | When select oneway trip 9 | And select depart from "Sydney" to "New York" on "07" of "May 2021" 10 | And click "Continue" 11 | Then I should see "2021-05-07", "New York" and "Sydney" on next page 12 | 13 | Scenario: Return Trip 14 | Given I am signed in as "agileway" 15 | When select return trip 16 | And select depart from "Sydney" to "New York" on "07" of "May 2021" 17 | And return on "12" of "June 2021" 18 | And click "Continue" 19 | Then I should see "2021-05-07", "New York" and "Sydney" on next page 20 | And I should see "2021-06-12", "Sydney" and "New York" on next page 21 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/03_passenger.feature: -------------------------------------------------------------------------------- 1 | @feature 2 | Feature: Passenger 3 | As a reigstered user 4 | I can enter passenger details 5 | 6 | Scenario: Passenger Details 7 | Given I am signed in as "agileway" 8 | And select oneway trip 9 | And select depart from "Sydney" to "New York" on "07" of "May 2021" 10 | And click "Continue" 11 | When I enter "Bob" and "Tester" as passenger name 12 | And click 'Next' on the passenger page 13 | Then I should see "Bob Tester" shown in card holder name on the next payment page 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/04_payment.feature: -------------------------------------------------------------------------------- 1 | @feature 2 | Feature: Payment 3 | As a reigstered user 4 | I can pay the flight using my credit card 5 | 6 | Scenario: Passenger Details 7 | Given I am signed in as "agileway" 8 | And select oneway trip 9 | And select depart from "Sydney" to "New York" on "07" of "May 2021" 10 | When click "Continue" 11 | And I enter "Bob" and "Tester" as passenger name 12 | When click 'Next' on the passenger page 13 | And select 'Visa' card 14 | And enter card holder name "Bob the Tester" 15 | And enter card number "4242424242424242" 16 | And select card expiry date "07" of "2021" 17 | When I click 'Pay now' 18 | Then I should see 'Booking Number' in confirmation section 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/05_login_outline.feature: -------------------------------------------------------------------------------- 1 | @feature 2 | Feature: User Authentication Outline 3 | As a reigstered user 4 | I can log in 5 | 6 | Scenario Outline: Registered user with different role can log in sucessfully 7 | Given I am on the home page 8 | When enter user name "" and password "" 9 | And click "Sign in" button 10 | Then I am logged in 11 | And I sign off 12 | Examples: 13 | | username | password | 14 | | admin | secret | 15 | | agileway | testwise | 16 | 17 | 18 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/step_definitions/flight_steps.rb: -------------------------------------------------------------------------------- 1 | # Enter your step denfitions below 2 | 3 | # Once you created the step skeleton (right click from feature file), 4 | # add test steps like below: 5 | # driver.find_element(:text, "Start here").click 6 | # Then perform refactorings to extract the steps into Page Objects. 7 | 8 | 9 | 10 | Given('I am signed in as {string}') do |user| 11 | begin 12 | driver.find_element(:link, "Login") 13 | sign_in("agileway", "testwise") 14 | rescue 15 | # already logged in 16 | driver.get(site_url) 17 | end 18 | @flight_page = FlightPage.new(driver) 19 | end 20 | 21 | When('select oneway trip') do 22 | @flight_page.select_trip_type("oneway") 23 | end 24 | 25 | 26 | When('select return trip') do 27 | @flight_page.select_trip_type("return") 28 | end 29 | 30 | 31 | When('select depart from {string} to {string} on {string} of {string}') do |from, to, day, month_year| 32 | @flight_page.select_depart_from(from) 33 | @flight_page.select_arrive_at(to) 34 | @flight_page.select_depart_day(day) 35 | @flight_page.select_depart_month(month_year) 36 | end 37 | 38 | 39 | When('click {string}') do |string| 40 | sleep 0.5 41 | @flight_page.click_continue 42 | end 43 | 44 | Then('I should see {string}, {string} and {string} on next page') do |text1, text2, text3| 45 | the_page_source = driver.page_source 46 | expect(the_page_source).to include(text1) 47 | expect(the_page_source).to include(text2) 48 | expect(the_page_source).to include(text3) 49 | end 50 | 51 | When('return on {string} of {string}') do |day, month| 52 | @flight_page.select_return_day(day) 53 | @flight_page.select_return_month(month) 54 | end 55 | 56 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/step_definitions/login_steps.rb: -------------------------------------------------------------------------------- 1 | # Enter your step denfitions below 2 | 3 | # Once you created the step skeleton (right click from feature file), 4 | # add test steps like below: 5 | # driver.find_element(:text, "Start here").click 6 | # Then perform refactorings to extract the steps into Page Objects. 7 | 8 | 9 | 10 | Given('I am on the home page') do 11 | driver.navigate.to($BASE_URL ) 12 | end 13 | 14 | When('enter user name {string} and password {string}') do |user, pass| 15 | driver.find_element(:id, "username").send_keys(user) 16 | driver.find_element(:id, "password").send_keys(pass) 17 | end 18 | 19 | When('click {string} button') do |button| 20 | driver.find_element(:xpath,"//input[@value=\"#{button}\"]").click 21 | end 22 | 23 | Then('I should see an log in error message') do 24 | expect(driver.page_source).to include("Invalid email or password") 25 | end 26 | 27 | Then('I am logged in') do 28 | expect(driver.page_source).to include("Signed in!") 29 | end 30 | 31 | Then('I sign off') do 32 | driver.find_element(:link_text, "Sign off").click 33 | end -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/step_definitions/passenger_steps.rb: -------------------------------------------------------------------------------- 1 | # Enter your step denfitions below 2 | 3 | # Once you created the step skeleton (right click from feature file), 4 | # add test steps like below: 5 | # driver.find_element(:text, "Start here").click 6 | # Then perform refactorings to extract the steps into Page Objects. 7 | 8 | When('I enter {string} and {string} as passenger name') do |first_name, last_name| 9 | sleep 1 10 | @passenger_page = PassengerPage.new(driver) 11 | @passenger_page.enter_first_name(first_name) 12 | @passenger_page.enter_last_name(last_name) 13 | end 14 | 15 | Then('I should see {string} shown in card holder name on the next payment page') do |name| 16 | sleep 1 17 | expect(driver.find_element(:name, "holder_name").attribute("value")).to eq(name) 18 | end 19 | 20 | When('click {string} on the passenger page') do |button_name| 21 | @passenger_page.click_next 22 | end 23 | 24 | 25 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/step_definitions/payment_steps.rb: -------------------------------------------------------------------------------- 1 | # Enter your step denfitions below 2 | 3 | # Once you created the step skeleton (right click from feature file), 4 | # add test steps like below: 5 | # @browser.find_element(:text, "Start here").click 6 | # Then perform refactorings to extract the steps into Page Objects. 7 | 8 | 9 | 10 | 11 | When('select {string} card') do |card_type| 12 | @payment_page = PaymentPage.new(driver) 13 | @payment_page.select_card_type(card_type.downcase) 14 | end 15 | 16 | When('enter card holder name {string}') do |holder| 17 | @payment_page.enter_card_number(holder) 18 | end 19 | 20 | When('enter card number {string}') do |card_number| 21 | @payment_page.enter_card_number(card_number) 22 | end 23 | 24 | When('select card expiry date {string} of {string}') do |month, year| 25 | @payment_page.select_expiry_month(month) 26 | @payment_page.select_expiry_year(year) 27 | end 28 | 29 | When('I click {string}') do |button_name| 30 | @payment_page.click_pay_now 31 | end 32 | 33 | Then('I should see {string} in confirmation section') do |booking_number| 34 | #AJAX 35 | wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds 36 | wait.until{ driver.find_element(:id => "booking_number").text.to_i > 100 } 37 | puts "Booking number is " + driver.find_element(:id => "booking_number").text 38 | end 39 | 40 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/support/hooks.rb: -------------------------------------------------------------------------------- 1 | # Cucumber hooks 2 | # See https://www.relishapp.com/cucumber/cucumber/docs/writing-support-code 3 | 4 | # Example hoook after each scenario 5 | After do |scenario| 6 | if scenario.failed? 7 | # puts "* Scenario failed: " 8 | end 9 | end 10 | 11 | =begin 12 | Before('@feature') do 13 | # do something useful 14 | puts "before feature" 15 | end 16 | 17 | After('@feature') do 18 | # do something useful 19 | puts "after feature: #{driver}" 20 | driver.close if driver 21 | end 22 | =end -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/support/step_helper.rb: -------------------------------------------------------------------------------- 1 | 2 | if ENV["TESTWISE_RUNTIME_DIR"] && !ENV["TESTWISE_RUNTIME_DIR"].strip.empty? && Dir.exist?(ENV["TESTWISE_RUNTIME_DIR"]) 3 | require File.join(ENV["TESTWISE_RUNTIME_DIR"], "testwise_runtime_support.rb") 4 | end 5 | 6 | module StepHelper 7 | 8 | if defined?(TestWiseRuntimeSupport) 9 | include TestWiseRuntimeSupport 10 | end 11 | 12 | def driver 13 | @driver ||= Selenium::WebDriver.for(browser_type, browser_options) 14 | end 15 | 16 | ## Helper methods 17 | # 18 | 19 | def goto_home_page 20 | home_url = site_url 21 | home_url += "/index.html" if site_url.include?("file://") 22 | driver.get(home_url ) 23 | end 24 | 25 | # if your applicant supports reset datbase 26 | def reset_database 27 | driver.navigate.to("#{site_url()}/reset") 28 | goto_home_page 29 | end 30 | 31 | def site_url(default = $BASE_URL) 32 | the_site_url = $TESTWISE_PROJECT_BASE_URL || ENV["BASE_URL"] 33 | if the_site_url.nil? || the_site_url.empty? 34 | the_site_url = default 35 | end 36 | return the_site_url 37 | end 38 | 39 | def sign_in(user, pass) 40 | driver.find_element(:id, "username").send_keys(user) 41 | driver.find_element(:id, "password").send_keys(pass) 42 | driver.find_element(:xpath, "//input[@value=\"Sign in\"]").click 43 | end 44 | 45 | def sign_off 46 | driver.find_element(:link_text, "Sign off").click 47 | end 48 | 49 | end 50 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/support/testwise_formatter_loader.rb: -------------------------------------------------------------------------------- 1 | # Cucumber changed, if use --require, then steps/env not loaded 2 | # --help for details 3 | if ENV["TESTWISE_CUCUMBER_FORMATTER"] 4 | require "#{ENV['TESTWISE_CUCUMBER_FORMATTER']}" 5 | else ENV["TESTWISE_RUNTIME_DIR"] && Dir.exist?(ENV["TESTWISE_RUNTIME_DIR"]) 6 | if File.exist?("#{ENV['TESTWISE_RUNTIME_DIR']}/testwise_cucumber_formatter.rb") 7 | require "#{ENV['TESTWISE_RUNTIME_DIR']}/testwise_cucumber_formatter.rb" 8 | end 9 | end -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/features/tmp_syntax_check.feature: -------------------------------------------------------------------------------- 1 | @feature 2 | Feature: Passenger 3 | As a reigstered user 4 | I can enter passenger details 5 | 6 | Scenario: Passenger Details 7 | Given I am signed in as "agileway" 8 | And select oneway trip 9 | And select depart from "Sydney" to "New York" on "07" of "May 2016" 10 | And click "Continue" 2 11 | When I enter "Bob" and "Tester" as passenger name 12 | And click 'Next' on the passenger page 13 | Then I should see "Bob Tester" shown in card holder name on the next payment page 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/install-lib.cmd: -------------------------------------------------------------------------------- 1 | # For Ruby 2.5 or less, replace --no-document with --no-ri --no-rdoc 2 | gem install --no-document rspec selenium-webdriver ci_reporter_rspec cucumber 3 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/pages/abstract_page.rb: -------------------------------------------------------------------------------- 1 | # use utils in RWebSpec and better integration with TestWise 2 | require "#{File.dirname(__FILE__)}/../agileway_utils.rb" 3 | 4 | # This is the parent page for all page objects, for operations across all pages, define here 5 | class AbstractPage 6 | 7 | 8 | # If want to use utility methods such as fail_safe { }, uncomment the line below 9 | # 10 | include AgilewayUtils 11 | 12 | # If want to use debug('message') to TestWise Console, uncomment the line below 13 | # 14 | if defined?(TestWiseRuntimeSupport) 15 | ::TestWise::Runtime.load_webdriver_support # for selenium webdriver support 16 | end 17 | 18 | 19 | def initialize(driver, text = "") 20 | @browser = driver 21 | # TODO check the page text contains the given text 22 | end 23 | 24 | 25 | def browser 26 | @browser 27 | end 28 | 29 | def driver 30 | @browser 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/pages/flight_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class FlightPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def select_trip_type(trip_type) 10 | driver.find_elements(:name => "tripType").each { |elem| elem.click && break if elem.attribute("value") == trip_type && elem.attribute("type") == "radio" } 11 | end 12 | 13 | def select_depart_from(from_port) 14 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "fromPort")).select_by(:text, from_port) 15 | end 16 | 17 | def select_arrive_at(to_port) 18 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "toPort")).select_by(:text, to_port) 19 | end 20 | 21 | def select_depart_day(depart_day) 22 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departDay")).select_by(:text, depart_day) 23 | end 24 | 25 | def select_depart_month(depart_month) 26 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departMonth")).select_by(:text, depart_month) 27 | end 28 | 29 | def select_return_day(return_day) 30 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnDay")).select_by(:text, return_day) 31 | end 32 | 33 | def select_return_month(return_month) 34 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnMonth")).select_by(:text, return_month) 35 | end 36 | 37 | def click_continue 38 | driver.find_element(:xpath,"//input[@value='Continue']").click 39 | end 40 | 41 | end 42 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/pages/login_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class LoginPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def login(user, pass) 10 | @browser.find_element(:id, "username").send_keys(user) 11 | @browser.find_element(:id, "password").send_keys(pass) 12 | @browser.find_element(:id, "username").submit 13 | 14 | end 15 | 16 | end 17 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/pages/passenger_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PassengerPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def enter_first_name(passenger_first_name) 10 | browser.find_element(:name, "passengerFirstName").send_keys(passenger_first_name) 11 | end 12 | 13 | def enter_last_name(passenger_last_name) 14 | browser.find_element(:name, "passengerLastName").send_keys(passenger_last_name) 15 | end 16 | 17 | def click_next 18 | browser.find_element(:name, "passengerLastName").submit # submit the form, ie click 'Next' 19 | end 20 | 21 | end 22 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/pages/payment_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PaymentPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def enter_holder_name(holder_name) 10 | driver.find_element(:name, "holder_name").send_keys(holder_name) 11 | end 12 | 13 | def enter_card_number(card_number) 14 | driver.find_element(:name, "card_number").send_keys(card_number) 15 | end 16 | 17 | def select_expiry_month(expiry_month) 18 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_month")).select_by(:text, expiry_month) 19 | end 20 | 21 | def select_expiry_year(expiry_year) 22 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_year")).select_by(:text, expiry_year) 23 | end 24 | 25 | def click_pay_now 26 | driver.find_element(:xpath,"//input[@value='Pay now']").click 27 | end 28 | 29 | def select_card_type(card_type) 30 | driver.find_element(:xpath, "//input[@name='card_type' and @value='#{card_type}']").click 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/spec/01_login_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "User Login" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | # for windows, when unable auto-detect firefox binary 8 | # Please note Firefox on 32 bit is "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" 9 | # Selenium::WebDriver::Firefox::Binary.path="C:/Program Files/Mozilla Firefox/firefox.exe" 10 | 11 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 12 | driver.manage().window().resize_to(1280, 720) 13 | driver.manage().window().move_to(30, 78) 14 | driver.get(site_url) 15 | 16 | driver.navigate.to(site_url) 17 | end 18 | 19 | after(:all) do 20 | driver.quit unless debugging? 21 | end 22 | 23 | it "[1] Can sign in OK" do 24 | goto_page("/login") 25 | login_page = LoginPage.new(driver) 26 | login_page.login("agileway", "testwise") 27 | # selenium does not have browser.text yet 28 | try_for(3) { expect(driver.page_source).to include("Welcome")} 29 | driver.find_element(:link_text, "Sign off").click 30 | puts "[stdout] Signed out" 31 | end 32 | 33 | it "[1] User failed to sign in due to invalid password", :tag => "showcase" do 34 | goto_page("/login") 35 | login_page = LoginPage.new(driver) 36 | login_page.login("agileway", "badpass") 37 | expect(driver.page_source).to include("Invalid email or password") 38 | end 39 | 40 | end 41 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/spec/02_flight_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Select Flights" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 8 | driver.manage().window().resize_to(1280, 720) 9 | driver.manage().window().move_to(30, 78) 10 | driver.get(site_url) 11 | 12 | login_page = LoginPage.new(driver) 13 | login_page.login("agileway", "testwise") 14 | end 15 | 16 | before(:each) do 17 | goto_page("/") 18 | sleep 1 # for some webdriver verson, it might not wait page loaded 19 | end 20 | 21 | after(:all) do 22 | driver.quit unless debugging? 23 | end 24 | 25 | it "[3] Return trip" do 26 | flight_page = FlightPage.new(driver) 27 | flight_page.select_trip_type("return") 28 | flight_page.select_depart_from("Sydney") 29 | flight_page.select_arrive_at("New York") 30 | 31 | flight_page.select_depart_day("02") 32 | flight_page.select_depart_month("May 2016") 33 | flight_page.select_return_day("04") 34 | flight_page.select_return_month("June 2016") 35 | flight_page.click_continue 36 | 37 | expect(page_text).to include("2016-05-02 Sydney to New York") 38 | expect(page_text).to include("2016-06-04 New York to Sydney") 39 | end 40 | 41 | it "[2] One-way trip" do 42 | flight_page = FlightPage.new(driver) 43 | flight_page.select_trip_type("oneway") 44 | flight_page.select_depart_from("Sydney") 45 | flight_page.select_arrive_at("New York") 46 | 47 | flight_page.select_depart_day("02") 48 | flight_page.select_depart_month("May 2016") 49 | flight_page.click_continue 50 | 51 | expect(page_text).to include("2016-05-02 Sydney to New York") 52 | end 53 | 54 | 55 | end 56 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/spec/03_passenger_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Passenger" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | # by setting $driver global variable for build_rspec_formatter can save screenshot if error occurs 8 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 9 | driver.manage().window().resize_to(1280, 720) 10 | driver.manage().window().move_to(30, 78) 11 | driver.get(site_url) 12 | 13 | login_page = LoginPage.new(driver) 14 | login_page.login("agileway", "testwise") 15 | end 16 | 17 | after(:all) do 18 | fail_safe { driver.find_element(:link_text, "Sign off").click } unless debugging? 19 | driver.quit unless debugging? 20 | end 21 | 22 | it "[4] Can enter passenger details (using page objects)" do 23 | flight_page = FlightPage.new(driver) 24 | flight_page.select_trip_type("return") 25 | flight_page.select_depart_from("Sydney") 26 | flight_page.select_arrive_at("New York") 27 | 28 | flight_page.select_depart_day("02") 29 | flight_page.select_depart_month("May 2016") 30 | flight_page.select_return_day("04") 31 | flight_page.select_return_month("June 2016") 32 | flight_page.click_continue 33 | 34 | # now on passenger page 35 | passenger_page = PassengerPage.new(driver) 36 | passenger_page.click_next 37 | try_for(3) { expect(page_text).to include("Must provide last name") } 38 | passenger_page.enter_first_name("Bob") 39 | passenger_page.enter_last_name("Tester") 40 | passenger_page.click_next 41 | 42 | # the step below fails: "Wendy" => "Bob" 43 | expect(driver.find_element(:name, "holder_name").attribute("value")).to eq("Wendy Tester") 44 | end 45 | 46 | end 47 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/spec/04_payment_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Payment" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 8 | driver.manage().window().resize_to(1280, 720) 9 | driver.manage().window().move_to(30, 78) 10 | driver.get(site_url) 11 | 12 | login_page = LoginPage.new(driver) 13 | login_page.login("agileway", "testwise") 14 | end 15 | 16 | after(:all) do 17 | driver.quit unless debugging? 18 | end 19 | 20 | it "[5] Book flight with payment", :tag => "showcase" do 21 | 22 | flight_page = FlightPage.new(driver) 23 | flight_page.select_trip_type("oneway") 24 | flight_page.select_depart_from("Sydney") 25 | flight_page.select_arrive_at("New York") 26 | 27 | flight_page.select_depart_day("02") 28 | flight_page.select_depart_month("May 2016") 29 | flight_page.click_continue 30 | 31 | # now on passenger page 32 | passenger_page = PassengerPage.new(driver) 33 | passenger_page.enter_last_name("Tester") 34 | passenger_page.click_next 35 | 36 | payment_page = PaymentPage.new(driver) 37 | try_for(3) { payment_page.select_card_type("master") } 38 | payment_page.enter_holder_name("Bob the Tester") 39 | payment_page.enter_card_number("4242424242424242") 40 | payment_page.select_expiry_month("04") 41 | payment_page.select_expiry_year("2016") 42 | payment_page.click_pay_now 43 | try_for(10) { expect(driver.page_source).to include("Booking number")} 44 | puts("booking number: " + driver.find_element(:id, 'booking_number').text) 45 | end 46 | 47 | end 48 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec-cucumber/spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # spec_helper.rb 2 | 3 | RSpec.configure do |config| 4 | # register around filter that captures stdout and stderr 5 | config.around(:each) do |example| 6 | $stdout = StringIO.new 7 | $stderr = StringIO.new 8 | 9 | example.run 10 | 11 | example.metadata[:stdout] = $stdout.string 12 | example.metadata[:stderr] = $stderr.string 13 | 14 | $stdout = STDOUT 15 | $stderr = STDERR 16 | end 17 | end -------------------------------------------------------------------------------- /selenium-webdriver-rspec/.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | 3 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/agiletravel-selenium-webdriver.tpr: -------------------------------------------------------------------------------- 1 | 2 | agiletravel-selenium-webdriver.tpr 3 | WebApp 4 | Chrome 5 | Selenium 6 | RSpec 7 | 8 | 9 | http://agiletravel.herokuapp.com 10 | 11 | 12 | http://test.agiletravel.macmini 13 | 14 | 15 | https://travel.agileway.net 16 | 17 | 18 | http://ci1.agiletravel.dev 19 | 20 | 21 | http://ci2.agiletravel.dev 22 | 23 | 24 | 25 | tmp_syntax_check.feature 26 | load File.dirname(__FILE__) + '/../test_helper.rb' 27 | 28 | describe "{{ TEST_SUITE }}" do 29 | include TestHelper 30 | 31 | before(:all) do 32 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 33 | @driver.get(site_url) 34 | end 35 | 36 | after(:all) do 37 | @driver.quit unless debugging? 38 | end 39 | 40 | it "{{ TEST_CASE }}" do 41 | # Test Steps go here 42 | end 43 | 44 | end 45 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 46 | 47 | class {{ PAGE_NAME }} < AbstractPage 48 | 49 | def initialize(driver) 50 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 51 | end 52 | 53 | # page functions here ... 54 | end 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/buildwise_rspec_formatter.rb: -------------------------------------------------------------------------------- 1 | require 'ci/reporter/rspec' # version 1.0.0 2 | require 'fileutils' 3 | # Overrides default example failed behaviour to add saving screenshot to the reports dir. 4 | # 5 | # Prerequiste: the test script requires defines $driver 6 | # @driver = $driver = Selenium::WebDriver.for(browser_type) 7 | # 8 | # 9 | # Save to folder: ENV['CI_REPORTS'] || reports under current folder 10 | # File name: screenshot-(FULL Test Case Name).png 11 | # 12 | module CI::Reporter 13 | module RSpec3 14 | class Formatter 15 | 16 | def example_failed(notification) 17 | 18 | # In case we fail in before(:all) 19 | example_started(nil) if @suite.testcases.empty? 20 | 21 | failure = Failure.new(notification) 22 | 23 | current_spec.finish 24 | current_spec.name = notification.example.full_description 25 | current_spec.failures << failure 26 | 27 | if $driver && $driver.respond_to?("save_screenshot") # shall be set in test script 28 | reports_dir = ENV['CI_REPORTS'] || File.expand_path("#{Dir.getwd}/spec/reports") 29 | begin 30 | screenshots_dir = File.join(reports_dir, "screenshots") 31 | FileUtils.mkdir_p(screenshots_dir) unless File.exist?(screenshots_dir) 32 | 33 | spec_file_name = File.basename(notification.example.file_path) 34 | saved_to = File.join(screenshots_dir, spec_file_name) 35 | 36 | FileUtils.mkdir_p(saved_to) unless File.exist?(saved_to) 37 | example_name = notification.example.description 38 | # with folder, not using full_description 39 | $driver.save_screenshot(File.join(saved_to, "#{example_name}.png")) 40 | rescue => e 41 | # don't cause build to stop if errors happens 42 | fio = File.open( File.join(reports_dir, "error.log"), "a") 43 | fio.puts(e) 44 | fio.puts(e.backtrace) 45 | fio.flush 46 | fio.close 47 | end 48 | 49 | end 50 | 51 | end 52 | 53 | end 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/install-lib.cmd: -------------------------------------------------------------------------------- 1 | # For Ruby 2.5 or less, replace --no-document with --no-ri --no-rdoc 2 | gem install --no-document rspec selenium-webdriver ci_reporter_rspec webdrivers httpclient 3 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/pages/abstract_page.rb: -------------------------------------------------------------------------------- 1 | # use utils in RWebSpec and better integration with TestWise 2 | require "#{File.dirname(__FILE__)}/../agileway_utils.rb" 3 | 4 | # This is the parent page for all page objects, for operations across all pages, define here 5 | class AbstractPage 6 | 7 | 8 | # If want to use utility methods such as fail_safe { }, uncomment the line below 9 | # 10 | include AgilewayUtils 11 | 12 | # If want to use debug('message') to TestWise Console, uncomment the line below 13 | # 14 | if defined?(TestWiseRuntimeSupport) 15 | ::TestWise::Runtime.load_webdriver_support # for selenium webdriver support 16 | end 17 | 18 | 19 | def initialize(driver, text = "") 20 | @browser = driver 21 | # TODO check the page text contains the given text 22 | end 23 | 24 | 25 | def browser 26 | @browser 27 | end 28 | 29 | def driver 30 | @browser 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/pages/flight_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class FlightPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def select_trip_type(trip_type) 10 | driver.find_element(:xpath, "//input[@name='tripType' and @value='" + trip_type + "']").click 11 | end 12 | 13 | def select_depart_from(from_port) 14 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "fromPort")).select_by(:text, from_port) 15 | end 16 | 17 | def select_arrive_at(to_port) 18 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "toPort")).select_by(:text, to_port) 19 | end 20 | 21 | def select_depart_day(depart_day) 22 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departDay")).select_by(:text, depart_day) 23 | end 24 | 25 | def select_depart_month(depart_month) 26 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "departMonth")).select_by(:text, depart_month) 27 | end 28 | 29 | def select_return_day(return_day) 30 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnDay")).select_by(:text, return_day) 31 | end 32 | 33 | def select_return_month(return_month) 34 | Selenium::WebDriver::Support::Select.new(driver.find_element(:id, "returnMonth")).select_by(:text, return_month) 35 | end 36 | 37 | def click_continue 38 | driver.find_element(:xpath,"//input[@value='Continue']").click 39 | end 40 | 41 | end 42 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/pages/login_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class LoginPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def login(user, passwd) 10 | driver.find_element(:id, "username").send_keys(user) 11 | driver.find_element(:id, "password").send_keys(passwd) 12 | driver.find_element(:id, "username").submit 13 | end 14 | 15 | end 16 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/pages/passenger_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PassengerPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def enter_first_name(passenger_first_name) 10 | driver.find_element(:name, "passengerFirstName").send_keys(passenger_first_name) 11 | end 12 | 13 | def enter_last_name(passenger_last_name) 14 | driver.find_element(:name, "passengerLastName").send_keys(passenger_last_name) 15 | end 16 | 17 | def click_next 18 | # submit the form, ie click 'Next' 19 | driver.find_element(:name, "passengerLastName").submit 20 | sleep 0.5 21 | end 22 | 23 | end 24 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/pages/payment_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PaymentPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | def enter_holder_name(holder_name) 10 | driver.find_element(:name, "holder_name").send_keys(holder_name) 11 | end 12 | 13 | def enter_card_number(card_number) 14 | driver.find_element(:name, "card_number").send_keys(card_number) 15 | end 16 | 17 | def enter_expiry_month(expiry_month) 18 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_month")).select_by(:text, expiry_month) 19 | end 20 | 21 | def enter_expiry_year(expiry_year) 22 | Selenium::WebDriver::Support::Select.new(driver.find_element(:name, "expiry_year")).select_by(:text, expiry_year) 23 | end 24 | 25 | def click_pay_now 26 | driver.find_element(:xpath,"//input[@value='Pay now']").click 27 | end 28 | 29 | def select_card_type(card_type) 30 | driver.find_element(:xpath, "//input[@name='card_type' and @value='" + card_type + "']").click 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/spec/01_login_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + "/../test_helper.rb" 2 | 3 | # don't use selenium excessive log directly when running in TestWise 4 | # if you want do, use the statement below, and run the test from command line to see debug log 5 | # 6 | # Selenium::WebDriver.logger.level = :debug unless defined?(TestWiseRuntimeSupport) 7 | 8 | describe "User Login" do 9 | include TestHelper 10 | 11 | before(:all) do 12 | # for windows, when unable auto-detect firefox binary 13 | # Please note Firefox on 32 bit is "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" 14 | # Selenium::WebDriver::Firefox::Binary.path="C:/Program Files/Mozilla Firefox/firefox.exe" 15 | 16 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 17 | driver.manage().window().resize_to(1280, 720) 18 | driver.manage().window().move_to(30, 78) 19 | driver.get(site_url) 20 | end 21 | 22 | after(:all) do 23 | driver.quit unless debugging? 24 | end 25 | 26 | it "[1] Can sign in OK" do 27 | visit("/login") 28 | driver.find_element(:id, "username").send_keys("agileway") 29 | driver.find_element(:id, "password").send_keys("testwise") 30 | driver.find_element(:name, "commit").click 31 | # selenium does not have browser.text yet 32 | expect(driver.page_source).to include("Welcome") 33 | driver.find_element(:link_text, "Sign off").click 34 | puts "[stdout] Signed out" 35 | end 36 | 37 | it "[1] User failed to sign in due to invalid password", :tag => "showcase" do 38 | visit("/login") 39 | login_page = LoginPage.new(driver) 40 | login_page.login("agileway", "badpass") 41 | expect(driver.page_source).to include("Invalid email or password") 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/spec/02_flight_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Select Flights" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 8 | driver.manage().window().resize_to(1280, 720) 9 | driver.manage().window().move_to(30, 78) 10 | driver.get(site_url) 11 | 12 | login_page = LoginPage.new(driver) 13 | login_page.login("agileway", "testwise") 14 | end 15 | 16 | before(:each) do 17 | visit("/") 18 | sleep 1 # for some webdriver version, it might not wait page loaded 19 | end 20 | 21 | after(:all) do 22 | driver.quit unless debugging? 23 | end 24 | 25 | it "[3] Return trip" do 26 | flight_page = FlightPage.new(driver) 27 | flight_page.select_trip_type("return") 28 | flight_page.select_depart_from("Sydney") 29 | flight_page.select_arrive_at("New York") 30 | 31 | flight_page.select_depart_day("02") 32 | flight_page.select_depart_month("May 2016") 33 | flight_page.select_return_day("04") 34 | flight_page.select_return_month("June 2016") 35 | flight_page.click_continue 36 | 37 | expect(page_text).to include("2016-05-02 Sydney to New York") 38 | expect(page_text).to include("2016-06-04 New York to Sydney") 39 | end 40 | 41 | it "[2] One-way trip" do 42 | flight_page = FlightPage.new(driver) 43 | flight_page.select_trip_type("oneway") 44 | flight_page.select_trip_type("return") 45 | flight_page.select_depart_from("Sydney") 46 | flight_page.select_arrive_at("New York") 47 | 48 | flight_page.select_depart_day("02") 49 | flight_page.select_depart_month("May 2016") 50 | flight_page.click_continue 51 | 52 | expect(page_text).to include("2016-05-02 Sydney to New York") 53 | end 54 | 55 | 56 | end 57 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/spec/03_passenger_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Passenger" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | # by setting $driver global variable for build_rspec_formatter can save screenshot if error occurs 8 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 9 | driver.manage().window().resize_to(1280, 720) 10 | driver.manage().window().move_to(30, 78) 11 | driver.get(site_url) 12 | 13 | login_page = LoginPage.new(driver) 14 | login_page.login("agileway", "testwise") 15 | end 16 | 17 | after(:all) do 18 | driver.quit unless debugging? 19 | end 20 | 21 | it "[4] Can enter passenger details (using page objects)" do 22 | flight_page = FlightPage.new(driver) 23 | flight_page.select_trip_type("return") 24 | flight_page.select_depart_from("Sydney") 25 | flight_page.select_arrive_at("New York") 26 | 27 | flight_page.select_depart_day("02") 28 | flight_page.select_depart_month("May 2016") 29 | flight_page.select_return_day("04") 30 | flight_page.select_return_month("June 2016") 31 | flight_page.click_continue 32 | 33 | # now on passenger page 34 | passenger_page = PassengerPage.new(driver) 35 | passenger_page.click_next 36 | expect(page_text).to include("Must provide last name") 37 | passenger_page.enter_first_name("Bob") 38 | passenger_page.enter_last_name("Tester") 39 | passenger_page.click_next 40 | 41 | # the step below fails: "Wendy" => "Bob" 42 | expect(driver.find_element(:name, "holder_name").attribute("value")).to eq("Wendy Tester") 43 | end 44 | 45 | end 46 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/spec/04_payment_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Payment" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @driver = $driver = Selenium::WebDriver.for(browser_type, browser_options) 8 | driver.manage().window().resize_to(1280, 720) 9 | driver.manage().window().move_to(30, 78) 10 | driver.get(site_url) 11 | 12 | login_page = LoginPage.new(driver) 13 | login_page.login("agileway", "testwise") 14 | end 15 | 16 | after(:all) do 17 | driver.quit unless debugging? 18 | end 19 | 20 | it "[5] Book flight with payment", :tag => "showcase" do 21 | 22 | flight_page = FlightPage.new(driver) 23 | flight_page.select_trip_type("oneway") 24 | flight_page.select_depart_from("Sydney") 25 | flight_page.select_arrive_at("New York") 26 | 27 | flight_page.select_depart_day("02") 28 | flight_page.select_depart_month("May 2016") 29 | flight_page.click_continue 30 | 31 | # now on passenger page 32 | passenger_page = PassengerPage.new(driver) 33 | passenger_page.enter_last_name("Tester") 34 | passenger_page.click_next 35 | 36 | payment_page = PaymentPage.new(driver) 37 | payment_page.select_card_type("master") 38 | payment_page.enter_holder_name("Bob the Tester") 39 | payment_page.enter_card_number("4242424242424242") 40 | payment_page.enter_expiry_month("04") 41 | payment_page.enter_expiry_year("2016") 42 | payment_page.click_pay_now 43 | try_for(10) { expect(driver.page_source).to include("Booking number")} 44 | puts("booking number: " + driver.find_element(:id, 'booking_number').text) 45 | end 46 | 47 | end 48 | -------------------------------------------------------------------------------- /selenium-webdriver-rspec/spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # spec_helper.rb 2 | 3 | RSpec.configure do |config| 4 | # register around filter that captures stdout and stderr 5 | config.around(:each) do |example| 6 | $stdout = StringIO.new 7 | $stderr = StringIO.new 8 | 9 | example.run 10 | 11 | example.metadata[:stdout] = $stdout.string 12 | example.metadata[:stderr] = $stderr.string 13 | 14 | $stdout = STDOUT 15 | $stderr = STDERR 16 | end 17 | end -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # spec_helper.rb 2 | 3 | # if use below, ci/rspec_reporter does not get output 4 | # only when run in BuildWise Agent, catpure output in result junit xml files 5 | if ENV["RUN_IN_BUILDWISE_AGENT"] == "true" 6 | RSpec.configure do |config| 7 | 8 | 9 | # register around filter that captures stdout and stderr 10 | config.around(:each) do |example| 11 | 12 | stdout, stderr = StringIO.new, StringIO.new 13 | $stdout, $stderr = stdout, stderr 14 | 15 | example.run 16 | 17 | example.metadata[:stdout] = $stdout.string 18 | example.metadata[:stderr] = $stderr.string 19 | 20 | $stdout = STDOUT 21 | $stderr = STDERR 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /user-stories-new.csv: -------------------------------------------------------------------------------- 1 | EXTERNAL_ID,TITLE,DESCRIPTION,POINTS 2 | 1,User can sign in, ,2 3 | 2,User can book an one-way trip,,1 4 | 3,User can book a return trip,,2 5 | 4,User can enter passenger details, , 2 6 | 5,User can book a return trip,,3 7 | 6,User can reset password, , 2 8 | -------------------------------------------------------------------------------- /user-stories.csv: -------------------------------------------------------------------------------- 1 | EXTERNAL_ID,TITLE,DESCRIPTION,POINTS 2 | 1,User can sign in, ,2 3 | 2,User can book an one-way trip,,1 4 | 3,User can book a return trip,,2 5 | 4,User can enter passenger details, , 2 6 | 5,User can book a return trip,,3 7 | -------------------------------------------------------------------------------- /watir-rspec/.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | 3 | -------------------------------------------------------------------------------- /watir-rspec/agiletravel-watir.tpr: -------------------------------------------------------------------------------- 1 | 2 | agiletravel-watir.tpr 3 | WinApp 4 | Chrome 5 | Watir 6 | RSpec 7 | 8 | 9 | https://travel.agileway.net 10 | 11 | 12 | https://travel.agileway.net 13 | 14 | 15 | 16 | 17 | load File.dirname(__FILE__) + '/../test_helper.rb' 18 | 19 | describe "{{ TEST_SUITE }}" do 20 | include TestHelper 21 | 22 | before(:all) do 23 | @browser = Watir::Browser.new(browser_type) 24 | @browser.goto(site_url) 25 | end 26 | 27 | after(:all) do 28 | @browser.close unless debugging? 29 | end 30 | 31 | it "{{ TEST_CASE }}" do 32 | # Test Steps go here 33 | end 34 | 35 | end 36 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 37 | 38 | class {{ PAGE_NAME }} < AbstractPage 39 | 40 | def initialize(driver) 41 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 42 | end 43 | 44 | # page functions here ... 45 | end 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /watir-rspec/agiletravel-watir.tws: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /watir-rspec/buildwise_rspec_formatter.rb: -------------------------------------------------------------------------------- 1 | require 'ci/reporter/rspec' # version 1.0.0 2 | require 'fileutils' 3 | # Overrides default example failed behaviour to add saving screenshot to the reports dir. 4 | # 5 | # Prerequiste: the test script requires defines $driver 6 | # @driver = $driver = Selenium::WebDriver.for(browser_type) 7 | # 8 | # 9 | # Save to folder: ENV['CI_REPORTS'] || reports under current folder 10 | # File name: screenshot-(FULL Test Case Name).png 11 | # 12 | module CI::Reporter 13 | module RSpec3 14 | class Formatter 15 | 16 | def example_failed(notification) 17 | 18 | # In case we fail in before(:all) 19 | example_started(nil) if @suite.testcases.empty? 20 | 21 | failure = Failure.new(notification) 22 | 23 | current_spec.finish 24 | current_spec.name = notification.example.full_description 25 | current_spec.failures << failure 26 | 27 | if $driver && $driver.respond_to?("save_screenshot") # shall be set in test script 28 | reports_dir = ENV['CI_REPORTS'] || File.expand_path("#{Dir.getwd}/spec/reports") 29 | begin 30 | screenshots_dir = File.join(reports_dir, "screenshots") 31 | FileUtils.mkdir_p(screenshots_dir) unless File.exist?(screenshots_dir) 32 | 33 | spec_file_name = File.basename(notification.example.file_path) 34 | saved_to = File.join(screenshots_dir, spec_file_name) 35 | 36 | FileUtils.mkdir_p(saved_to) unless File.exist?(saved_to) 37 | example_name = notification.example.description 38 | # with folder, not using full_description 39 | $driver.save_screenshot(File.join(saved_to, "#{example_name}.png")) 40 | rescue => e 41 | # don't cause build to stop if errors happens 42 | fio = File.open( File.join(reports_dir, "error.log"), "a") 43 | fio.puts(e) 44 | fio.puts(e.backtrace) 45 | fio.flush 46 | fio.close 47 | end 48 | 49 | end 50 | 51 | end 52 | 53 | end 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /watir-rspec/install-lib.cmd: -------------------------------------------------------------------------------- 1 | gem install rspec ci_reporter_rspec selenium-webdriver watir webdrivers -------------------------------------------------------------------------------- /watir-rspec/pages/abstract_page.rb: -------------------------------------------------------------------------------- 1 | require "#{File.dirname(__FILE__)}/../agileway_utils.rb" 2 | 3 | # This is the parent page for all page objects, for operations across all pages, define here 4 | class AbstractPage 5 | 6 | # If want to use utility methods such as fail_safe { }, uncomment the line below 7 | # 8 | include AgilewayUtils 9 | 10 | # If want to use debug('message') to TestWise Console, uncomment the statements below 11 | # 12 | if defined?(TestWiseRuntimeSupport) 13 | include TestWiseRuntimeSupport 14 | end 15 | 16 | def initialize(driver, text = "") 17 | @driver = driver 18 | raise "Page text '#{text}' not found on #{self.class.name}" unless driver.text.include?(text) 19 | end 20 | 21 | def driver 22 | @driver 23 | end 24 | alias browser driver 25 | 26 | 27 | end 28 | -------------------------------------------------------------------------------- /watir-rspec/pages/confirmation_page.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/abstract_page.rb' 2 | 3 | class ConfirmationPage < AbstractPage 4 | 5 | def initialize(browser) 6 | super(browser, "") 7 | end 8 | 9 | end 10 | -------------------------------------------------------------------------------- /watir-rspec/pages/flight_page.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/abstract_page.rb' 2 | 3 | class FlightPage < AbstractPage 4 | 5 | def initialize(browser) 6 | super(browser, "Select Flight") 7 | end 8 | 9 | def select_depart_from(depart_from) 10 | browser.select_list(name: "fromPort").select(depart_from) 11 | end 12 | 13 | def select_depart_month(depart_month) 14 | browser.select_list(id: "departMonth").select(depart_month) 15 | end 16 | 17 | def select_depart_day(depart_day) 18 | browser.select_list(name: "departDay").select(depart_day) 19 | end 20 | 21 | def select_arrive_at(arriving_in) 22 | browser.select_list(name: "toPort").select(arriving_in) 23 | end 24 | 25 | def select_return_month(return_month) 26 | browser.select_list(id: "returnMonth").select(return_month) 27 | end 28 | 29 | def select_return_day(return_day) 30 | browser.select_list(name: "returnDay").select(return_day) 31 | end 32 | 33 | def select_service_class(service_class) 34 | browser.radio(name: "servClass", value: service_class).click 35 | end 36 | 37 | def select_trip_type(trip_type) 38 | browser.radio(name: "tripType", value: trip_type).click 39 | end 40 | 41 | def click_continue 42 | browser.button(value: "Continue").click 43 | PassengerPage.new(browser) 44 | end 45 | 46 | end 47 | -------------------------------------------------------------------------------- /watir-rspec/pages/home_page.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/abstract_page.rb' 2 | 3 | class HomePage < AbstractPage 4 | 5 | def initialize(browser) 6 | # the super() calles the initialize() in parent class, in this case, web_page.rb 7 | super(browser, "Agile Travel") 8 | 9 | end 10 | 11 | def enter_user_name(user_name) 12 | browser.text_field(name: "username").set(user_name) 13 | end 14 | 15 | def enter_password(password) 16 | browser.text_field(name: "password").set(password) 17 | end 18 | 19 | def click_sign_in 20 | # browser.button(:src, /btn_signin\.gif/).click 21 | browser.button(value: "Sign in").click 22 | end 23 | 24 | end 25 | -------------------------------------------------------------------------------- /watir-rspec/pages/passenger_page.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/abstract_page.rb' 2 | 3 | class PassengerPage < AbstractPage 4 | 5 | def initialize(browser) 6 | super(browser, "Passenger") 7 | end 8 | 9 | def enter_first_name(first_name) 10 | browser.text_field(name: "passengerFirstName").set first_name 11 | end 12 | 13 | def enter_last_name(last_name) 14 | browser.text_field(name: "passengerLastName").set last_name 15 | end 16 | 17 | def click_next 18 | browser.button(value: "Next").click 19 | ConfirmationPage.new(browser) 20 | end 21 | 22 | end 23 | -------------------------------------------------------------------------------- /watir-rspec/pages/payment_page.rb: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(__FILE__), "abstract_page.rb") 2 | 3 | class PaymentPage < AbstractPage 4 | 5 | def initialize(driver) 6 | super(driver, "") # <= TEXT UNIQUE TO THIS PAGE 7 | end 8 | 9 | 10 | def enter_holder_name(holder_name) 11 | browser.text_field(name: "holder_name").set(holder_name) 12 | end 13 | 14 | def enter_card_number(card_number) 15 | browser.text_field(name: "card_number").set(card_number) 16 | end 17 | 18 | def enter_expiry_month(expiry_month) 19 | browser.select_list(name: "expiry_month").select(expiry_month) 20 | end 21 | 22 | def enter_expiry_year(expiry_year) 23 | browser.select_list(name: "expiry_year").select(expiry_year) 24 | end 25 | 26 | def click_pay_now 27 | browser.button(:value, "Pay now").click 28 | end 29 | 30 | def select_card_type(card_type) 31 | browser.radio(name: "card_type", value: card_type).click 32 | end 33 | 34 | end 35 | -------------------------------------------------------------------------------- /watir-rspec/spec/flight_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Select Flights" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @browser = Watir::Browser.new(browser_type) 8 | @browser.goto(site_url) 9 | login_as("agileway", "testwise") 10 | end 11 | 12 | before(:each) do 13 | browser.goto(site_url) 14 | end 15 | 16 | after(:all) do 17 | browser.close unless debugging? 18 | end 19 | 20 | it "Return trip" do 21 | 22 | flight_page = FlightPage.new(browser) 23 | flight_page.select_trip_type("return") 24 | flight_page.select_depart_from("Sydney") 25 | flight_page.select_arrive_at("New York") 26 | 27 | flight_page.select_depart_day("02") 28 | flight_page.select_depart_month("May 2016") 29 | flight_page.select_return_day("04") 30 | flight_page.select_return_month("June 2016") 31 | flight_page.click_continue 32 | 33 | expect(browser.text).to include("2016-05-02 Sydney to New York") 34 | expect(browser.text).to include("2016-06-04 New York to Sydney") 35 | end 36 | 37 | it "One-way trip" do 38 | flight_page = FlightPage.new(browser) 39 | flight_page.select_trip_type("oneway") 40 | expect(browser.div(id: "returnTrip").present?).to be_falsey 41 | 42 | flight_page.select_trip_type("return") 43 | flight_page.select_depart_from("Sydney") 44 | flight_page.select_arrive_at("New York") 45 | 46 | flight_page.select_depart_day("02") 47 | flight_page.select_depart_month("May 2016") 48 | flight_page.click_continue 49 | 50 | expect(browser.text).to include("2016-05-02 Sydney to New York") 51 | end 52 | 53 | 54 | end 55 | -------------------------------------------------------------------------------- /watir-rspec/spec/login_spec.rb: -------------------------------------------------------------------------------- 1 | load File.join(File.dirname(__FILE__), "..", "test_helper.rb") 2 | 3 | # These lines are comments (starting with #) 4 | # 5 | describe "User Login" do 6 | include TestHelper 7 | 8 | before(:all) do 9 | @browser = Watir::Browser.new(browser_type) 10 | end 11 | 12 | before(:each) do 13 | browser.goto "https://travel.agileway.net" 14 | end 15 | 16 | after(:each) do 17 | failsafe { browser.link(text: "Sign off").click } unless debugging? 18 | end 19 | 20 | after(:all) do 21 | @browser.close unless debugging? 22 | end 23 | 24 | 25 | it "Login OK" do 26 | home_page = HomePage.new(browser) 27 | home_page.enter_user_name "agileway" 28 | home_page.enter_password "testwise" 29 | home_page.click_sign_in 30 | try_for(3) { expect(browser.text).to include("Welcome agileway") } 31 | end 32 | 33 | 34 | it "Login failed (incorrect password)" do 35 | home_page = HomePage.new(browser) 36 | home_page.enter_user_name "agileway" 37 | home_page.enter_password "badPass" 38 | home_page.click_sign_in 39 | try_for(3) { expect(browser.text).to include("Invalid email or password") } 40 | end 41 | 42 | end 43 | -------------------------------------------------------------------------------- /watir-rspec/spec/passenger_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Passenger" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @browser = Watir::Browser.new(browser_type) 8 | @browser.goto(site_url) 9 | login_as("agileway", "testwise") 10 | end 11 | 12 | after(:all) do 13 | @browser.close unless debugging? 14 | end 15 | 16 | it "Can enter passenger details (using page objects)" do 17 | flight_page = FlightPage.new(browser) 18 | flight_page.select_trip_type("return") 19 | flight_page.select_depart_from("Sydney") 20 | flight_page.select_arrive_at("New York") 21 | 22 | flight_page.select_depart_day("02") 23 | flight_page.select_depart_month("May 2016") 24 | flight_page.select_return_day("04") 25 | flight_page.select_return_month("June 2016") 26 | flight_page.click_continue 27 | 28 | # now on passenger page 29 | passenger_page = PassengerPage.new(browser) 30 | passenger_page.click_next 31 | try_for(3) { expect(browser.text).to include("Must provide last name") } 32 | passenger_page.enter_first_name("Bob") 33 | passenger_page.enter_last_name("Tester") 34 | passenger_page.click_next 35 | 36 | expect(browser.text_field(name: "holder_name").attribute_value("value")).to eq("Bob Tester") 37 | end 38 | 39 | end 40 | -------------------------------------------------------------------------------- /watir-rspec/spec/payment_spec.rb: -------------------------------------------------------------------------------- 1 | load File.dirname(__FILE__) + '/../test_helper.rb' 2 | 3 | describe "Payment" do 4 | include TestHelper 5 | 6 | before(:all) do 7 | @browser = Watir::Browser.new(browser_type) 8 | @browser.goto(site_url) 9 | login_as("agileway", "testwise") 10 | end 11 | 12 | after(:all) do 13 | @browser.close unless debugging? 14 | end 15 | 16 | it "Get booking confirmation after payment " do 17 | 18 | flight_page = FlightPage.new(browser) 19 | flight_page.select_trip_type("oneway") 20 | flight_page.select_depart_from("Sydney") 21 | flight_page.select_arrive_at("New York") 22 | 23 | flight_page.select_depart_day("02") 24 | flight_page.select_depart_month("May 2016") 25 | flight_page.click_continue 26 | 27 | # now on passenger page 28 | passenger_page = PassengerPage.new(browser) 29 | passenger_page.enter_last_name("Tester") 30 | passenger_page.click_next 31 | 32 | payment_page = PaymentPage.new(browser) 33 | try_for(3) { payment_page.select_card_type("master") } 34 | payment_page.enter_holder_name("Bob the Tester") 35 | payment_page.enter_card_number("4242424242424242") 36 | payment_page.enter_expiry_month("04") 37 | payment_page.enter_expiry_year("2016") 38 | payment_page.click_pay_now 39 | Watir::Wait.until{ browser.text.include?("Booking number") } 40 | puts browser.span(id: "booking_number").text 41 | end 42 | 43 | end 44 | -------------------------------------------------------------------------------- /watir-rspec/spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # spec_helper.rb 2 | 3 | RSpec.configure do |config| 4 | # register around filter that captures stdout and stderr 5 | config.around(:each) do |example| 6 | $stdout = StringIO.new 7 | $stderr = StringIO.new 8 | 9 | example.run 10 | 11 | example.metadata[:stdout] = $stdout.string 12 | example.metadata[:stderr] = $stderr.string 13 | 14 | $stdout = STDOUT 15 | $stderr = STDERR 16 | end 17 | end --------------------------------------------------------------------------------