scoutui 2.0.5.1.1.pre → 2.0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -2
- data/README.md +0 -7
- data/examples/ex1/phantom.chrome.json +4 -0
- data/examples/ex1/run.sh +85 -0
- data/examples/ex1/simple.yml +13 -0
- data/examples/ex1/win10.chromebeta.json +6 -0
- data/lib/scoutui/appmodel/q_model.rb +5 -0
- data/lib/scoutui/base/assertions.rb +49 -11
- data/lib/scoutui/base/q_browser.rb +181 -15
- data/lib/scoutui/base/q_har_mgr.rb +63 -0
- data/lib/scoutui/base/test_data.rb +0 -2
- data/lib/scoutui/base/test_scout.rb +2 -1
- data/lib/scoutui/base/user_vars.rb +1 -1
- data/lib/scoutui/base/visual_test_framework.rb +78 -15
- data/lib/scoutui/commands/clauses/do_until.rb +25 -6
- data/lib/scoutui/commands/clauses/then_clause.rb +12 -0
- data/lib/scoutui/commands/click_object.rb +5 -2
- data/lib/scoutui/commands/commands.rb +85 -10
- data/lib/scoutui/commands/highlight.rb +72 -21
- data/lib/scoutui/commands/mouse_over.rb +4 -2
- data/lib/scoutui/commands/pause.rb +9 -2
- data/lib/scoutui/commands/strategy.rb +21 -2
- data/lib/scoutui/commands/type.rb +40 -5
- data/lib/scoutui/eyes/eye_scout.rb +2 -1
- data/lib/scoutui/utils/utils.rb +9 -0
- data/lib/scoutui/version.rb +1 -1
- data/scoutui.gemspec +2 -3
- metadata +15 -59
- data/bin/scoutui_driver +0 -1
- data/examples/benchmark/ex.rb +0 -16
- data/examples/capabilities/win10.chrome46.json +0 -6
- data/examples/carmax/appmodel/search_results.json +0 -27
- data/examples/carmax/commands/commands.yml +0 -63
- data/examples/cmdshell/commands/hello.yml +0 -22
- data/examples/converters/jsonupdate.rb +0 -31
- data/examples/ex2/appmodel/common.json +0 -51
- data/examples/ex2/appmodel/page_model.json +0 -106
- data/examples/ex2/appmodel/register.model.json +0 -42
- data/examples/ex2/commands/commands.basic.appmodel.yml +0 -8
- data/examples/ex2/commands/commands.yml +0 -115
- data/examples/ex2/commands/ex1.yml +0 -7
- data/examples/ex2/commands/ex1c.yml +0 -8
- data/examples/ex2/commands/ex1d.yml +0 -22
- data/examples/ex2/commands/ex2.hover.yml +0 -43
- data/examples/ex2/commands/ex2.yml +0 -24
- data/examples/ex2/data.json +0 -6
- data/examples/ex2/test-configs/test.config.basic.json +0 -12
- data/examples/ex2/test-configs/test.config.json +0 -31
- data/examples/ex2/tests/run-test.sh +0 -125
- data/examples/ex2/tests/test-basic-appmodel.sh +0 -14
- data/examples/ex2/tests/test-example.sh +0 -39
- data/examples/ex2/tests/test-example1a.sh +0 -16
- data/examples/ex2/tests/test-example1b.sh +0 -13
- data/examples/ex2/tests/test-example1c.sh +0 -15
- data/examples/ex2/tests/test-example1d.sh +0 -15
- data/examples/ex2/tests/test-example2.forms.eyes.sh +0 -40
- data/examples/ex2/tests/test-example2.hover.eyes.sh +0 -40
- data/examples/ex2/tests/test-example2.hover.sh +0 -26
- data/examples/ex2/tests/test-example2.sh +0 -43
- data/examples/ex2/tests/test-example3.sauce.sh +0 -77
- data/examples/ex2/tests/test-example3.sh +0 -41
- data/examples/headless/run.sh +0 -15
- data/examples/http/sendreq.rb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bf25b876e2b1c0a035ed517d11c2d203c6cc03a
|
4
|
+
data.tar.gz: 9fca81eb8591811dab1ead346e4de8ae79e8d442
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2036f7dfa5c56df51e25e2fba6a2222f05d45be3a3bd5c512fb1a9743387cd98f9395a4c7146a0c223102bb5973d886bb5fd541cf8c3a80527a2a6d02ce2424a
|
7
|
+
data.tar.gz: bfae98f500030457e0e02afb698eaa2f14c28835b2040c555351428bded9e7e5511aa7030eeed5c69569989bc6d404845377c671b56236976bc4ac9767b532d8
|
data/.gitignore
CHANGED
data/README.md
CHANGED
data/examples/ex1/run.sh
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
##
|
3
|
+
# H20Dragon
|
4
|
+
##
|
5
|
+
|
6
|
+
##
|
7
|
+
# Execute test on Chrome locally.
|
8
|
+
##
|
9
|
+
run_chrome()
|
10
|
+
{
|
11
|
+
CMD=$1
|
12
|
+
ruby $SCOUTUI_BIN --config ./test.config.json \
|
13
|
+
--browser chrome \
|
14
|
+
--host "http://www.elvis-presley.com" \
|
15
|
+
--viewport 800x600 \
|
16
|
+
--dut ${CMD} --debug
|
17
|
+
}
|
18
|
+
|
19
|
+
##
|
20
|
+
# Execute test on Firefox locally.
|
21
|
+
##
|
22
|
+
run_firefox()
|
23
|
+
{
|
24
|
+
CMD=$1
|
25
|
+
ruby $SCOUTUI_BIN --config ./test.config.json \
|
26
|
+
--browser firefox \
|
27
|
+
--host "http://www.elvis-presley.com" \
|
28
|
+
--viewport 800x600 \
|
29
|
+
--dut ${CMD} --debug
|
30
|
+
}
|
31
|
+
|
32
|
+
##
|
33
|
+
# Execute test on phantom (GhostDriver)
|
34
|
+
##
|
35
|
+
run_headless()
|
36
|
+
{
|
37
|
+
CMD=$1
|
38
|
+
ruby $SCOUTUI_BIN --config ./test.config.json \
|
39
|
+
--browser phantomjs \
|
40
|
+
--host "http://www.elvis-presley.com" \
|
41
|
+
--viewport 800x600 \
|
42
|
+
--dut ${CMD} --debug
|
43
|
+
}
|
44
|
+
|
45
|
+
|
46
|
+
##
|
47
|
+
# Run tests on ghostdriver (phantom) as defined in
|
48
|
+
# its capabilities file.
|
49
|
+
##
|
50
|
+
run_headless2()
|
51
|
+
{
|
52
|
+
CMD=$1
|
53
|
+
ruby $SCOUTUI_BIN --config ./test.config.json \
|
54
|
+
--capabilities ./phantom.chrome.json \
|
55
|
+
--host "http://www.elvis-presley.com" \
|
56
|
+
--viewport 800x600 \
|
57
|
+
--dut ${CMD} --debug
|
58
|
+
}
|
59
|
+
|
60
|
+
|
61
|
+
##
|
62
|
+
# Run a test on ghostdriver (phantom) defined by
|
63
|
+
# capabilities files, while taking screen shots.
|
64
|
+
##
|
65
|
+
run_screenshots_phantom()
|
66
|
+
{
|
67
|
+
CMD=$1
|
68
|
+
ruby $SCOUTUI_BIN --config ./test.config.json \
|
69
|
+
--capabilities ./phantom.chrome.json \
|
70
|
+
--screenshots:run true \
|
71
|
+
--screenshots:dir /tmp/phantom \
|
72
|
+
--host "http://www.elvis-presley.com" \
|
73
|
+
--viewport 800x600 \
|
74
|
+
--dut ${CMD} --debug
|
75
|
+
}
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
run_chrome ./simple.yml
|
80
|
+
run_firefox ./simple.yml
|
81
|
+
|
82
|
+
#run_headless ./simple.yml
|
83
|
+
#run_headless2 ./simple.yml
|
84
|
+
#run_screenshots_phantom ./simple.yml
|
85
|
+
|
@@ -18,6 +18,7 @@ module Scoutui::Base
|
|
18
18
|
{ :cmd => 'isText', :pattern => '^\s*[!]*(isText)\s*\(.*\)\s*\=\s*(.*)\s*$', :parse => lambda { |_a| _parseWith('isText', _a) } },
|
19
19
|
{ :cmd => 'isValue', :pattern => '^\s*[!]*(isValue)\s*\(.*\)\s*\=\s*(.*)\s*$', :parse => lambda { |_a| _parseWith('isValue', _a) } },
|
20
20
|
{ :cmd => 'visible', :pattern => '^\s*[!]*visible\((.*)\)\s*$', :parse => nil },
|
21
|
+
{ :cmd => 'isUrl', :pattern => '^\s*isUrl\((.*)\)\s*$', :parse => lambda { |_a| _parseWith('isUrl', _a) } },
|
21
22
|
{ :cmd => 'url', :pattern => '^\s*url\((.*)\)\s*$', :parse => lambda { |_a| _parseWith('url', _a) } },
|
22
23
|
{ :cmd => 'compare', :pattern => '/^\s*(\$\{.*\})\s*(==|!=)(.*)$', :parse => nil }
|
23
24
|
]
|
@@ -48,12 +49,12 @@ module Scoutui::Base
|
|
48
49
|
|
49
50
|
def isUrlMatch(my_driver, _a)
|
50
51
|
current_url = my_driver.current_url.to_s
|
51
|
-
expected_url = _a.match(/^\s*(url)\s*\((.*)\)
|
52
|
+
expected_url = _a.match(/^\s*(url|isUrl)\s*\((.*)\)\s*$/)[2].to_s
|
52
53
|
|
53
54
|
expected_regex = Regexp.new(Scoutui::Base::UserVars.instance.normalize(expected_url))
|
54
55
|
rc=!current_url.match(expected_regex).nil?
|
55
56
|
|
56
|
-
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " verify current url #{current_url} matches #{rc}"
|
57
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " verify current url #{current_url} matches regex #{expected_url} : #{rc}"
|
57
58
|
|
58
59
|
return rc
|
59
60
|
end
|
@@ -423,26 +424,31 @@ module Scoutui::Base
|
|
423
424
|
|
424
425
|
|
425
426
|
|
426
|
-
elsif _t.has_key?('cmd') && !_t['cmd'].empty? && _t['cmd'].match(/[!]*
|
427
|
+
elsif _t.has_key?('cmd') && !_t['cmd'].empty? && _t['cmd'].match(/[!]*is[tT]ext/i)
|
427
428
|
rc=false
|
428
429
|
|
429
430
|
if _obj.is_a?(Selenium::WebDriver::Element)
|
430
431
|
_v = _obj.text.to_s
|
432
|
+
|
433
|
+
puts __FILE__ + (__LINE__).to_s + " isText(#{_locator.to_s}) : #{_v} (tagname: #{_obj.tag_name}, displayed: #{_obj.displayed?.to_s}"
|
431
434
|
rc=!_v.match(/#{_t['expected_value']}/).nil?
|
432
435
|
|
433
|
-
if _t['cmd'].match(/^!\s*
|
436
|
+
if _t['cmd'].match(/^!\s*is[tT]ext/i)
|
434
437
|
rc=!rc
|
435
438
|
end
|
436
439
|
end
|
437
440
|
|
438
|
-
elsif _t.has_key?('cmd') && !_t['cmd'].empty? && _t['cmd'].match(/[!]*
|
441
|
+
elsif _t.has_key?('cmd') && !_t['cmd'].empty? && _t['cmd'].match(/[!]*is[vV]alue/i)
|
439
442
|
rc=false
|
440
443
|
|
441
444
|
if _obj.is_a?(Selenium::WebDriver::Element)
|
442
445
|
_v = _obj.attribute('value')
|
443
|
-
rc=!_v.match(/#{_t['expected_value']}/).nil?
|
444
446
|
|
445
|
-
|
447
|
+
_t['expected_value'] = Scoutui::Base::UserVars.instance.normalize(_t['expected_value'])
|
448
|
+
|
449
|
+
rc=!_v.match(/#{_t['expected_value']}/).nil?
|
450
|
+
|
451
|
+
if _t['cmd'].match(/^!\s*is[vV]alue/i)
|
446
452
|
rc=!rc
|
447
453
|
end
|
448
454
|
end
|
@@ -482,6 +488,7 @@ module Scoutui::Base
|
|
482
488
|
|
483
489
|
def isVisible?(my_driver, _execute_when, _enableAsserts=true)
|
484
490
|
rc=true
|
491
|
+
_state=nil
|
485
492
|
|
486
493
|
_tm = Scoutui::Commands::Utils.instance.getTimeout
|
487
494
|
|
@@ -518,11 +525,37 @@ module Scoutui::Base
|
|
518
525
|
|
519
526
|
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " visible => #{_locator}"
|
520
527
|
|
521
|
-
|
528
|
+
(0..3).each do |_retry|
|
529
|
+
begin
|
530
|
+
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
|
531
|
+
|
532
|
+
_obj=nil
|
533
|
+
|
534
|
+
isDisplayed = wait.until {
|
535
|
+
_obj = Scoutui::Base::QBrowser.findElement(my_driver, _locator, Scoutui::Commands::Utils.instance.getFrameSearch(), _tm) # Scoutui::Commands::Utils.instance.getTimeout)
|
536
|
+
_obj.is_a?(Selenium::WebDriver::Element) # && _obj.displayed?
|
537
|
+
}
|
538
|
+
|
539
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " #{_locator} => #{_obj} displayed:#{_obj.displayed?}"
|
522
540
|
|
523
|
-
|
541
|
+
_state = Scoutui::Base::QBrowser.isDisplayed?(_obj)
|
524
542
|
|
525
|
-
|
543
|
+
|
544
|
+
break if _state
|
545
|
+
|
546
|
+
rescue Selenium::WebDriver::Error::TimeOutError
|
547
|
+
puts __FILE__ + (__LINE__).to_s + " Timed out => #{_locator}"
|
548
|
+
|
549
|
+
rescue Selenium::WebDriver::Error::StaleElementReferenceError
|
550
|
+
puts __FILE__ + (__LINE__).to_s + " StaleElementReferenceError: retry #{_retry} : #{_locator}";
|
551
|
+
sleep(0.5)
|
552
|
+
end
|
553
|
+
end
|
554
|
+
|
555
|
+
|
556
|
+
if !_state
|
557
|
+
puts __FILE__ + (__LINE__).to_s + " Paused due to fail to find #{_locator}"; #STDIN.gets();
|
558
|
+
end
|
526
559
|
|
527
560
|
if !_enableAsserts
|
528
561
|
_rc=false
|
@@ -880,7 +913,12 @@ module Scoutui::Base
|
|
880
913
|
|
881
914
|
locator = pageObject['locator'].to_s
|
882
915
|
|
883
|
-
|
916
|
+
if pageObject.has_key?('frame')
|
917
|
+
# 5150
|
918
|
+
_obj=Scoutui::Base::QBrowser.findElementwithinFrame(my_driver, locator, pageObject['frame'], Scoutui::Commands::Utils.instance.getTimeout)
|
919
|
+
else
|
920
|
+
_obj = Scoutui::Base::QBrowser.getFirstObject(my_driver, locator, Scoutui::Commands::Utils.instance.getTimeout)
|
921
|
+
end
|
884
922
|
|
885
923
|
if cmd=='visible'
|
886
924
|
if !_obj.nil?
|
@@ -13,12 +13,23 @@ module Scoutui::Base
|
|
13
13
|
drv.browser.to_s.match(/chrome/i)
|
14
14
|
end
|
15
15
|
|
16
|
+
def self.saveScreenShot(drv, fullPath)
|
17
|
+
rc=false
|
18
|
+
begin
|
19
|
+
drv.save_screenshot(fullPath)
|
20
|
+
rc=true
|
21
|
+
rescue => ex
|
22
|
+
;
|
23
|
+
end
|
24
|
+
rc
|
25
|
+
end
|
26
|
+
|
16
27
|
def self.wait_for_not_displayed(drv, locator, _timeout=30)
|
17
|
-
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " wait_for_not_displayed(#{
|
28
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " wait_for_not_displayed(#{locator}"
|
18
29
|
rc=nil
|
19
30
|
begin
|
20
31
|
Selenium::WebDriver::Wait.new(timeout: _timeout).until {
|
21
|
-
rc=drv.find_element(:xpath =>
|
32
|
+
rc=drv.find_element(:xpath => locator).displayed?
|
22
33
|
obj=getObject(drv, obj, _timeout=nil)
|
23
34
|
}
|
24
35
|
rescue => ex
|
@@ -146,21 +157,22 @@ module Scoutui::Base
|
|
146
157
|
|
147
158
|
|
148
159
|
def self.switch_into_frame(drv, id)
|
149
|
-
|
160
|
+
_fcnId=" [switch_into_frame]"
|
161
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: (#{id})"
|
150
162
|
|
151
163
|
hit=nil
|
152
164
|
|
153
165
|
if isChrome?(drv)
|
154
166
|
|
155
|
-
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "
|
167
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: switch on Chrome browser"
|
156
168
|
bframes = drv.find_elements(:xpath, '//iframe')
|
157
169
|
|
158
|
-
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " //iframe : size #{bframes.size}"
|
170
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: //iframe : size #{bframes.size}"
|
159
171
|
|
160
172
|
if bframes.size == 0
|
161
173
|
bframes = drv.find_elements(:xpath, '//frame')
|
162
174
|
|
163
|
-
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " //frame : #{bframes.size}"
|
175
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: //frame : #{bframes.size}"
|
164
176
|
end
|
165
177
|
|
166
178
|
for i in 0 .. bframes.size - 1
|
@@ -180,7 +192,7 @@ module Scoutui::Base
|
|
180
192
|
hit = bframes[i]
|
181
193
|
drv.switch_to.frame hit
|
182
194
|
|
183
|
-
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " swtichframe to #{i} - #{_tag}"
|
195
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: swtichframe to #{i} - #{_tag}"
|
184
196
|
break
|
185
197
|
end
|
186
198
|
|
@@ -193,7 +205,7 @@ module Scoutui::Base
|
|
193
205
|
|
194
206
|
else
|
195
207
|
# Firefox, IE
|
196
|
-
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "
|
208
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "#{_fcnId}: drv.switch_to.frame(#{id.to_s}";
|
197
209
|
|
198
210
|
hit = drv.switch_to.frame(id.to_s.strip)
|
199
211
|
end
|
@@ -546,6 +558,103 @@ module Scoutui::Base
|
|
546
558
|
|
547
559
|
end
|
548
560
|
|
561
|
+
def self.findElementwithinFrame(drv, _locator, _frames, _timeout=nil)
|
562
|
+
|
563
|
+
puts __FILE__ + (__LINE__).to_s + " frameElementWithinFrame(#{_locator}, #{_frames}"
|
564
|
+
|
565
|
+
# 5150
|
566
|
+
|
567
|
+
obj=nil
|
568
|
+
if _frames.nil?
|
569
|
+
obj=findElement(drv, _locator, _frames, _timeout)
|
570
|
+
else
|
571
|
+
# Switch to default window
|
572
|
+
drv.switch_to.default_content
|
573
|
+
if switch_frame(drv, _frames)
|
574
|
+
|
575
|
+
(0..3).each do |_i|
|
576
|
+
obj = Scoutui::Base::QBrowser.getObject(drv, _locator, _timeout)
|
577
|
+
if !obj.nil?
|
578
|
+
break
|
579
|
+
end
|
580
|
+
end
|
581
|
+
|
582
|
+
end
|
583
|
+
|
584
|
+
end
|
585
|
+
|
586
|
+
puts __FILE__ + (__LINE__).to_s + " [return]:frameElementsWithinFrame(#{_locator}, #{_frames}) => #{obj.class}"
|
587
|
+
obj
|
588
|
+
end
|
589
|
+
|
590
|
+
|
591
|
+
def self.parseLocator(_locator)
|
592
|
+
# TODO: If its a pageObject reference (page(one).get().get()), then retrieve it.
|
593
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " parseLocator(#{_locator}"
|
594
|
+
|
595
|
+
if _locator.is_a?(Hash)
|
596
|
+
|
597
|
+
if _locator.has_key?('frame') && _locator.has_key?('locator')
|
598
|
+
|
599
|
+
_locator="#{_locator['frame']}.locator(#{_locator['locator']})"
|
600
|
+
elsif _locator.has_key?('locator')
|
601
|
+
_locator = _locator['locator']
|
602
|
+
end
|
603
|
+
|
604
|
+
end
|
605
|
+
|
606
|
+
return _locator if !_locator.is_a?(String)
|
607
|
+
|
608
|
+
locator=_locator
|
609
|
+
|
610
|
+
if Scoutui::ApplicationModel::QModel.isPageObject?(_locator) # _locator.match(/^page\([\w\d]+\)/)
|
611
|
+
pg = Scoutui::Utils::TestUtils.instance.getPageElement(_locator)
|
612
|
+
puts __FILE__ + (__LINE__).to_s + " [parseLocator]: pageObject(#{_locator}) => #{pg}"
|
613
|
+
|
614
|
+
if pg.is_a?(Hash)
|
615
|
+
|
616
|
+
if pg.has_key?('frame') && pg.has_key?('locator')
|
617
|
+
locator="#{pg['frame']}.locator(#{pg['locator']})"
|
618
|
+
elsif pg.has_key?('locator')
|
619
|
+
|
620
|
+
if pg['locator'].match((/^\s*([(frame\([^\(]*?\)\.)]*)\.(locator\((.*)\))\s*$/))
|
621
|
+
locator=pg['locator']
|
622
|
+
else
|
623
|
+
locator="locator(#{pg['locator']})"
|
624
|
+
end
|
625
|
+
|
626
|
+
end
|
627
|
+
|
628
|
+
end
|
629
|
+
end
|
630
|
+
|
631
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " | locator => #{locator}"
|
632
|
+
|
633
|
+
|
634
|
+
rc=locator.match(/^\s*([(frame\([^\(]*?\)\.)]*)\.(locator\((.*)\))\s*$/)
|
635
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " parseIt: #{locator} => #{rc}";
|
636
|
+
|
637
|
+
|
638
|
+
if rc
|
639
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "o rc[1] : #{rc[1].to_s}"
|
640
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "o rc[2] : #{rc[2]}"
|
641
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "o rc[3] : #{rc[3]}"
|
642
|
+
return { 'frame' => rc[1], 'locator' => rc[3] }
|
643
|
+
end
|
644
|
+
|
645
|
+
|
646
|
+
rc=locator.match(/^\s*(locator\((.*)\))\s*$/)
|
647
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " parseIt2: #{locator} => #{rc}"
|
648
|
+
|
649
|
+
if rc
|
650
|
+
puts "o rc[1] : #{rc[1]}"
|
651
|
+
puts "o rc[2] : #{rc[2]}"
|
652
|
+
return { 'locator' => rc[2] }
|
653
|
+
end
|
654
|
+
|
655
|
+
return { 'locator' => locator }
|
656
|
+
end
|
657
|
+
|
549
658
|
|
550
659
|
def self.findElement(drv, _locator, _frames, _timeout=nil)
|
551
660
|
|
@@ -559,6 +668,7 @@ module Scoutui::Base
|
|
559
668
|
obj = Scoutui::Base::QBrowser.getObject(drv, _locator, _timeout)
|
560
669
|
|
561
670
|
elsif Scoutui::Commands::Utils.instance.isFrameSearch?
|
671
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " isFrameSearch"
|
562
672
|
hits = Scoutui::Base::QBrowser.frame_getObject(drv, _locator, _timeout)
|
563
673
|
|
564
674
|
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " hits => #{hits.class} : #{hits}"
|
@@ -569,7 +679,19 @@ module Scoutui::Base
|
|
569
679
|
end
|
570
680
|
|
571
681
|
else
|
572
|
-
|
682
|
+
|
683
|
+
puts __FILE__ + (__LINE__).to_s + " Analyze locator : #{_locator}"
|
684
|
+
|
685
|
+
_parsed = Scoutui::Base::QBrowser.parseLocator(_locator)
|
686
|
+
|
687
|
+
puts __FILE__ + (__LINE__).to_s + " _parsed(#{_locator}) => #{_parsed}"
|
688
|
+
|
689
|
+
if _parsed.has_key?('frame') && _parsed.has_key?('locator')
|
690
|
+
obj = Scoutui::Base::QBrowser.findElementwithinFrame(drv, _parsed['locator'], _parsed['frame'], _timeout)
|
691
|
+
else
|
692
|
+
obj = Scoutui::Base::QBrowser.getObject(drv, _locator, _timeout)
|
693
|
+
end
|
694
|
+
|
573
695
|
end
|
574
696
|
|
575
697
|
|
@@ -681,6 +803,8 @@ module Scoutui::Base
|
|
681
803
|
locator=obj
|
682
804
|
locateBy=:xpath
|
683
805
|
locator=nil
|
806
|
+
_frame=nil
|
807
|
+
|
684
808
|
|
685
809
|
begin
|
686
810
|
|
@@ -701,6 +825,7 @@ module Scoutui::Base
|
|
701
825
|
if elt.is_a?(Hash)
|
702
826
|
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " JSON or Hash => #{elt}" if Scoutui::Utils::TestUtils.instance.isDebug?
|
703
827
|
locator = elt['locator'].to_s
|
828
|
+
_frame = elt['frame'] if elt.has_key?('frame')
|
704
829
|
else
|
705
830
|
locator=elt.to_s
|
706
831
|
end
|
@@ -726,6 +851,8 @@ module Scoutui::Base
|
|
726
851
|
else
|
727
852
|
locator=elt.to_s
|
728
853
|
end
|
854
|
+
else # Update locator to the defined user var.
|
855
|
+
locator = _x
|
729
856
|
end
|
730
857
|
|
731
858
|
end
|
@@ -743,19 +870,32 @@ module Scoutui::Base
|
|
743
870
|
end
|
744
871
|
|
745
872
|
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " By => #{locateBy.to_s}"
|
873
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " Frame => #{_frame.to_s}"
|
746
874
|
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " Locator => #{locator}"
|
747
875
|
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " Visible_When => #{visible_when}"
|
748
876
|
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " Timeout => #{_timeout}"
|
749
877
|
|
878
|
+
current_window=drv.window_handle
|
879
|
+
|
880
|
+
if !_frame.nil?
|
881
|
+
switch_frame(drv, _frame)
|
882
|
+
end
|
750
883
|
Selenium::WebDriver::Wait.new(timeout: _timeout).until { rc=drv.find_element( locateBy => locator) }
|
751
884
|
|
752
885
|
|
886
|
+
## The following line would render the found element as Stale (TBD).
|
887
|
+
## The caller is responsible to switching (back) to the target window.
|
888
|
+
if false && !_frame.nil?
|
889
|
+
drv.switch_to.window(current_window)
|
890
|
+
end
|
891
|
+
|
892
|
+
|
753
893
|
rescue Selenium::WebDriver::Error::TimeOutError
|
754
|
-
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "TimeoutError: #{locator} time out."
|
894
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " TimeoutError: #{locator} time out."
|
755
895
|
rc=nil
|
756
896
|
|
757
897
|
rescue Selenium::WebDriver::Error::NoSuchElementError
|
758
|
-
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + "NoSuchElementError: #{locator} not found."
|
898
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " NoSuchElementError: #{locator} not found."
|
759
899
|
rc=nil
|
760
900
|
|
761
901
|
rescue => ex
|
@@ -792,8 +932,8 @@ module Scoutui::Base
|
|
792
932
|
rc
|
793
933
|
end
|
794
934
|
|
795
|
-
def self.highlight(drv, locator, style={"color" => 255, "border" => 2}, fAncestors=true)
|
796
|
-
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " highLight(#{locator})"
|
935
|
+
def self.highlight(drv, locator, style={"color" => 'rgb(255, 16, 16)', "border" => 2}, fAncestors=true)
|
936
|
+
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__).to_s + " highLight(#{locator} with style #{style})"
|
797
937
|
|
798
938
|
rc=false
|
799
939
|
|
@@ -809,10 +949,36 @@ module Scoutui::Base
|
|
809
949
|
return rc
|
810
950
|
end
|
811
951
|
|
812
|
-
|
952
|
+
|
953
|
+
if style.has_key?("color")
|
954
|
+
|
955
|
+
color=style.has_key?("color")? style["color"] : 'rgb(255, 16, 16)'
|
956
|
+
|
957
|
+
_c = style["color"]
|
958
|
+
|
959
|
+
# TODO: refactor with command 'highlight.rb'
|
960
|
+
|
961
|
+
if _c.match(/\s*blue/i)
|
962
|
+
color='rgb(0, 0, 255)'
|
963
|
+
elsif _c.match(/\s*red/i)
|
964
|
+
color='rgb(255, 0, 0)'
|
965
|
+
elsif _c.match(/\s*yellow/i)
|
966
|
+
color='rgb(255, 255, 0)'
|
967
|
+
elsif _c.match(/\s*green/i)
|
968
|
+
color='rgb(0, 255, 0)'
|
969
|
+
elsif _c.match(/\s*gray/i)
|
970
|
+
color='rgb(128, 128, 128)'
|
971
|
+
end
|
972
|
+
|
973
|
+
end
|
974
|
+
|
975
|
+
|
813
976
|
border=style.has_key?("border")? style["border"] : 1
|
814
977
|
|
815
|
-
|
978
|
+
_js = "hlt = function(c) { c.style.border='solid #{border}px rgb(#{color}, 16, 16)'; }; return hlt(arguments[0]);"
|
979
|
+
|
980
|
+
# drv.execute_script("hlt = function(c) { c.style.border='solid #{border}px rgb(#{color}, 16, 16)'; }; return hlt(arguments[0]);", element)
|
981
|
+
drv.execute_script("hlt = function(c) { c.style.border='solid #{border}px #{color}'; }; return hlt(arguments[0]);", element)
|
816
982
|
parents = ""
|
817
983
|
|
818
984
|
if fAncestors
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
#require 'browsermob/proxy'
|
3
|
+
|
4
|
+
|
5
|
+
module Scoutui::Base
|
6
|
+
|
7
|
+
class QHarMgr
|
8
|
+
include Singleton
|
9
|
+
|
10
|
+
attr_accessor :proxy_binary
|
11
|
+
attr_accessor :proxy
|
12
|
+
attr_accessor :seleniumProfile
|
13
|
+
|
14
|
+
|
15
|
+
def initialize()
|
16
|
+
puts __FILE__ + (__LINE__).to_s + " -- start BrowserMob --" if Scoutui::Utils::TestUtils.instance.isDebug?
|
17
|
+
@proxy_binary = BrowserMob::Proxy::Server.new(ENV['BROWSER_MOB_BIN'], { :port => 8088 })
|
18
|
+
end
|
19
|
+
|
20
|
+
def start()
|
21
|
+
puts __FILE__ + (__LINE__).to_s + " --start --"
|
22
|
+
@proxy_binary.start
|
23
|
+
@proxy = @proxy_binary.create_proxy
|
24
|
+
@seleniumProfile = @proxy.selenium_proxy # Needed by Selenium instance
|
25
|
+
|
26
|
+
@proxy.new_har(:capture_headers => true)
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def getSeleniumProfile()
|
31
|
+
puts __FILE__ + (__LINE__).to_s + " == getSeleniumProfile() => #{@seleniumProfile} --"
|
32
|
+
@seleniumProfile
|
33
|
+
end
|
34
|
+
|
35
|
+
def stop(save_as=nil)
|
36
|
+
puts __FILE__ + (__LINE__).to_s + " -- stop(#{save_as.to_s} --"
|
37
|
+
# @proxy.close
|
38
|
+
|
39
|
+
if !save_as.nil?
|
40
|
+
@proxy.har.save_to(save_as)
|
41
|
+
end
|
42
|
+
|
43
|
+
@proxy.close
|
44
|
+
end
|
45
|
+
|
46
|
+
def capture_traffic
|
47
|
+
# @proxy.new_har
|
48
|
+
yield
|
49
|
+
@proxy.har
|
50
|
+
end
|
51
|
+
|
52
|
+
def run(n)
|
53
|
+
puts __FILE__ + (__LINE__).to_s + " -- run --"
|
54
|
+
@har = capture_traffic { yield }
|
55
|
+
# @proxy.close
|
56
|
+
# @har.save_to(n)
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
end
|
@@ -103,7 +103,8 @@ module Scoutui::Base
|
|
103
103
|
rescue => ex
|
104
104
|
Scoutui::Utils::TestUtils.instance.setState(:abort, __FILE__ + (__LINE__).to_s + " : #{ex.class.to_s}: #{ex}")
|
105
105
|
Scoutui::Logger::LogMgr.instance.warn __FILE__ + (__LINE__).to_s + " #{ex.class.to_s} Error during processing: #{ex}"
|
106
|
-
Scoutui::Logger::LogMgr.instance.warn ex.backtrace
|
106
|
+
# Scoutui::Logger::LogMgr.instance.warn ex.backtrace
|
107
|
+
Scoutui::Logger::LogMgr.instance.warn __FILE__ + (__LINE__).to_s + "Backtrace:\n\t#{ex.backtrace.join("\n\t")}"
|
107
108
|
ensure
|
108
109
|
Scoutui::Logger::LogMgr.instance.debug __FILE__ + (__LINE__ ).to_s + " Close Eyes" if Scoutui::Utils::TestUtils.instance.isDebug?
|
109
110
|
@eyeScout.closeOut()
|