selenium-cucumber 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Example/features/assertion_steps_Ex.feature +121 -0
- data/Example/features/click_steps_Ex.feature +28 -0
- data/Example/features/configuration_step_Ex.feature +9 -0
- data/Example/features/input_steps_Ex.feature +87 -0
- data/Example/features/javascript_steps_Ex.feature +19 -0
- data/Example/features/navigation_steps_Ex.feature +45 -0
- data/Example/features/new.feature +7 -0
- data/Example/features/progress_step_Ex.feature +18 -0
- data/Example/features/screenshot_step_Ex.feature +11 -0
- data/Example/features/step_definitions/custom_steps.rb +14 -0
- data/Example/features/support/env.rb +38 -0
- data/Example/features/support/hooks.rb +34 -0
- data/Example/run_features.rb +40 -0
- data/Example/test_page.html +206 -0
- data/bin/generate.rb +20 -20
- data/bin/helper.rb +50 -50
- data/bin/selenium-cucumber +26 -26
- data/doc/canned_steps.md +479 -463
- data/doc/installation.md +16 -16
- data/doc/selenium-cucumber-API.md +81 -81
- data/doc/selenium-cucumber-help.md +18 -18
- data/features-skeleton/my_first.feature +5 -5
- data/features-skeleton/step_definitions/custom_steps.rb +4 -4
- data/features-skeleton/support/env.rb +38 -38
- data/features-skeleton/support/hooks.rb +33 -33
- data/lib/selenium-cucumber.rb +2 -2
- data/lib/selenium-cucumber/assertion_steps.rb +7 -2
- data/lib/selenium-cucumber/click_elements_steps.rb +7 -0
- data/lib/selenium-cucumber/methods/assertion_methods.rb +74 -24
- data/lib/selenium-cucumber/methods/click_elements_methods.rb +7 -2
- data/lib/selenium-cucumber/methods/configuration_methods.rb +1 -0
- data/lib/selenium-cucumber/methods/navigate_methods.rb +22 -32
- data/lib/selenium-cucumber/methods/required_files.rb +2 -0
- data/lib/selenium-cucumber/navigation_steps.rb +8 -0
- data/lib/selenium-cucumber/progress_steps.rb +2 -2
- data/lib/selenium-cucumber/version.rb +1 -1
- metadata +27 -45
data/doc/installation.md
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
Installation
|
2
|
-
============
|
3
|
-
### Prerequisites
|
4
|
-
You need to have Ruby installed.
|
5
|
-
Verify your installation by running ruby -v in a terminal - it should print "ruby 1.9.3" (or higher).
|
6
|
-
|
7
|
-
You need to have DevKit installed.
|
8
|
-
|
9
|
-
You can get Ruby and DevKit from [RubyInstaller.org](http://rubyinstaller.org/)
|
10
|
-
|
11
|
-
### Installation
|
12
|
-
|
13
|
-
Install `selenium-cucumber` gem by running
|
14
|
-
|
15
|
-
- `gem install selenium-cucumber`
|
16
|
-
|
1
|
+
Installation
|
2
|
+
============
|
3
|
+
### Prerequisites
|
4
|
+
You need to have Ruby installed.
|
5
|
+
Verify your installation by running ruby -v in a terminal - it should print "ruby 1.9.3" (or higher).
|
6
|
+
|
7
|
+
You need to have DevKit installed.
|
8
|
+
|
9
|
+
You can get Ruby and DevKit from [RubyInstaller.org](http://rubyinstaller.org/)
|
10
|
+
|
11
|
+
### Installation
|
12
|
+
|
13
|
+
Install `selenium-cucumber` gem by running
|
14
|
+
|
15
|
+
- `gem install selenium-cucumber`
|
16
|
+
|
@@ -1,82 +1,82 @@
|
|
1
|
-
selenium-cucumber API
|
2
|
-
=====================
|
3
|
-
|
4
|
-
If you are writing code for your custom steps you can use the following methods :
|
5
|
-
|
6
|
-
Note : For some of the API paramtere values are fixed. Such values for paramaters are mentioned below.
|
7
|
-
|
8
|
-
Navigation API's
|
9
|
-
----------------
|
10
|
-
|
11
|
-
navigate_to(link)
|
12
|
-
|
13
|
-
navigate(direction) # direction => "back"/"forward"
|
14
|
-
|
15
|
-
close_driver()
|
16
|
-
|
17
|
-
|
18
|
-
Browser Interaction API's
|
19
|
-
-------------------------
|
20
|
-
|
21
|
-
resize_browser(width,height)
|
22
|
-
|
23
|
-
scroll_page(to) # to => "top"/"end"
|
24
|
-
|
25
|
-
scroll_to_element(by,access_value)
|
26
|
-
|
27
|
-
zoom_in_out(in_out) # in_out => "add"/"subtract"
|
28
|
-
|
29
|
-
zoom_in_out_till_element_display(by, in_out, access_value) # in_out => "add"/"subtract"
|
30
|
-
|
31
|
-
|
32
|
-
Input API's
|
33
|
-
------------
|
34
|
-
|
35
|
-
click(by,access_value)
|
36
|
-
|
37
|
-
submit(by,access_value)
|
38
|
-
|
39
|
-
enter_text(by,text,access_value)
|
40
|
-
|
41
|
-
clear_text(by,access_value)
|
42
|
-
|
43
|
-
check_checkbox(by, access_value)
|
44
|
-
|
45
|
-
uncheck_checkbox(by, access_value)
|
46
|
-
|
47
|
-
toggle_checkbox(by, access_value)
|
48
|
-
|
49
|
-
select_radio_button(by, access_value)
|
50
|
-
|
51
|
-
get_page_title()
|
52
|
-
|
53
|
-
get_element_text(by,access_value)
|
54
|
-
|
55
|
-
get_element_attribute(by,access_value,attribute)
|
56
|
-
|
57
|
-
is_element_enabled(by,access_value)
|
58
|
-
|
59
|
-
is_element_displayed(by,access_value)
|
60
|
-
|
61
|
-
|
62
|
-
Javascript Handling API
|
63
|
-
-----------------------
|
64
|
-
|
65
|
-
handle_alert(decision) # decision => "accept"/"dismiss"
|
66
|
-
|
67
|
-
get_alert_text
|
68
|
-
|
69
|
-
|
70
|
-
Progress API's
|
71
|
-
--------------
|
72
|
-
|
73
|
-
wait(time_in_sec)
|
74
|
-
|
75
|
-
wait_for_element_to_display(by,access_value,duration)
|
76
|
-
|
77
|
-
wait_for_element_to_enable(by,access_value,duration)
|
78
|
-
|
79
|
-
|
80
|
-
Screenshot API
|
81
|
-
--------------
|
1
|
+
selenium-cucumber API
|
2
|
+
=====================
|
3
|
+
|
4
|
+
If you are writing code for your custom steps you can use the following methods :
|
5
|
+
|
6
|
+
Note : For some of the API paramtere values are fixed. Such values for paramaters are mentioned below.
|
7
|
+
|
8
|
+
Navigation API's
|
9
|
+
----------------
|
10
|
+
|
11
|
+
navigate_to(link)
|
12
|
+
|
13
|
+
navigate(direction) # direction => "back"/"forward"
|
14
|
+
|
15
|
+
close_driver()
|
16
|
+
|
17
|
+
|
18
|
+
Browser Interaction API's
|
19
|
+
-------------------------
|
20
|
+
|
21
|
+
resize_browser(width,height)
|
22
|
+
|
23
|
+
scroll_page(to) # to => "top"/"end"
|
24
|
+
|
25
|
+
scroll_to_element(by,access_value)
|
26
|
+
|
27
|
+
zoom_in_out(in_out) # in_out => "add"/"subtract"
|
28
|
+
|
29
|
+
zoom_in_out_till_element_display(by, in_out, access_value) # in_out => "add"/"subtract"
|
30
|
+
|
31
|
+
|
32
|
+
Input API's
|
33
|
+
------------
|
34
|
+
|
35
|
+
click(by,access_value)
|
36
|
+
|
37
|
+
submit(by,access_value)
|
38
|
+
|
39
|
+
enter_text(by,text,access_value)
|
40
|
+
|
41
|
+
clear_text(by,access_value)
|
42
|
+
|
43
|
+
check_checkbox(by, access_value)
|
44
|
+
|
45
|
+
uncheck_checkbox(by, access_value)
|
46
|
+
|
47
|
+
toggle_checkbox(by, access_value)
|
48
|
+
|
49
|
+
select_radio_button(by, access_value)
|
50
|
+
|
51
|
+
get_page_title()
|
52
|
+
|
53
|
+
get_element_text(by,access_value)
|
54
|
+
|
55
|
+
get_element_attribute(by,access_value,attribute)
|
56
|
+
|
57
|
+
is_element_enabled(by,access_value)
|
58
|
+
|
59
|
+
is_element_displayed(by,access_value)
|
60
|
+
|
61
|
+
|
62
|
+
Javascript Handling API
|
63
|
+
-----------------------
|
64
|
+
|
65
|
+
handle_alert(decision) # decision => "accept"/"dismiss"
|
66
|
+
|
67
|
+
get_alert_text
|
68
|
+
|
69
|
+
|
70
|
+
Progress API's
|
71
|
+
--------------
|
72
|
+
|
73
|
+
wait(time_in_sec)
|
74
|
+
|
75
|
+
wait_for_element_to_display(by,access_value,duration)
|
76
|
+
|
77
|
+
wait_for_element_to_enable(by,access_value,duration)
|
78
|
+
|
79
|
+
|
80
|
+
Screenshot API
|
81
|
+
--------------
|
82
82
|
take_screenshots
|
@@ -1,18 +1,18 @@
|
|
1
|
-
|
2
|
-
Usage: selenium-cucumber <command-name> [parameters] [options]
|
3
|
-
|
4
|
-
<command-name> can be one of
|
5
|
-
help
|
6
|
-
gen
|
7
|
-
version
|
8
|
-
|
9
|
-
Commands:
|
10
|
-
help : prints more detailed help information.
|
11
|
-
|
12
|
-
gen : creates a skeleton features dir. This is usually used once when
|
13
|
-
setting up selnium-cucumber to ensure that the features folder contains
|
14
|
-
the right step definitions and environment to run with cucumber.
|
15
|
-
|
16
|
-
version : prints the gem version
|
17
|
-
|
18
|
-
Options: -v, --verbose Turns on verbose logging
|
1
|
+
|
2
|
+
Usage: selenium-cucumber <command-name> [parameters] [options]
|
3
|
+
|
4
|
+
<command-name> can be one of
|
5
|
+
help
|
6
|
+
gen
|
7
|
+
version
|
8
|
+
|
9
|
+
Commands:
|
10
|
+
help : prints more detailed help information.
|
11
|
+
|
12
|
+
gen : creates a skeleton features dir. This is usually used once when
|
13
|
+
setting up selnium-cucumber to ensure that the features folder contains
|
14
|
+
the right step definitions and environment to run with cucumber.
|
15
|
+
|
16
|
+
version : prints the gem version
|
17
|
+
|
18
|
+
Options: -v, --verbose Turns on verbose logging
|
@@ -1,5 +1,5 @@
|
|
1
|
-
Feature: Login feature
|
2
|
-
|
3
|
-
Scenario: As a valid user I can log into my web app
|
4
|
-
When I press "Login"
|
5
|
-
Then I see "Welcome to coolest web app ever"
|
1
|
+
Feature: Login feature
|
2
|
+
|
3
|
+
Scenario: As a valid user I can log into my web app
|
4
|
+
When I press "Login"
|
5
|
+
Then I see "Welcome to coolest web app ever"
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'selenium-cucumber'
|
2
|
-
|
3
|
-
# Do Not Remove This File
|
4
|
-
# Add your custom steps here
|
1
|
+
require 'selenium-cucumber'
|
2
|
+
|
3
|
+
# Do Not Remove This File
|
4
|
+
# Add your custom steps here
|
5
5
|
# $driver is instance of webdriver use this instance to write your custom code
|
@@ -1,38 +1,38 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'selenium-webdriver'
|
3
|
-
|
4
|
-
def print_error
|
5
|
-
puts "\nInappropraite browser \"#{ENV['BROWSER']}\""
|
6
|
-
puts "\nUsage : cucumber BROWSER=browser_name"
|
7
|
-
puts "\nbrowser_name can be one of following :"
|
8
|
-
puts "1.ie\n2.chrome\n3.ff\n4.safari\n5.opera"
|
9
|
-
puts "\nNow using default browser \"Firefox\""
|
10
|
-
end
|
11
|
-
|
12
|
-
case ENV['BROWSER']
|
13
|
-
when 'ie'
|
14
|
-
browser_type = :ie
|
15
|
-
when 'ff'
|
16
|
-
browser_type = :ff
|
17
|
-
when 'chrome'
|
18
|
-
browser_type = :chrome
|
19
|
-
when 'opera'
|
20
|
-
browser_type = :opera
|
21
|
-
when 'safari'
|
22
|
-
browser_type = :safari
|
23
|
-
else
|
24
|
-
if ENV['BROWSER']
|
25
|
-
print_error
|
26
|
-
end
|
27
|
-
browser_type = :ff
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
begin
|
32
|
-
$driver = Selenium::WebDriver.for(browser_type)
|
33
|
-
$driver.manage().window().maximize()
|
34
|
-
|
35
|
-
rescue Exception => e
|
36
|
-
puts e.message
|
37
|
-
end
|
38
|
-
|
1
|
+
require 'rubygems'
|
2
|
+
require 'selenium-webdriver'
|
3
|
+
|
4
|
+
def print_error
|
5
|
+
puts "\nInappropraite browser \"#{ENV['BROWSER']}\""
|
6
|
+
puts "\nUsage : cucumber BROWSER=browser_name"
|
7
|
+
puts "\nbrowser_name can be one of following :"
|
8
|
+
puts "1.ie\n2.chrome\n3.ff\n4.safari\n5.opera"
|
9
|
+
puts "\nNow using default browser \"Firefox\""
|
10
|
+
end
|
11
|
+
|
12
|
+
case ENV['BROWSER']
|
13
|
+
when 'ie'
|
14
|
+
browser_type = :ie
|
15
|
+
when 'ff'
|
16
|
+
browser_type = :ff
|
17
|
+
when 'chrome'
|
18
|
+
browser_type = :chrome
|
19
|
+
when 'opera'
|
20
|
+
browser_type = :opera
|
21
|
+
when 'safari'
|
22
|
+
browser_type = :safari
|
23
|
+
else
|
24
|
+
if ENV['BROWSER']
|
25
|
+
print_error
|
26
|
+
end
|
27
|
+
browser_type = :ff
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
begin
|
32
|
+
$driver = Selenium::WebDriver.for(browser_type)
|
33
|
+
$driver.manage().window().maximize()
|
34
|
+
|
35
|
+
rescue Exception => e
|
36
|
+
puts e.message
|
37
|
+
end
|
38
|
+
|
@@ -1,34 +1,34 @@
|
|
1
|
-
#Cucumber provides a number of hooks which allow us to run blocks at various points in the Cucumber test cycle
|
2
|
-
|
3
|
-
Before do
|
4
|
-
# Do something before each scenario.
|
5
|
-
end
|
6
|
-
|
7
|
-
Before do |scenario|
|
8
|
-
# The +scenario+ argument is optional, but if you use it, you can get the title,
|
9
|
-
# description, or name (title + description) of the scenario that is about to be
|
10
|
-
# executed.
|
11
|
-
end
|
12
|
-
|
13
|
-
After do |scenario|
|
14
|
-
# Do something after each scenario.
|
15
|
-
# The +scenario+ argument is optional, but
|
16
|
-
# if you use it, you can inspect status with
|
17
|
-
# the #failed?, #passed? and #exception methods.
|
18
|
-
|
19
|
-
if(scenario.failed?)
|
20
|
-
#Do something if scenario fails.
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
#Tagged hooks
|
25
|
-
|
26
|
-
Before('@Ex_tag1, @Ex_tag2') do
|
27
|
-
# This will only run before scenarios tagged
|
28
|
-
# with @cucumis OR @sativus.
|
29
|
-
end
|
30
|
-
|
31
|
-
AfterStep('@Ex_tag1, @Ex_tag2') do
|
32
|
-
# This will only run after steps within scenarios tagged
|
33
|
-
# with @cucumis AND @sativus.
|
1
|
+
#Cucumber provides a number of hooks which allow us to run blocks at various points in the Cucumber test cycle
|
2
|
+
|
3
|
+
Before do
|
4
|
+
# Do something before each scenario.
|
5
|
+
end
|
6
|
+
|
7
|
+
Before do |scenario|
|
8
|
+
# The +scenario+ argument is optional, but if you use it, you can get the title,
|
9
|
+
# description, or name (title + description) of the scenario that is about to be
|
10
|
+
# executed.
|
11
|
+
end
|
12
|
+
|
13
|
+
After do |scenario|
|
14
|
+
# Do something after each scenario.
|
15
|
+
# The +scenario+ argument is optional, but
|
16
|
+
# if you use it, you can inspect status with
|
17
|
+
# the #failed?, #passed? and #exception methods.
|
18
|
+
|
19
|
+
if(scenario.failed?)
|
20
|
+
#Do something if scenario fails.
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
#Tagged hooks
|
25
|
+
|
26
|
+
Before('@Ex_tag1, @Ex_tag2') do
|
27
|
+
# This will only run before scenarios tagged
|
28
|
+
# with @cucumis OR @sativus.
|
29
|
+
end
|
30
|
+
|
31
|
+
AfterStep('@Ex_tag1, @Ex_tag2') do
|
32
|
+
# This will only run after steps within scenarios tagged
|
33
|
+
# with @cucumis AND @sativus.
|
34
34
|
end
|
data/lib/selenium-cucumber.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
Dir[File.dirname(__FILE__) + '/selenium-cucumber/*.rb'].each {|file| require file }
|
1
|
+
|
2
|
+
Dir[File.dirname(__FILE__) + '/selenium-cucumber/*.rb'].each {|file| require file }
|
@@ -68,9 +68,14 @@ Then(/^I should see alert text as "(.*?)"$/) do |actual_value|
|
|
68
68
|
check_alert_text(actual_value)
|
69
69
|
end
|
70
70
|
|
71
|
-
#Step
|
71
|
+
#Step to assert dropdown list
|
72
72
|
Then(/^option "(.*?)" by (.+) from dropdown having (.+) "(.*?)" should be (selected|unselected)$/) do |option, by, type, access_name, state|
|
73
73
|
validate_locator type
|
74
74
|
flag = state == "selected"
|
75
75
|
is_option_from_dropdown_selected(type,by,option,access_name,state)
|
76
|
-
end
|
76
|
+
end
|
77
|
+
|
78
|
+
#Step to assert difference in images
|
79
|
+
Then(/^actual image having (.+) "(.*?)" and expected image having (.+) "(.*?)" should be similar$/) do |actual_img_access_type, actual_img_access_name, excp_img_access_type, excp_img_access_name|
|
80
|
+
does_images_similar?(actual_img_access_type, actual_img_access_name, excp_img_access_type, excp_img_access_name)
|
81
|
+
end
|
@@ -12,6 +12,13 @@ Then(/^I forcefully click on element having (.+) "(.*?)"$/) do |type, access_nam
|
|
12
12
|
click_forcefully(type, access_name)
|
13
13
|
end
|
14
14
|
|
15
|
+
# double click on web element
|
16
|
+
|
17
|
+
Then(/^I double click on element having (.+) "(.*?)"$/) do |type, access_value|
|
18
|
+
validate_locator type
|
19
|
+
double_click(type, access_value)
|
20
|
+
end
|
21
|
+
|
15
22
|
#steps to click on link
|
16
23
|
|
17
24
|
Then(/^I click on link having text "(.*?)"$/) do |access_name|
|
@@ -13,7 +13,7 @@ def check_title(title)
|
|
13
13
|
end
|
14
14
|
|
15
15
|
#method to get element text
|
16
|
-
def get_element_text(access_type,access_name)
|
16
|
+
def get_element_text(access_type,access_name)
|
17
17
|
return WAIT.until {$driver.find_element(:"#{access_type}" => "#{access_name}")}.text
|
18
18
|
end
|
19
19
|
|
@@ -22,11 +22,11 @@ def check_element_text(access_type, actual_value, access_name, test_case)
|
|
22
22
|
element_text = get_element_text(access_type,access_name)
|
23
23
|
|
24
24
|
if test_case
|
25
|
-
if(element_text!=actual_value)
|
25
|
+
if(element_text!=actual_value)
|
26
26
|
raise TestCaseFailed ,"Text Not Matched"
|
27
27
|
end
|
28
28
|
else
|
29
|
-
if(element_text==actual_value)
|
29
|
+
if(element_text==actual_value)
|
30
30
|
raise TestCaseFailed ,"Text Matched"
|
31
31
|
end
|
32
32
|
end
|
@@ -37,17 +37,17 @@ def is_element_enabled(access_type,access_name)
|
|
37
37
|
return WAIT.until{$driver.find_element(:"#{access_type}" => "#{access_name}")}.enabled?
|
38
38
|
end
|
39
39
|
|
40
|
-
#Element enabled checking
|
40
|
+
#Element enabled checking
|
41
41
|
def check_element_enable(access_type, access_name, test_case)
|
42
|
-
|
42
|
+
|
43
43
|
result=is_element_enabled(access_type,access_name)
|
44
44
|
|
45
45
|
if test_case
|
46
|
-
if(!result)
|
46
|
+
if(!result)
|
47
47
|
raise TestCaseFailed ,"Element Not Enabled"
|
48
48
|
end
|
49
49
|
else
|
50
|
-
if(result)
|
50
|
+
if(result)
|
51
51
|
raise TestCaseFailed ,"Element Enabled"
|
52
52
|
end
|
53
53
|
end
|
@@ -60,15 +60,15 @@ end
|
|
60
60
|
|
61
61
|
#method to check attribute value
|
62
62
|
def check_element_attribute(access_type, attribute_name, attribute_value, access_name, test_case)
|
63
|
-
|
63
|
+
|
64
64
|
attr_val=get_element_attribute(access_type, access_name, attribute_name)
|
65
|
-
|
65
|
+
|
66
66
|
if test_case
|
67
|
-
if(attr_val!=attribute_value)
|
67
|
+
if(attr_val!=attribute_value)
|
68
68
|
raise TestCaseFailed ,"Attribute Value Not Matched"
|
69
69
|
end
|
70
70
|
else
|
71
|
-
if(attr_val==attribute_value)
|
71
|
+
if(attr_val==attribute_value)
|
72
72
|
raise TestCaseFailed ,"Attribute Value Matched"
|
73
73
|
end
|
74
74
|
end
|
@@ -88,7 +88,7 @@ def check_element_presence(access_type, access_name, test_case)
|
|
88
88
|
else
|
89
89
|
begin
|
90
90
|
if is_element_displayed(access_type,access_name)
|
91
|
-
raise "Present"
|
91
|
+
raise "Present"
|
92
92
|
end
|
93
93
|
rescue Exception => e
|
94
94
|
if e.message=="present"
|
@@ -101,7 +101,7 @@ end
|
|
101
101
|
#method to assert checkbox check/uncheck
|
102
102
|
def is_checkbox_checked(access_type, access_name, should_be_checked=true)
|
103
103
|
checkbox = WAIT.until{$driver.find_element(:"#{access_type}" => "#{access_name}")}
|
104
|
-
|
104
|
+
|
105
105
|
if !checkbox.selected? && should_be_checked
|
106
106
|
raise TestCaseFailed ,"Checkbox is not checked"
|
107
107
|
elsif checkbox.selected? && !should_be_checked
|
@@ -112,7 +112,7 @@ end
|
|
112
112
|
#method to assert radio button selected/unselected
|
113
113
|
def is_radio_button_selected(access_type, access_name, should_be_selected=true)
|
114
114
|
radio_button = WAIT.until{$driver.find_element(:"#{access_type}" => "#{access_name}")}
|
115
|
-
|
115
|
+
|
116
116
|
if !radio_button.selected? && should_be_selected
|
117
117
|
raise TestCaseFailed ,"Radio Button not selected"
|
118
118
|
elsif radio_button.selected? && !should_be_selected
|
@@ -124,11 +124,11 @@ end
|
|
124
124
|
#method to assert option from radio button group is selected/unselected
|
125
125
|
def is_option_from_radio_button_group_selected(access_type, by, option, access_name, should_be_selected=true)
|
126
126
|
radio_button_group = WAIT.until{$driver.find_elements(:"#{access_type}" => "#{access_name}")}
|
127
|
-
|
128
|
-
getter = ->(rb, by) { by == 'value' ? rb.attribute('value') : rb.text }
|
129
|
-
|
127
|
+
|
128
|
+
getter = ->(rb, by) { by == 'value' ? rb.attribute('value') : rb.text }
|
129
|
+
|
130
130
|
ele = radio_button_group.find { |rb| getter.call(rb, by) == option }
|
131
|
-
|
131
|
+
|
132
132
|
if !ele.selected? && should_be_selected
|
133
133
|
raise TestCaseFailed ,'Radio button is not selected'
|
134
134
|
elsif ele.selected? && !should_be_selected
|
@@ -151,18 +151,68 @@ end
|
|
151
151
|
def is_option_from_dropdown_selected(access_type, by, option, access_name, should_be_selected=true)
|
152
152
|
dropdown = WAIT.until {$driver.find_element(:"#{access_type}" => "#{access_name}")}
|
153
153
|
select_list = Selenium::WebDriver::Support::Select.new(dropdown)
|
154
|
-
|
155
|
-
puts select_list.first_selected_option.attribute("value")
|
156
154
|
|
157
155
|
if by=="text"
|
158
156
|
actual_value = select_list.first_selected_option.text
|
159
157
|
else
|
160
158
|
actual_value = select_list.first_selected_option.attribute("value")
|
161
159
|
end
|
162
|
-
|
160
|
+
|
163
161
|
if !actual_value==option && should_be_selected
|
164
|
-
raise "Option Not Selected From Dropwdown"
|
162
|
+
raise TestCaseFailed , "Option Not Selected From Dropwdown"
|
165
163
|
elsif actual_value==option && !should_be_selected
|
166
|
-
raise "Option Selected From Dropwdown"
|
164
|
+
raise TestCaseFailed , "Option Selected From Dropwdown"
|
167
165
|
end
|
168
|
-
end
|
166
|
+
end
|
167
|
+
|
168
|
+
#Method to find difference between images
|
169
|
+
def does_images_similar?(actual_img_access_type, actual_img_access_name, excp_img_access_type, excp_img_access_name)
|
170
|
+
if !compare_image(actual_img_access_type, actual_img_access_name, excp_img_access_type, excp_img_access_name)
|
171
|
+
raise TestCaseFailed , "Actual image is different from expected image"
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
#Method to compare two images
|
176
|
+
def compare_image(actual_img_access_type, actual_img_access_name, excp_img_access_type, excp_img_access_name)
|
177
|
+
|
178
|
+
if actual_img_access_type!="path"
|
179
|
+
actual_img_url = get_element_attribute(actual_img_access_type, actual_img_access_name, "src")
|
180
|
+
else
|
181
|
+
actual_img_url = actual_img_access_name
|
182
|
+
end
|
183
|
+
|
184
|
+
if excp_img_access_type!="path"
|
185
|
+
expected_img_url = get_element_attribute(excp_img_access_type, excp_img_access_name, "src")
|
186
|
+
else
|
187
|
+
expected_img_url = excp_img_access_name
|
188
|
+
end
|
189
|
+
|
190
|
+
images = [
|
191
|
+
ChunkyPNG::Image.from_file(open(actual_img_url)),
|
192
|
+
ChunkyPNG::Image.from_file(open(expected_img_url))
|
193
|
+
]
|
194
|
+
|
195
|
+
diff = []
|
196
|
+
|
197
|
+
images.first.height.times do |y|
|
198
|
+
images.first.row(y).each_with_index do |pixel, x|
|
199
|
+
diff << [x,y] unless pixel == images.last[x,y]
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
if diff.length != 0
|
204
|
+
puts "\npixels (total): #{images.first.pixels.length}"
|
205
|
+
puts "pixels changed: #{diff.length}"
|
206
|
+
puts "pixels changed (%): #{(diff.length.to_f / images.first.pixels.length) * 100}%"
|
207
|
+
|
208
|
+
x, y = diff.map{ |xy| xy[0] }, diff.map{ |xy| xy[1] }
|
209
|
+
images.last.rect(x.min, y.min, x.max, y.max, ChunkyPNG::Color.rgb(0,255,0))
|
210
|
+
curTime = Time.now.strftime('%Y%m%d%H%M%S%L')
|
211
|
+
images.last.save("difference_#{curTime}.png")
|
212
|
+
|
213
|
+
puts "\nDifference between images saved as : difference_#{curTime}.png\n"
|
214
|
+
return false
|
215
|
+
else
|
216
|
+
return true
|
217
|
+
end
|
218
|
+
end
|