├── .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, "") # <= 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
--------------------------------------------------------------------------------