eyes_selenium 2.15.0 → 2.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -2
- data/.travis.yml +16 -0
- data/Gemfile +1 -1
- data/README.md +14 -4
- data/Rakefile +8 -1
- data/eyes_selenium.gemspec +26 -17
- data/lib/applitools/base/batch_info.rb +19 -0
- data/lib/applitools/base/dimension.rb +21 -0
- data/lib/applitools/base/environment.rb +19 -0
- data/lib/applitools/base/mouse_trigger.rb +33 -0
- data/lib/applitools/base/point.rb +21 -0
- data/lib/applitools/base/region.rb +77 -0
- data/lib/applitools/base/server_connector.rb +113 -0
- data/lib/applitools/base/session.rb +15 -0
- data/lib/applitools/base/start_info.rb +34 -0
- data/lib/applitools/base/test_results.rb +36 -0
- data/lib/applitools/base/text_trigger.rb +22 -0
- data/lib/applitools/eyes.rb +393 -0
- data/lib/applitools/eyes_logger.rb +40 -0
- data/lib/applitools/method_tracer.rb +22 -0
- data/lib/applitools/selenium/driver.rb +194 -0
- data/lib/applitools/selenium/element.rb +66 -0
- data/lib/applitools/selenium/keyboard.rb +27 -0
- data/lib/applitools/selenium/match_window_data.rb +24 -0
- data/lib/applitools/selenium/match_window_task.rb +190 -0
- data/lib/applitools/selenium/mouse.rb +62 -0
- data/lib/applitools/selenium/viewport_size.rb +128 -0
- data/lib/applitools/utils/image_delta_compressor.rb +150 -0
- data/lib/applitools/utils/image_utils.rb +63 -0
- data/lib/applitools/utils/utils.rb +52 -0
- data/lib/applitools/version.rb +3 -0
- data/lib/eyes_selenium.rb +9 -29
- data/spec/driver_passthrough_spec.rb +25 -25
- data/spec/spec_helper.rb +5 -8
- data/test/appium_example_script.rb +57 -0
- data/{test_script.rb → test/test_script.rb} +7 -9
- data/{watir_test.rb → test/watir_test_script.rb} +6 -4
- metadata +120 -48
- data/appium_eyes_example.rb +0 -56
- data/lib/eyes_selenium/capybara.rb +0 -21
- data/lib/eyes_selenium/eyes/agent_connector.rb +0 -76
- data/lib/eyes_selenium/eyes/batch_info.rb +0 -19
- data/lib/eyes_selenium/eyes/dimension.rb +0 -15
- data/lib/eyes_selenium/eyes/driver.rb +0 -266
- data/lib/eyes_selenium/eyes/element.rb +0 -78
- data/lib/eyes_selenium/eyes/environment.rb +0 -15
- data/lib/eyes_selenium/eyes/eyes.rb +0 -396
- data/lib/eyes_selenium/eyes/eyes_keyboard.rb +0 -25
- data/lib/eyes_selenium/eyes/eyes_mouse.rb +0 -60
- data/lib/eyes_selenium/eyes/failure_reports.rb +0 -4
- data/lib/eyes_selenium/eyes/match_level.rb +0 -8
- data/lib/eyes_selenium/eyes/match_window_data.rb +0 -18
- data/lib/eyes_selenium/eyes/match_window_task.rb +0 -182
- data/lib/eyes_selenium/eyes/mouse_trigger.rb +0 -23
- data/lib/eyes_selenium/eyes/region.rb +0 -72
- data/lib/eyes_selenium/eyes/screenshot_taker.rb +0 -18
- data/lib/eyes_selenium/eyes/session.rb +0 -14
- data/lib/eyes_selenium/eyes/start_info.rb +0 -32
- data/lib/eyes_selenium/eyes/test_results.rb +0 -32
- data/lib/eyes_selenium/eyes/text_trigger.rb +0 -19
- data/lib/eyes_selenium/eyes/viewport_size.rb +0 -105
- data/lib/eyes_selenium/eyes_logger.rb +0 -47
- data/lib/eyes_selenium/utils.rb +0 -6
- data/lib/eyes_selenium/utils/image_delta_compressor.rb +0 -149
- data/lib/eyes_selenium/utils/image_utils.rb +0 -76
- data/lib/eyes_selenium/version.rb +0 -3
@@ -1,25 +0,0 @@
|
|
1
|
-
class Applitools::EyesKeyboard
|
2
|
-
attr_reader :keyboard, :driver
|
3
|
-
|
4
|
-
def initialize(driver, keyboard)
|
5
|
-
@driver = driver
|
6
|
-
@keyboard = keyboard
|
7
|
-
end
|
8
|
-
|
9
|
-
def send_keys(*keys)
|
10
|
-
active_element = Applitools::Element.new(driver, driver.switch_to.active_element)
|
11
|
-
current_control = active_element.region
|
12
|
-
Selenium::WebDriver::Keys.encode(keys).each do |key|
|
13
|
-
driver.eyes.user_inputs << Applitools::TextTrigger.new(key.to_s, current_control)
|
14
|
-
end
|
15
|
-
keyboard.send_keys(*keys)
|
16
|
-
end
|
17
|
-
|
18
|
-
def press(key)
|
19
|
-
keyboard.press(key)
|
20
|
-
end
|
21
|
-
|
22
|
-
def release(key)
|
23
|
-
keyboard.release(key)
|
24
|
-
end
|
25
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
class Applitools::EyesMouse
|
2
|
-
|
3
|
-
attr_reader :driver, :mouse
|
4
|
-
def initialize(driver, mouse)
|
5
|
-
@driver = driver
|
6
|
-
@mouse = mouse
|
7
|
-
end
|
8
|
-
|
9
|
-
def click(element = nil)
|
10
|
-
extract_trigger_and_perform(:click, element)
|
11
|
-
end
|
12
|
-
|
13
|
-
def double_click(element = nil)
|
14
|
-
extract_trigger_and_perform(:double_click, element)
|
15
|
-
end
|
16
|
-
|
17
|
-
def context_click(element = nil)
|
18
|
-
extract_trigger_and_perform(:right_click, element)
|
19
|
-
end
|
20
|
-
|
21
|
-
def down(element = nil)
|
22
|
-
extract_trigger_and_perform(:down, element)
|
23
|
-
end
|
24
|
-
|
25
|
-
def up(element = nil)
|
26
|
-
extract_trigger_and_perform(:up, element)
|
27
|
-
end
|
28
|
-
|
29
|
-
def move_to(element, right_by = nil, down_by = nil)
|
30
|
-
element = element.web_element if element.is_a?(Applitools::Element)
|
31
|
-
location = element.location
|
32
|
-
location.x = [0,location.x].max.round
|
33
|
-
location.y = [0,location.y].max.round
|
34
|
-
current_control = Applitools::Region.new(0,0, *location.values)
|
35
|
-
driver.eyes.user_inputs << Applitools::MouseTrigger.new(:move, current_control, location)
|
36
|
-
element = element.web_element if element.is_a?(Applitools::Element)
|
37
|
-
mouse.move_to(element,right_by, down_by)
|
38
|
-
end
|
39
|
-
|
40
|
-
def move_by(right_by, down_by)
|
41
|
-
right = [0,right_by].max.round
|
42
|
-
down = [0,down_by].max.round
|
43
|
-
location = Selenium::WebDriver::Point.new(right,down)
|
44
|
-
current_control = Applitools::Region.new(0,0, right, down)
|
45
|
-
driver.eyes.user_inputs << Applitools::MouseTrigger.new(:move, current_control, location)
|
46
|
-
mouse.move_by(right_by,down_by)
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
def extract_trigger_and_perform(method, element=nil, *args)
|
52
|
-
location = element.location
|
53
|
-
location.x = [0,location.x].max.round
|
54
|
-
location.y = [0,location.y].max.round
|
55
|
-
current_control = Applitools::Region.new(0,0, *location.values)
|
56
|
-
driver.eyes.user_inputs << Applitools::MouseTrigger.new(method, current_control, location)
|
57
|
-
element = element.web_element if element.is_a?(Applitools::Element)
|
58
|
-
mouse.send(method,element,*args)
|
59
|
-
end
|
60
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
class Applitools::MatchWindowData
|
2
|
-
|
3
|
-
attr_reader :user_inputs, :app_output, :tag, :ignore_mismatch, :screenshot
|
4
|
-
def initialize(app_output,user_inputs=[], tag, ignore_mismatch, screenshot)
|
5
|
-
@user_inputs = user_inputs
|
6
|
-
@app_output = app_output
|
7
|
-
@tag = tag
|
8
|
-
@ignore_mismatch = ignore_mismatch
|
9
|
-
@screenshot = screenshot
|
10
|
-
end
|
11
|
-
|
12
|
-
# IMPORTANT This method returns a hash WITHOUT the screenshot property. This is on purspose! The screenshot should
|
13
|
-
# not be included as part of the json.
|
14
|
-
def to_hash
|
15
|
-
{userInputs: user_inputs.map(&:to_hash), appOutput: Hash[app_output.each_pair.to_a],
|
16
|
-
tag: @tag, ignoreMismatch: @ignore_mismatch}
|
17
|
-
end
|
18
|
-
end
|
@@ -1,182 +0,0 @@
|
|
1
|
-
require 'oily_png'
|
2
|
-
require 'base64'
|
3
|
-
|
4
|
-
class Applitools::MatchWindowTask
|
5
|
-
|
6
|
-
private
|
7
|
-
MATCH_INTERVAL = 0.5
|
8
|
-
AppOutput = Struct.new(:title, :screenshot64)
|
9
|
-
|
10
|
-
attr_reader :eyes, :agent_connector, :session, :driver, :default_retry_timeout, :last_checked_window ,:last_screenshot_bounds
|
11
|
-
|
12
|
-
public
|
13
|
-
#noinspection RubyParameterNamingConvention
|
14
|
-
def initialize(eyes, agent_connector, session, driver, default_retry_timeout)
|
15
|
-
@eyes = eyes
|
16
|
-
@agent_connector = agent_connector
|
17
|
-
@session = session
|
18
|
-
@driver = driver
|
19
|
-
@default_retry_timeout = default_retry_timeout
|
20
|
-
@last_checked_window = nil # +ChunkyPNG::Canvas+
|
21
|
-
@last_screenshot_bounds = Applitools::Region::EMPTY # +Applitools::Region+
|
22
|
-
@current_screenshot = nil # +ChunkyPNG::Canvas+
|
23
|
-
end
|
24
|
-
|
25
|
-
def match_window(region, retry_timeout, tag, rotation, run_once_after_wait=false)
|
26
|
-
if retry_timeout < 0
|
27
|
-
retry_timeout = default_retry_timeout
|
28
|
-
end
|
29
|
-
EyesLogger.debug "Retry timeout set to: #{retry_timeout}"
|
30
|
-
start = Time.now
|
31
|
-
res = if retry_timeout.zero?
|
32
|
-
run(region, tag, rotation)
|
33
|
-
elsif run_once_after_wait
|
34
|
-
run(region, tag, rotation, retry_timeout)
|
35
|
-
else
|
36
|
-
run_with_intervals(region, tag, rotation, retry_timeout)
|
37
|
-
end
|
38
|
-
elapsed_time = Time.now - start
|
39
|
-
EyesLogger.debug "match_window(): Completed in #{format('%.2f', elapsed_time)} seconds"
|
40
|
-
@last_checked_window = @current_screenshot
|
41
|
-
@last_screenshot_bounds = region.empty? ? Applitools::Region.new(0, 0, last_checked_window.width, last_checked_window.height) : region
|
42
|
-
#noinspection RubyUnnecessaryReturnStatement
|
43
|
-
driver.eyes.clear_user_inputs and return res
|
44
|
-
end
|
45
|
-
|
46
|
-
def run(region, tag, rotation, wait_before_run=nil)
|
47
|
-
EyesLogger.debug 'Trying matching once...'
|
48
|
-
if wait_before_run
|
49
|
-
EyesLogger.debug 'waiting before run...'
|
50
|
-
sleep(wait_before_run)
|
51
|
-
EyesLogger.debug 'waiting done!'
|
52
|
-
end
|
53
|
-
match(region, tag, rotation)
|
54
|
-
end
|
55
|
-
|
56
|
-
def run_with_intervals(region, tag, rotation, retry_timeout)
|
57
|
-
# We intentionally take the first screenshot before starting the timer, to allow the page
|
58
|
-
# just a tad more time to stabilize.
|
59
|
-
EyesLogger.debug 'Matching with intervals...'
|
60
|
-
data = prep_match_data(region, tag, rotation, true)
|
61
|
-
start = Time.now
|
62
|
-
as_expected = agent_connector.match_window(session, data)
|
63
|
-
EyesLogger.debug "First call result: #{as_expected}"
|
64
|
-
return true if as_expected
|
65
|
-
EyesLogger.debug "Not as expected, performing retry (total timeout #{retry_timeout})"
|
66
|
-
match_retry = Time.now - start
|
67
|
-
while match_retry < retry_timeout
|
68
|
-
EyesLogger.debug 'Waiting before match...'
|
69
|
-
sleep(MATCH_INTERVAL)
|
70
|
-
EyesLogger.debug 'Done! Matching...'
|
71
|
-
return true if match(region, tag, rotation, true)
|
72
|
-
match_retry = Time.now - start
|
73
|
-
EyesLogger.debug "Elapsed time: #{match_retry}"
|
74
|
-
end
|
75
|
-
## lets try one more time if we still don't have a match
|
76
|
-
EyesLogger.debug 'Last attempt to match...'
|
77
|
-
as_expected = match(region, tag, rotation)
|
78
|
-
EyesLogger.debug "Match result: #{as_expected}"
|
79
|
-
as_expected
|
80
|
-
end
|
81
|
-
|
82
|
-
private
|
83
|
-
|
84
|
-
def get_clipped_region(region, image)
|
85
|
-
left, top = [region.left, 0].max, [region.top, 0].max
|
86
|
-
max_width = image.width - left
|
87
|
-
max_height = image.height - top
|
88
|
-
width, height = [region.width, max_width].min, [region.height, max_height].min
|
89
|
-
Applitools::Region.new(left, top, width, height)
|
90
|
-
end
|
91
|
-
|
92
|
-
def prep_match_data(region, tag, rotation, ignore_mismatch)
|
93
|
-
EyesLogger.debug 'Preparing match data...'
|
94
|
-
title = eyes.title
|
95
|
-
EyesLogger.debug 'Getting screenshot...'
|
96
|
-
current_screenshot_encoded = driver.screenshot_as(:png, rotation)
|
97
|
-
EyesLogger.debug 'Done! Creating image object from PNG...'
|
98
|
-
@current_screenshot = ChunkyPNG::Image.from_blob(current_screenshot_encoded)
|
99
|
-
EyesLogger.debug 'Done!'
|
100
|
-
# If a region was defined, we refer to the sub-image defined by the region.
|
101
|
-
unless region.empty?
|
102
|
-
EyesLogger.debug 'Calculating clipped region...'
|
103
|
-
# If the region is out of bounds, clip it
|
104
|
-
clipped_region = get_clipped_region(region, @current_screenshot)
|
105
|
-
raise Applitools::EyesError.new("Region is outside the viewport: #{region}") if clipped_region.empty?
|
106
|
-
EyesLogger.debug 'Done! Cropping region...'
|
107
|
-
@current_screenshot.crop!(clipped_region.left, clipped_region.top, clipped_region.width, clipped_region.height)
|
108
|
-
EyesLogger.debug 'Done! Creating cropped image object...'
|
109
|
-
current_screenshot_encoded = @current_screenshot.to_blob.force_encoding('BINARY')
|
110
|
-
EyesLogger.debug 'Done!'
|
111
|
-
end
|
112
|
-
EyesLogger.debug 'Compressing screenshot...'
|
113
|
-
compressed_screenshot = Applitools::Utils::ImageDeltaCompressor.compress_by_raw_blocks(@current_screenshot,
|
114
|
-
current_screenshot_encoded,
|
115
|
-
last_checked_window)
|
116
|
-
EyesLogger.debug 'Done! Creating AppOuptut...'
|
117
|
-
app_output = AppOutput.new(title, nil)
|
118
|
-
user_inputs = []
|
119
|
-
EyesLogger.debug 'Handling user inputs...'
|
120
|
-
if !last_checked_window.nil?
|
121
|
-
driver.eyes.user_inputs.each do |trigger|
|
122
|
-
EyesLogger.debug 'Handling trigger...'
|
123
|
-
if trigger.is_a?(Applitools::MouseTrigger)
|
124
|
-
updated_trigger = nil
|
125
|
-
trigger_left = trigger.control.left + trigger.location.x
|
126
|
-
trigger_top = trigger.control.top + trigger.location.y
|
127
|
-
if last_screenshot_bounds.contains?(trigger_left, trigger_top)
|
128
|
-
trigger.control.intersect(last_screenshot_bounds)
|
129
|
-
if trigger.control.empty?
|
130
|
-
trigger_left = trigger_left - last_screenshot_bounds.left
|
131
|
-
trigger_top = trigger_top -last_screenshot_bounds.top
|
132
|
-
updated_trigger = Applitools::MouseTrigger.new(trigger.mouse_action, trigger.control, Selenium::WebDriver::Point.new(trigger_left, trigger_top))
|
133
|
-
else
|
134
|
-
trigger_left = trigger_left - trigger.control.left
|
135
|
-
trigger_top = trigger_top - trigger.control.top
|
136
|
-
control_left = trigger.control.left - last_screenshot_bounds.left
|
137
|
-
control_top = trigger.control.top - last_screenshot_bounds.top
|
138
|
-
updated_control = Applitools::Region.new(control_left, control_top, trigger.control.width, trigger.control.height)
|
139
|
-
updated_trigger = Applitools::MouseTrigger.new(trigger.mouse_action, updated_control, Selenium::WebDriver::Point.new(trigger_left, trigger_top))
|
140
|
-
end
|
141
|
-
EyesLogger.debug 'Done with trigger!'
|
142
|
-
user_inputs << updated_trigger
|
143
|
-
else
|
144
|
-
EyesLogger.info "Trigger ignored: #{trigger} (out of bounds)"
|
145
|
-
end
|
146
|
-
elsif trigger.is_a?(Applitools::TextTrigger)
|
147
|
-
unless trigger.control.empty?
|
148
|
-
trigger.control.intersect(last_screenshot_bounds)
|
149
|
-
unless trigger.control.empty?
|
150
|
-
control_left = trigger.control.left - last_screenshot_bounds.left
|
151
|
-
control_top = trigger.control.top - last_screenshot_bounds.top
|
152
|
-
updated_control = Applitools::Region.new(control_left, control_top, trigger.control.width, trigger.control.height)
|
153
|
-
updated_trigger = Applitools::TextTrigger.new(trigger.text, updated_control)
|
154
|
-
EyesLogger.debug 'Done with trigger!'
|
155
|
-
user_inputs << updated_trigger
|
156
|
-
else
|
157
|
-
EyesLogger.info "Trigger ignored: #{trigger} (control out of bounds)"
|
158
|
-
end
|
159
|
-
else
|
160
|
-
EyesLogger.info "Trigger ignored: #{trigger} (out of bounds)"
|
161
|
-
end
|
162
|
-
else
|
163
|
-
EyesLogger.info "Trigger ignored: #{trigger} (Unrecognized trigger)"
|
164
|
-
end
|
165
|
-
end
|
166
|
-
else
|
167
|
-
EyesLogger.info 'Triggers ignored: no previous window checked'
|
168
|
-
end
|
169
|
-
EyesLogger.debug 'Creating MatchWindowData object..'
|
170
|
-
match_window_data_obj = Applitools::MatchWindowData.new(app_output, user_inputs, tag, ignore_mismatch, compressed_screenshot)
|
171
|
-
EyesLogger.debug 'Done creating MatchWindowData object!'
|
172
|
-
match_window_data_obj
|
173
|
-
end
|
174
|
-
|
175
|
-
def match(region, tag, rotation, ignore_mismatch=false)
|
176
|
-
EyesLogger.debug 'Match called...'
|
177
|
-
data = prep_match_data(region, tag, rotation, ignore_mismatch)
|
178
|
-
match_result = agent_connector.match_window(session, data)
|
179
|
-
EyesLogger.debug 'Match done!'
|
180
|
-
match_result
|
181
|
-
end
|
182
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
class Applitools::MouseTrigger
|
2
|
-
|
3
|
-
MOUSE_ACTION = { click: 'Click', right_click: 'RightClick', double_click: 'DoubleClick', move: 'Move', down: 'Down', up: 'Up' }
|
4
|
-
|
5
|
-
attr_reader :mouse_action, :control, :location
|
6
|
-
|
7
|
-
def initialize(mouse_action, control, location)
|
8
|
-
@mouse_action = mouse_action
|
9
|
-
@control = control
|
10
|
-
@location = location
|
11
|
-
end
|
12
|
-
|
13
|
-
def to_hash
|
14
|
-
{
|
15
|
-
triggetType: 'Mouse', mouseAction: MOUSE_ACTION[mouse_action],
|
16
|
-
control: control.to_hash, location: Hash[location.each_pair.to_a]
|
17
|
-
}
|
18
|
-
end
|
19
|
-
|
20
|
-
def to_s
|
21
|
-
"#{mouse_action} [#{control}] #{location.x}, #{location.y}"
|
22
|
-
end
|
23
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
class Applitools::Region
|
2
|
-
attr_accessor :left, :top, :width, :height
|
3
|
-
|
4
|
-
def initialize(left, top, width, height)
|
5
|
-
@left = left.round
|
6
|
-
@top = top.round
|
7
|
-
@width = width.round
|
8
|
-
@height = height.round
|
9
|
-
end
|
10
|
-
|
11
|
-
EMPTY = Applitools::Region.new(0, 0, 0, 0)
|
12
|
-
|
13
|
-
def make_empty
|
14
|
-
@left = EMPTY.left
|
15
|
-
@top = EMPTY.top
|
16
|
-
@width = EMPTY.width
|
17
|
-
@height = EMPTY.height
|
18
|
-
end
|
19
|
-
|
20
|
-
def empty?
|
21
|
-
self.left == EMPTY.left && self.top == EMPTY.top && self.width == EMPTY.width && self.height == EMPTY.height
|
22
|
-
end
|
23
|
-
|
24
|
-
def right
|
25
|
-
left + width
|
26
|
-
end
|
27
|
-
|
28
|
-
def bottom
|
29
|
-
top + height
|
30
|
-
end
|
31
|
-
|
32
|
-
def intersecting?(other)
|
33
|
-
((left <= other.left && other.left <= right) || (other.left <= left && left <= other.right)) \
|
34
|
-
&& ((top <= other.top && other.top <= bottom) || (other.top <= top && top <=other.bottom))
|
35
|
-
end
|
36
|
-
|
37
|
-
def intersect(other)
|
38
|
-
if !intersecting?(other)
|
39
|
-
make_empty and return
|
40
|
-
end
|
41
|
-
i_left = (left >= other.left) ? left : other.left
|
42
|
-
i_right = (right <= other.right) ? right : other.right
|
43
|
-
i_top = (top >= other.top) ? top : other.top
|
44
|
-
i_bottom = (bottom <= other.bottom) ? bottom : other.bottom
|
45
|
-
|
46
|
-
self.left = i_left
|
47
|
-
self.top = i_top
|
48
|
-
self.width = i_right - i_left
|
49
|
-
self.height = i_bottom - i_top
|
50
|
-
end
|
51
|
-
|
52
|
-
def contains?(other_left, other_top)
|
53
|
-
other_left >= left && other_left <= right && \
|
54
|
-
other_top >= top && other_top <= bottom
|
55
|
-
end
|
56
|
-
|
57
|
-
def middle_offset
|
58
|
-
mid_x = width / 2
|
59
|
-
mid_y = height / 2
|
60
|
-
Selenium::WebDriver::Point.new(mid_x.round, mid_y.round)
|
61
|
-
end
|
62
|
-
|
63
|
-
def to_hash
|
64
|
-
{
|
65
|
-
left: left, top: top, height: height, width: width
|
66
|
-
}
|
67
|
-
end
|
68
|
-
|
69
|
-
def to_s
|
70
|
-
"(#{left}, #{top}), #{width} x #{height}"
|
71
|
-
end
|
72
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'httparty'
|
2
|
-
class Applitools::ScreenshotTaker
|
3
|
-
include HTTParty
|
4
|
-
headers 'Accept' => 'application/json'
|
5
|
-
headers 'Content-Type' => 'application/json'
|
6
|
-
|
7
|
-
attr_reader :driver_server_uri, :driver_session_id
|
8
|
-
|
9
|
-
def initialize(driver_server_uri, driver_session_id)
|
10
|
-
@driver_server_uri = driver_server_uri
|
11
|
-
@driver_session_id = driver_session_id
|
12
|
-
end
|
13
|
-
|
14
|
-
def screenshot
|
15
|
-
res = self.class.get(driver_server_uri.to_s.gsub(/\/$/,"") + "/session/#{driver_session_id}/screenshot")
|
16
|
-
res.parsed_response['value']
|
17
|
-
end
|
18
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
class Applitools::Session
|
2
|
-
attr_reader :eyes, :id, :url
|
3
|
-
attr_accessor :new_session
|
4
|
-
def initialize(session_id, session_url, new_session)
|
5
|
-
@new_session = new_session
|
6
|
-
@id = session_id
|
7
|
-
@url = session_url
|
8
|
-
end
|
9
|
-
|
10
|
-
def new_session?
|
11
|
-
self.new_session
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
@@ -1,32 +0,0 @@
|
|
1
|
-
class Applitools::StartInfo
|
2
|
-
|
3
|
-
ATTRIBUTES = %w[ agent_id app_id_or_name scenario_id_or_name batch_info env_name
|
4
|
-
environment match_level ver_id branch_name parent_branch_name ]
|
5
|
-
|
6
|
-
ATTRIBUTES.each do |attr|
|
7
|
-
attr_accessor attr
|
8
|
-
end
|
9
|
-
|
10
|
-
## add a config file with this stuff, and use hash arg
|
11
|
-
def initialize(agent_id, app_id_or_name, scenario_id_or_name, batch_info, env_name, environment, match_level, ver_id=nil,
|
12
|
-
branch_name=nil, parent_branch_name=nil)
|
13
|
-
@agent_id = agent_id
|
14
|
-
@app_id_or_name = app_id_or_name
|
15
|
-
@ver_id = ver_id
|
16
|
-
@scenario_id_or_name = scenario_id_or_name
|
17
|
-
@batch_info = batch_info
|
18
|
-
@env_name = env_name
|
19
|
-
@environment = environment
|
20
|
-
@match_level = match_level
|
21
|
-
@branch_name = branch_name
|
22
|
-
@parent_branch_name = parent_branch_name
|
23
|
-
end
|
24
|
-
|
25
|
-
def to_hash
|
26
|
-
{
|
27
|
-
AgentId: agent_id, AppIdOrName: app_id_or_name, VerId: ver_id, ScenarioIdOrName: scenario_id_or_name,
|
28
|
-
BatchInfo: batch_info.to_hash, EnvName: env_name, Environment: environment.to_hash, matchLevel: match_level, branchName: branch_name,
|
29
|
-
parentBranchName: parent_branch_name
|
30
|
-
}
|
31
|
-
end
|
32
|
-
end
|