testcentricity_web 4.1.6 → 4.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/Gemfile.lock +2 -2
- data/Rakefile +32 -9
- data/config/cucumber.yml +20 -7
- data/config/test_data/data.json +12 -0
- data/config/test_data/data.xls +0 -0
- data/config/test_data/data.yml +12 -0
- data/features/basic_test_page_css.feature +11 -0
- data/features/basic_test_page_xpath.feature +3 -0
- data/features/media_players.feature +87 -0
- data/features/step_definitions/generic_steps.rb.rb +7 -0
- data/features/step_definitions/media_steps.rb +30 -0
- data/features/support/env.rb +14 -7
- data/features/support/pages/base_test_page.rb +11 -0
- data/features/support/pages/basic_css_test_page.rb +8 -5
- data/features/support/pages/basic_test_page.rb +67 -8
- data/features/support/pages/basic_xpath_test_page.rb +8 -4
- data/features/support/pages/custom_controls_page.rb +16 -0
- data/features/support/pages/indexed_sections_page.rb +16 -0
- data/features/support/pages/media_test_page.rb +195 -0
- data/features/support/sections/header_nav.rb +28 -0
- data/features/support/world_data.rb +12 -0
- data/features/support/world_pages.rb +3 -0
- data/lib/testcentricity_web/data_objects/environment.rb +12 -0
- data/lib/testcentricity_web/version.rb +1 -1
- data/lib/testcentricity_web/web_core/page_object.rb +1 -8
- data/lib/testcentricity_web/web_elements/checkbox.rb +3 -4
- data/lib/testcentricity_web/web_elements/media.rb +50 -4
- data/lib/testcentricity_web/web_elements/radio.rb +5 -1
- data/test_site/basic_test_page.html +51 -1
- data/test_site/custom_controls_page.html +58 -0
- data/test_site/indexed_sections_page.html +58 -0
- data/test_site/media/MIB2-subtitles-pt-BR.vtt +49 -0
- data/test_site/media/MIB2.mp4 +0 -0
- data/test_site/media_page.html +60 -7
- metadata +25 -4
- data/features/support/pages/media_page.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58ddfdbcb8747347fcb06efdd2a888509fa904bd5541a0f3d4d303af6469552c
|
4
|
+
data.tar.gz: 14f9af8661d7e571d10f79e3d093cafa4e744388d5c1d6f9232e207fe5e82d6f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 768e113468d0dfc68f01467bc4304f41903bff09f59db9f2c8dd013545c061523c7e0947669d1befadcf43b1187e57df3cb188d803b3d802d905c0c3467ce852
|
7
|
+
data.tar.gz: 3133dc1f23ff3a839c45e2c6424d152f6c85916497c00dd9a815113f2acb8225f45efab91ce9d7cb4ada454d33115649ad61f4073f109a7dec44e40891971043
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,25 @@
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
4
|
|
5
|
+
## [4.1.7] - 28-MAR-2022
|
6
|
+
|
7
|
+
### Fixed
|
8
|
+
* `CheckBox.set_checkbox_state` and `Radio.set_selected_state` work on iOS simulators again.
|
9
|
+
|
10
|
+
### Changes
|
11
|
+
* `Audio.playback_rate` and `Video.playback_rate` now return value as a `Float` instead of a `String`.
|
12
|
+
* `Audio.default_playback_rate` and `Video.default_playback_rate` now return value as a `Float` instead of a `String`.
|
13
|
+
* `Audio.current_time` and `Video.current_time` now return value as a `Float` rounded to two decimal places.
|
14
|
+
* `Audio.duration` and `Video.duration` now return value as a `Float` rounded to two decimal places.
|
15
|
+
|
16
|
+
### Added
|
17
|
+
* `Audio.mute` and `Video.mute` methods added.
|
18
|
+
* `Audio.unmute` and `Video.unmute` methods added.
|
19
|
+
* `Audio.playback_rate` and `Video.playback_rate` now accept a `Float` value as an input for setting the playback rate
|
20
|
+
of media.
|
21
|
+
* `Audio.volume` and `Video.volume` now accept a `Float` value between 0 and 1 as an input for setting the volume of media.
|
22
|
+
|
23
|
+
|
5
24
|
## [4.1.6] - 21-MAR-2022
|
6
25
|
|
7
26
|
### Fixed
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
testcentricity_web (4.1.
|
4
|
+
testcentricity_web (4.1.7)
|
5
5
|
appium_lib
|
6
6
|
browserstack-local
|
7
7
|
capybara (>= 3.1, < 4)
|
@@ -50,7 +50,7 @@ GEM
|
|
50
50
|
chronic (0.10.2)
|
51
51
|
coercible (1.0.0)
|
52
52
|
descendants_tracker (~> 0.0.1)
|
53
|
-
concurrent-ruby (1.1.
|
53
|
+
concurrent-ruby (1.1.10)
|
54
54
|
cucumber (7.1.0)
|
55
55
|
builder (~> 3.2, >= 3.2.4)
|
56
56
|
cucumber-core (~> 10.1, >= 10.1.0)
|
data/Rakefile
CHANGED
@@ -5,12 +5,12 @@ require 'rake'
|
|
5
5
|
|
6
6
|
|
7
7
|
namespace :features do
|
8
|
-
Cucumber::Rake::Task.new(:
|
9
|
-
t.profile = '
|
8
|
+
Cucumber::Rake::Task.new(:edge_local) do |t|
|
9
|
+
t.profile = 'edge_local'
|
10
10
|
end
|
11
11
|
|
12
|
-
Cucumber::Rake::Task.new(:
|
13
|
-
t.profile = '
|
12
|
+
Cucumber::Rake::Task.new(:chrome_local) do |t|
|
13
|
+
t.profile = 'chrome_local'
|
14
14
|
end
|
15
15
|
|
16
16
|
Cucumber::Rake::Task.new(:edge_headless) do |t|
|
@@ -21,17 +21,40 @@ namespace :features do
|
|
21
21
|
t.profile = 'chrome_headless'
|
22
22
|
end
|
23
23
|
|
24
|
-
Cucumber::Rake::Task.new(:
|
25
|
-
t.profile = '
|
24
|
+
Cucumber::Rake::Task.new(:safari_local) do |t|
|
25
|
+
t.profile = 'safari_local'
|
26
26
|
end
|
27
27
|
|
28
|
-
Cucumber::Rake::Task.new(:
|
29
|
-
t.profile = '
|
28
|
+
Cucumber::Rake::Task.new(:firefox_local) do |t|
|
29
|
+
t.profile = 'firefox_local'
|
30
30
|
end
|
31
31
|
|
32
32
|
Cucumber::Rake::Task.new(:firefox_headless) do |t|
|
33
33
|
t.profile = 'firefox_headless'
|
34
34
|
end
|
35
35
|
|
36
|
-
|
36
|
+
Cucumber::Rake::Task.new(:edge_grid) do |t|
|
37
|
+
t.profile = 'edge_grid'
|
38
|
+
end
|
39
|
+
|
40
|
+
Cucumber::Rake::Task.new(:chrome_grid) do |t|
|
41
|
+
t.profile = 'chrome_grid'
|
42
|
+
end
|
43
|
+
|
44
|
+
Cucumber::Rake::Task.new(:firefox_grid) do |t|
|
45
|
+
t.profile = 'firefox_grid'
|
46
|
+
end
|
47
|
+
|
48
|
+
Cucumber::Rake::Task.new(:ios_remote) do |t|
|
49
|
+
t.profile = 'ios_remote'
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
task :required => [:edge_local, :edge_headless, :chrome_local, :chrome_headless, :safari_local]
|
54
|
+
|
55
|
+
task :grid => [:edge_grid, :chrome_grid]
|
56
|
+
|
57
|
+
task :mobile => [:ios_remote]
|
58
|
+
|
59
|
+
task :all => [:edge_local, :edge_headless, :chrome_local, :chrome_headless, :safari_local, :edge_grid, :chrome_grid, :ios_remote]
|
37
60
|
end
|
data/config/cucumber.yml
CHANGED
@@ -25,20 +25,29 @@ parallel: PARALLEL=true REPORTING=true --require features --format pretty --form
|
|
25
25
|
# profiles for locally hosted desktop web browsers
|
26
26
|
#==============
|
27
27
|
|
28
|
-
|
28
|
+
local: TEST_ENVIRONMENT=LOCAL
|
29
|
+
chrome: WEB_BROWSER=chrome DATA_SOURCE=yaml <%= desktop %>
|
30
|
+
edge: WEB_BROWSER=edge DATA_SOURCE=json <%= desktop %>
|
31
|
+
safari: WEB_BROWSER=safari DATA_SOURCE=Excel <%= desktop %>
|
29
32
|
firefox: WEB_BROWSER=firefox <%= desktop %>
|
30
|
-
edge: WEB_BROWSER=edge <%= desktop %>
|
31
|
-
safari: WEB_BROWSER=safari <%= desktop %>
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
chrome_local: --profile local --profile chrome
|
35
|
+
edge_local: --profile local --profile edge
|
36
|
+
safari_local: --profile local --profile safari
|
37
|
+
firefox_local: --profile local --profile firefox
|
38
|
+
|
39
|
+
firefox_headless: --profile local WEB_BROWSER=firefox_headless <%= desktop %>
|
40
|
+
chrome_headless: --profile local WEB_BROWSER=chrome_headless <%= desktop %>
|
41
|
+
edge_headless: --profile local WEB_BROWSER=edge_headless <%= desktop %>
|
36
42
|
|
37
43
|
|
38
44
|
#==============
|
39
45
|
# profile for Selenium Grid and Dockerized Selenium Grid hosted desktop web browsers
|
40
46
|
#==============
|
41
|
-
grid:
|
47
|
+
grid: SELENIUM=remote TEST_ENVIRONMENT=REMOTE REMOTE_ENDPOINT="http://localhost:4444/wd/hub"
|
48
|
+
chrome_grid: --profile grid --profile chrome
|
49
|
+
edge_grid: --profile grid --profile edge
|
50
|
+
firefox_grid: --profile grid --profile firefox
|
42
51
|
|
43
52
|
|
44
53
|
#==============
|
@@ -66,6 +75,8 @@ app_ios_15: --profile appium_ios APP_VERSION="15.4"
|
|
66
75
|
ipad_pro_12_15_sim: --profile app_ios_15 DEVICE_TYPE=tablet APP_DEVICE="iPad Pro (12.9-inch) (5th generation)"
|
67
76
|
ipad_air_15_sim: --profile app_ios_15 DEVICE_TYPE=tablet APP_DEVICE="iPad Air (5th generation)" <%= desktop %>
|
68
77
|
|
78
|
+
ios_remote: --profile ipad_pro_12_15_sim --profile run_appium ORIENTATION=portrait TEST_ENVIRONMENT=REMOTE
|
79
|
+
|
69
80
|
|
70
81
|
#==============
|
71
82
|
# profiles for Android mobile web browsers hosted within Android Studio Android Virtual Device emulators
|
@@ -76,6 +87,8 @@ appium_android: WEB_BROWSER=appium APP_PLATFORM_NAME="Android" <%= desktop %>
|
|
76
87
|
app_android_12: --profile appium_android APP_BROWSER="Chrome" APP_VERSION="12.0"
|
77
88
|
pixel_c_api31_sim: --profile app_android_12 DEVICE_TYPE=tablet APP_DEVICE="Pixel_C_API_31"
|
78
89
|
|
90
|
+
android_remote: --profile pixel_c_api31_sim --profile run_appium ORIENTATION=portrait TEST_ENVIRONMENT=REMOTE
|
91
|
+
|
79
92
|
|
80
93
|
#==============
|
81
94
|
# profiles for remotely hosted web browsers on the BrowserStack service
|
Binary file
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# -------------------------------------------------------------
|
2
|
+
# This is the generic test data required to run the UAL Flight Booking test suites against the QA and PROD test environments.
|
3
|
+
# -------------------------------------------------------------
|
4
|
+
|
5
|
+
# This section is populated with Environment data required to execute automated test suites on all supported environments
|
6
|
+
Environments:
|
7
|
+
LOCAL:
|
8
|
+
PROTOCOL: "file"
|
9
|
+
BASE_URL: "/../../test_site"
|
10
|
+
REMOTE:
|
11
|
+
PROTOCOL: "http"
|
12
|
+
BASE_URL: "192.168.1.129/test_site"
|
@@ -22,3 +22,14 @@ Feature: Basic HTML Test Page using CSS locators
|
|
22
22
|
Then I expect the form fields to be correctly populated
|
23
23
|
When I cancel my changes
|
24
24
|
Then I expect the Basic CSS Test page to be correctly displayed
|
25
|
+
|
26
|
+
|
27
|
+
Scenario Outline: Verify functionality of navigation tabs
|
28
|
+
When I click the <target_page> navigation tab
|
29
|
+
Then I expect the <target_page> page to be correctly displayed
|
30
|
+
|
31
|
+
Examples:
|
32
|
+
|target_page |
|
33
|
+
|Media Test |
|
34
|
+
|Indexed Sections |
|
35
|
+
|Custom Controls |
|
@@ -0,0 +1,87 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
Feature: Basic HTML Test Page using CSS locators
|
5
|
+
In order to xxx
|
6
|
+
As a xxxx
|
7
|
+
I expect to xxxx
|
8
|
+
|
9
|
+
|
10
|
+
Background:
|
11
|
+
Given I am on the Media Test page
|
12
|
+
|
13
|
+
|
14
|
+
Scenario: Verify video player play and pause controls
|
15
|
+
When I play the video media
|
16
|
+
Then the video should be playing
|
17
|
+
When I pause the video media
|
18
|
+
Then the video should be paused
|
19
|
+
|
20
|
+
|
21
|
+
Scenario: Verify audio player play and pause controls
|
22
|
+
When I play the audio media
|
23
|
+
Then the audio should be playing
|
24
|
+
When I pause the audio media
|
25
|
+
Then the audio should be paused
|
26
|
+
|
27
|
+
|
28
|
+
Scenario: Verify video player mute control
|
29
|
+
When I mute the video media
|
30
|
+
Then the video should be muted
|
31
|
+
When I unmute the video media
|
32
|
+
Then the video should be unmuted
|
33
|
+
|
34
|
+
|
35
|
+
Scenario: Verify audio player mute control
|
36
|
+
When I mute the audio media
|
37
|
+
Then the audio should be muted
|
38
|
+
When I unmute the audio media
|
39
|
+
Then the audio should be unmuted
|
40
|
+
|
41
|
+
|
42
|
+
Scenario: Verify video player volume control
|
43
|
+
When I set the volume of the video to .5
|
44
|
+
Then the video should have a volume of .5
|
45
|
+
|
46
|
+
|
47
|
+
Scenario: Verify audio player volume control
|
48
|
+
When I set the volume of the audio to .5
|
49
|
+
Then the audio should have a volume of .5
|
50
|
+
|
51
|
+
|
52
|
+
Scenario: Verify video playback speed settings
|
53
|
+
When I play the video with a playback speed of 2x
|
54
|
+
Then the video should play at 2x speed
|
55
|
+
When I play the video with a playback speed of 0.25x
|
56
|
+
Then the video should play at 0.25x speed
|
57
|
+
When I play the video with a playback speed of 1.75x
|
58
|
+
Then the video should play at 1.75x speed
|
59
|
+
When I play the video with a playback speed of 0.5x
|
60
|
+
Then the video should play at 0.5x speed
|
61
|
+
When I play the video with a playback speed of 1.5x
|
62
|
+
Then the video should play at 1.5x speed
|
63
|
+
When I play the video with a playback speed of 0.75x
|
64
|
+
Then the video should play at 0.75x speed
|
65
|
+
When I play the video with a playback speed of 1.25x
|
66
|
+
Then the video should play at 1.25x speed
|
67
|
+
When I play the video with a playback speed of 1x
|
68
|
+
Then the video should play at 1x speed
|
69
|
+
|
70
|
+
|
71
|
+
Scenario: Verify audio playback speed settings
|
72
|
+
When I play the audio with a playback speed of 2x
|
73
|
+
Then the audio should play at 2x speed
|
74
|
+
When I play the audio with a playback speed of 0.25x
|
75
|
+
Then the audio should play at 0.25x speed
|
76
|
+
When I play the audio with a playback speed of 1.75x
|
77
|
+
Then the audio should play at 1.75x speed
|
78
|
+
When I play the audio with a playback speed of 0.5x
|
79
|
+
Then the audio should play at 0.5x speed
|
80
|
+
When I play the audio with a playback speed of 1.5x
|
81
|
+
Then the audio should play at 1.5x speed
|
82
|
+
When I play the audio with a playback speed of 0.75x
|
83
|
+
Then the audio should play at 0.75x speed
|
84
|
+
When I play the audio with a playback speed of 1.25x
|
85
|
+
Then the audio should play at 1.25x speed
|
86
|
+
When I play the audio with a playback speed of 1x
|
87
|
+
Then the audio should play at 1x speed
|
@@ -35,3 +35,10 @@ end
|
|
35
35
|
Then(/^I expect the tab order to be correct$/) do
|
36
36
|
PageManager.current_page.verify_tab_order
|
37
37
|
end
|
38
|
+
|
39
|
+
|
40
|
+
When(/^I click the (.*) navigation (?:tab|link)$/) do |page_name|
|
41
|
+
# find and navigate to the specified target page
|
42
|
+
target_page = PageManager.find_page(page_name)
|
43
|
+
target_page.navigate_to
|
44
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
When(/^I (.*) the (.*) media$/) do |action, media_type|
|
4
|
+
media_test_page.perform_action(media_type, action)
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
Then(/^the (.*) should be (.*)$/) do |media_type, state|
|
9
|
+
media_test_page.verify_media_state(media_type, state)
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
When(/^I play the (.*) with a playback speed of (.*)x$/) do |media_type, rate|
|
14
|
+
media_test_page.set_playback_rate(media_type, rate)
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
Then(/^the (.*) should play at (.*)x speed$/) do |media_type, rate|
|
19
|
+
media_test_page.verify_playback_rate(media_type, rate)
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
When(/^I set the volume of the (.*) to (.*)$/) do |media_type, volume|
|
24
|
+
media_test_page.set_volume(media_type, volume)
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
Then(/^the (.*) should have a volume of (.*)$/) do |media_type, volume|
|
29
|
+
media_test_page.verify_volume(media_type, volume)
|
30
|
+
end
|
data/features/support/env.rb
CHANGED
@@ -5,13 +5,15 @@ require 'require_all'
|
|
5
5
|
require 'simplecov'
|
6
6
|
require 'testcentricity_web'
|
7
7
|
|
8
|
-
|
8
|
+
include TestCentricity
|
9
|
+
|
10
|
+
SimpleCov.command_name("features-#{ENV['WEB_BROWSER']}-#{ENV['SELENIUM']}" + (ENV['TEST_ENV_NUMBER'] || ''))
|
9
11
|
|
10
12
|
# require_relative 'world_data'
|
11
13
|
require_relative 'world_pages'
|
12
14
|
|
13
15
|
# require_rel 'data'
|
14
|
-
|
16
|
+
require_rel 'sections'
|
15
17
|
require_rel 'pages'
|
16
18
|
|
17
19
|
$LOAD_PATH << './lib'
|
@@ -27,8 +29,9 @@ I18n.locale = ENV['LOCALE']
|
|
27
29
|
Faker::Config.locale = ENV['LOCALE']
|
28
30
|
|
29
31
|
# instantiate all data objects and target test environment
|
30
|
-
|
31
|
-
|
32
|
+
include WorldData
|
33
|
+
ENV['DATA_SOURCE'] = 'yaml' unless ENV['DATA_SOURCE']
|
34
|
+
environs.find_environ(ENV['TEST_ENVIRONMENT'], ENV['DATA_SOURCE'].downcase.to_sym)
|
32
35
|
# WorldData.instantiate_data_objects
|
33
36
|
|
34
37
|
# instantiate all page objects
|
@@ -38,6 +41,10 @@ WorldPages.instantiate_page_objects
|
|
38
41
|
# establish connection to WebDriver and target web browser
|
39
42
|
Webdrivers.cache_time = 86_400
|
40
43
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
+
|
45
|
+
url = if ENV['TEST_ENVIRONMENT'].downcase == 'local'
|
46
|
+
"file://#{File.dirname(__FILE__)}/../../test_site"
|
47
|
+
else
|
48
|
+
Environ.current.app_host
|
49
|
+
end
|
50
|
+
WebDriverConnect.initialize_web_driver(app_host: url)
|
@@ -12,8 +12,8 @@ class BasicCSSTestPage < BasicTestPage
|
|
12
12
|
number_field: 'input#number-field',
|
13
13
|
color_picker: 'input#color-picker',
|
14
14
|
comments_field: 'textarea#comments'
|
15
|
-
|
16
|
-
|
15
|
+
ranges slider: 'input#slider'
|
16
|
+
filefields upload_file: 'input#filename'
|
17
17
|
checkboxes check_1: 'input#check1',
|
18
18
|
check_2: 'input#check2',
|
19
19
|
check_3: 'input#check3',
|
@@ -24,14 +24,16 @@ class BasicCSSTestPage < BasicTestPage
|
|
24
24
|
radio_4: 'input#radio4'
|
25
25
|
selectlists multi_select: 'select#multipleselect',
|
26
26
|
drop_down_select: 'select#dropdown'
|
27
|
-
|
27
|
+
links link_1: 'a#link1',
|
28
|
+
link_2: 'a#link2',
|
29
|
+
link_3: 'a#link3'
|
30
|
+
tables static_table: 'table#table'
|
28
31
|
images image_1: 'img#image1',
|
29
32
|
image_2: 'img#image2',
|
30
33
|
image_3: 'img#image3'
|
31
34
|
buttons cancel_button: 'input#cancel',
|
32
35
|
submit_button: 'input#submit'
|
33
|
-
labels
|
34
|
-
username_label: "label[for='username']",
|
36
|
+
labels username_label: "label[for='username']",
|
35
37
|
password_label: "label[for='password']",
|
36
38
|
max_length_label: "label[for='maxlength']",
|
37
39
|
read_only_label: "label[for='readonly']",
|
@@ -44,6 +46,7 @@ class BasicCSSTestPage < BasicTestPage
|
|
44
46
|
radios_label: 'label#radios',
|
45
47
|
multiselect_label: "label[for='multipleselect']",
|
46
48
|
dropdown_label: "label[for='dropdown']",
|
49
|
+
link_label: 'label#links',
|
47
50
|
table_label: "label[for='table']",
|
48
51
|
images_label: 'label#images'
|
49
52
|
end
|
@@ -1,8 +1,40 @@
|
|
1
1
|
# Page Object class definition for Basic HTML Test page
|
2
2
|
|
3
|
-
class BasicTestPage <
|
3
|
+
class BasicTestPage < BaseTestPage
|
4
4
|
trait(:page_url) { '/basic_test_page.html' }
|
5
|
+
trait(:navigator) { header_nav.open_form_page }
|
5
6
|
trait(:tab_order) {
|
7
|
+
[
|
8
|
+
header_nav.form_link,
|
9
|
+
header_nav.media_link,
|
10
|
+
header_nav.indexed_sections_link,
|
11
|
+
header_nav.custom_controls_link,
|
12
|
+
username_field,
|
13
|
+
password_field,
|
14
|
+
max_length_field,
|
15
|
+
read_only_field,
|
16
|
+
number_field,
|
17
|
+
color_picker,
|
18
|
+
slider,
|
19
|
+
comments_field,
|
20
|
+
upload_file,
|
21
|
+
check_1,
|
22
|
+
check_2,
|
23
|
+
check_3,
|
24
|
+
radio_1,
|
25
|
+
[
|
26
|
+
radio_2,
|
27
|
+
radio_3
|
28
|
+
],
|
29
|
+
multi_select,
|
30
|
+
drop_down_select,
|
31
|
+
link_1,
|
32
|
+
link_2,
|
33
|
+
cancel_button,
|
34
|
+
submit_button
|
35
|
+
]
|
36
|
+
}
|
37
|
+
trait(:firefox_order) {
|
6
38
|
[
|
7
39
|
username_field,
|
8
40
|
password_field,
|
@@ -112,6 +144,22 @@ class BasicTestPage < TestCentricity::PageObject
|
|
112
144
|
options: ['Drop Down Item 1', 'Drop Down Item 2', 'Drop Down Item 3', 'Drop Down Item 4', 'Drop Down Item 5', 'Drop Down Item 6'],
|
113
145
|
selected: 'Drop Down Item 1'
|
114
146
|
},
|
147
|
+
link_label => { visible: true, caption: 'Links:' },
|
148
|
+
link_1 => {
|
149
|
+
visible: true,
|
150
|
+
href: { ends_with: 'media_page.html' },
|
151
|
+
caption: 'Open Media Page in same window/tab'
|
152
|
+
},
|
153
|
+
link_2 => {
|
154
|
+
visible: true,
|
155
|
+
href: { ends_with: 'media_page.html' },
|
156
|
+
caption: 'Open Media Page in a new window/tab'
|
157
|
+
},
|
158
|
+
link_3 => {
|
159
|
+
visible: true,
|
160
|
+
aria_disabled: true,
|
161
|
+
caption: 'Disabled Link'
|
162
|
+
},
|
115
163
|
table_label => { visible: true, caption: 'Table:' },
|
116
164
|
static_table => {
|
117
165
|
visible: true,
|
@@ -149,22 +197,30 @@ class BasicTestPage < TestCentricity::PageObject
|
|
149
197
|
end
|
150
198
|
|
151
199
|
def form_data
|
152
|
-
|
200
|
+
if Environ.platform == :mobile
|
201
|
+
file_path = nil
|
202
|
+
file_name = ''
|
203
|
+
color_value = '#000000'
|
204
|
+
else
|
205
|
+
file_path = "#{Dir.pwd}/test_site/images/Wilder.jpg"
|
206
|
+
file_name = 'Wilder.jpg'
|
207
|
+
color_value = Faker::Color.hex_color
|
208
|
+
end
|
153
209
|
{
|
154
210
|
username: Faker::Name.name,
|
155
211
|
password: 'T0p_Sekrit',
|
156
212
|
maxlength: Faker::Marketing.buzzwords,
|
157
213
|
number: Faker::Number.between(from: 10, to: 1024),
|
158
|
-
color:
|
159
|
-
slider:
|
214
|
+
color: color_value,
|
215
|
+
slider: 50,
|
160
216
|
comments: Faker::Hipster.paragraph,
|
161
217
|
filepath: file_path,
|
162
|
-
filename:
|
218
|
+
filename: file_name,
|
163
219
|
check1: true,
|
164
220
|
check2: true,
|
165
221
|
check3: false,
|
166
|
-
radio1:
|
167
|
-
radio2:
|
222
|
+
radio1: false,
|
223
|
+
radio2: true,
|
168
224
|
radio3: false,
|
169
225
|
multi_select: 'Selection Item 2',
|
170
226
|
drop_select: 'Drop Down Item 5'
|
@@ -228,8 +284,11 @@ class BasicTestPage < TestCentricity::PageObject
|
|
228
284
|
end
|
229
285
|
|
230
286
|
def verify_tab_order
|
231
|
-
order =
|
287
|
+
order = case Environ.browser
|
288
|
+
when :safari
|
232
289
|
safari_tab_order
|
290
|
+
when :firefox
|
291
|
+
firefox_order
|
233
292
|
else
|
234
293
|
tab_order
|
235
294
|
end
|
@@ -12,8 +12,8 @@ class BasicXpathTestPage < BasicTestPage
|
|
12
12
|
number_field: "//input[@id='number-field']",
|
13
13
|
comments_field: "//textarea[@id='comments']",
|
14
14
|
color_picker: "//input[@id='color-picker']"
|
15
|
-
|
16
|
-
|
15
|
+
ranges slider: "//input[@id='slider']"
|
16
|
+
filefields upload_file: "//input[@id='filename']"
|
17
17
|
checkboxes check_1: "//input[@id='check1']",
|
18
18
|
check_2: "//input[@id='check2']",
|
19
19
|
check_3: "//input[@id='check3']",
|
@@ -24,13 +24,16 @@ class BasicXpathTestPage < BasicTestPage
|
|
24
24
|
radio_4: "//input[@id='radio4']"
|
25
25
|
selectlists multi_select: "//select[@id='multipleselect']",
|
26
26
|
drop_down_select: "//select[@id='dropdown']"
|
27
|
-
|
27
|
+
links link_1: "//a[@id='link1']",
|
28
|
+
link_2: "//a[@id='link2']",
|
29
|
+
link_3: "//a[@id='link3']"
|
30
|
+
tables static_table: "//table[@id='table']"
|
28
31
|
images image_1: "//img[@id='image1']",
|
29
32
|
image_2: "//img[@id='image2']",
|
30
33
|
image_3: "//img[@id='image3']"
|
31
34
|
buttons cancel_button: "//input[@id='cancel']",
|
32
35
|
submit_button: "//input[@id='submit']"
|
33
|
-
labels header_label: '//
|
36
|
+
labels header_label: '//h2',
|
34
37
|
username_label: "//label[@for='username']",
|
35
38
|
password_label: "//label[@for='password']",
|
36
39
|
max_length_label: "//label[@for='maxlength']",
|
@@ -44,6 +47,7 @@ class BasicXpathTestPage < BasicTestPage
|
|
44
47
|
radios_label: "//label[@id='radios']",
|
45
48
|
multiselect_label: "//label[@for='multipleselect']",
|
46
49
|
dropdown_label: "//label[@for='dropdown']",
|
50
|
+
link_label: "//label[@id='links']",
|
47
51
|
table_label: "//label[@for='table']",
|
48
52
|
images_label: "//label[@id='images']"
|
49
53
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Page Object class definition for Custom Controls page with CSS locators
|
2
|
+
|
3
|
+
class CustomControlsPage < BaseTestPage
|
4
|
+
trait(:page_name) { 'Custom Controls' }
|
5
|
+
trait(:page_locator) { 'div.custom-controls-page-body' }
|
6
|
+
trait(:page_url) { '/custom_controls_page.html' }
|
7
|
+
trait(:navigator) { header_nav.open_custom_controls_page }
|
8
|
+
|
9
|
+
def verify_page_ui
|
10
|
+
ui = {
|
11
|
+
self => { exists: true, secure: false, title: 'Custom Controls Page' },
|
12
|
+
header_label => { visible: true, caption: 'Custom Controls Page' }
|
13
|
+
}
|
14
|
+
verify_ui_states(ui)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Page Object class definition for Indexed Sections page with CSS locators
|
2
|
+
|
3
|
+
class IndexedSectionsPage < BaseTestPage
|
4
|
+
trait(:page_name) { 'Indexed Sections' }
|
5
|
+
trait(:page_locator) { 'div.indexed-sections-page-body' }
|
6
|
+
trait(:page_url) { '/indexed_sections_page.html' }
|
7
|
+
trait(:navigator) { header_nav.open_indexed_sections_page }
|
8
|
+
|
9
|
+
def verify_page_ui
|
10
|
+
ui = {
|
11
|
+
self => { exists: true, secure: false, title: 'Indexed Sections Page' },
|
12
|
+
header_label => { visible: true, caption: 'Indexed Sections Page' }
|
13
|
+
}
|
14
|
+
verify_ui_states(ui)
|
15
|
+
end
|
16
|
+
end
|