gless 1.1.3 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Changelog.txt +2 -0
- data/examples/test_github/lib/config/development.yml.example +3 -2
- data/examples/test_github/lib/pages/test_github/blog_page.rb +1 -1
- data/examples/test_github/lib/pages/test_github/search_page.rb +11 -4
- data/examples/test_github/lib/pages/test_github_base_page.rb +4 -5
- data/examples/test_github/lib/test_github.rb +1 -4
- data/lib/gless/base_page.rb +86 -10
- data/lib/gless/browser.rb +1 -1
- data/lib/gless/session.rb +40 -6
- data/lib/gless/wrap_watir.rb +41 -7
- data/lib/gless.rb +1 -1
- metadata +3 -5
- data/.rvmrc +0 -34
- data/examples/test_github/lib/config/development.yml +0 -12
data/.gitignore
CHANGED
data/Changelog.txt
CHANGED
@@ -3,10 +3,11 @@
|
|
3
3
|
:class: TestGithub
|
4
4
|
:url: https://github.com
|
5
5
|
:browser:
|
6
|
-
:type:
|
7
|
-
:browser:
|
6
|
+
:type: remote # Local or remote
|
7
|
+
:browser: chrome # Which browser to use
|
8
8
|
:port: 4444 # If remote, port to connect to the selenimu server, otherwise ignored
|
9
9
|
:verbose: false # Whether to engage in more verbose/info level logging
|
10
10
|
:debug: false # Whether to engage in debug logging
|
11
11
|
:screenshots: false # Whether, if debugging is on, to create screenshots as part of the replay log
|
12
12
|
:thumbnails: false # Whether, if screenshots are on, to create small-ish "thumbnail" pictures on the replay page; requires the imagemagick system package and the mini_magick gem
|
13
|
+
:cache: false # Whether, by default, to cache elements, significantly improving performance. For individual elements, caching can be disabled by adding ":cache => false" to the element specifier.
|
@@ -3,10 +3,17 @@
|
|
3
3
|
module TestGithub
|
4
4
|
class SearchPage < TestGithub::BasePage
|
5
5
|
|
6
|
-
element :
|
7
|
-
element :
|
6
|
+
element :search_form , :form , :id => 'search_form' , :validator => true
|
7
|
+
element :search_input , :text_field , :class => 'search-page-input' , :validator => true , :parent => :search_form
|
8
|
+
element :search_button , :button , :text => 'Search' , :validator => true , :parent => :search_form
|
9
|
+
|
10
|
+
# Test validator blocks.
|
11
|
+
add_validator do |browser, session|
|
12
|
+
browser.url =~ /search/
|
13
|
+
end
|
8
14
|
|
9
15
|
url %r{^:base_url/search}
|
16
|
+
set_entry_url ':base_url/search'
|
10
17
|
|
11
18
|
expected_title %r{^(Code Search · GitHub|Search · \S+ · GitHub)$}
|
12
19
|
|
@@ -35,14 +42,14 @@ module TestGithub
|
|
35
42
|
end
|
36
43
|
|
37
44
|
def repositories
|
38
|
-
repos = self.
|
45
|
+
repos = self.lis.select { |li| li.class_name == 'public source' }
|
39
46
|
|
40
47
|
@session.log.debug "SearchPage: repositories: repos: #{repos.inspect}"
|
41
48
|
|
42
49
|
repositories = Hash.new
|
43
50
|
i = 0
|
44
51
|
repos.each do |repo|
|
45
|
-
link = repo.
|
52
|
+
link = repo.h3.a
|
46
53
|
data = Hash.new
|
47
54
|
data[:index] = i
|
48
55
|
data[:link] = link
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module TestGithub
|
2
2
|
class TestGithub::BasePage < Gless::BasePage
|
3
3
|
|
4
|
-
element :home , :link , :href =>
|
5
|
-
element :explore , :link , :href =>
|
6
|
-
element :
|
7
|
-
element :
|
8
|
-
element :blog , :link , :href => "https://github.com/blog" , :validator => true , :click_destination => :BlogPage
|
4
|
+
element :home , :link , :href => %r{^(https://github.com|)/?$} , :validator => true , :click_destination => :LoginPage
|
5
|
+
element :explore , :link , :href => %r{^(https://github.com|)/explore/?$} , :validator => true , :click_destination => :ExplorePage
|
6
|
+
element :features , :link , :href => %r{^(https://github.com|)/features/?$} , :validator => true , :click_destination => :FeaturesPage
|
7
|
+
element :blog , :link , :href => %r{^(https://github.com|)/blog/?$} , :validator => true , :click_destination => :BlogPage
|
9
8
|
|
10
9
|
end
|
11
10
|
end
|
@@ -34,7 +34,7 @@ module TestGithub
|
|
34
34
|
def goto_repository_from_anywhere name, repo_pattern
|
35
35
|
@logger.info "TestGithub Application: going to repository #{name}"
|
36
36
|
|
37
|
-
@session.
|
37
|
+
@session.enter TestGithub::SearchPage
|
38
38
|
|
39
39
|
@session.search_for name
|
40
40
|
|
@@ -52,9 +52,6 @@ module TestGithub
|
|
52
52
|
@logger.info "TestGithub Application: clicking explore."
|
53
53
|
@session.explore.click
|
54
54
|
|
55
|
-
@logger.info "TestGithub Application: clicking search."
|
56
|
-
@session.search.click
|
57
|
-
|
58
55
|
@logger.info "TestGithub Application: clicking features."
|
59
56
|
@session.features.click
|
60
57
|
|
data/lib/gless/base_page.rb
CHANGED
@@ -54,11 +54,21 @@ module Gless
|
|
54
54
|
end
|
55
55
|
|
56
56
|
# Calls back to Gless::Session. See overview documentation
|
57
|
-
#
|
57
|
+
# for +Gless::BasePage+
|
58
58
|
def inherited(klass)
|
59
59
|
Gless::Session.add_page_class klass
|
60
60
|
end
|
61
61
|
|
62
|
+
# @return [Array<String>] An list of element method names that the page
|
63
|
+
# model contains.
|
64
|
+
attr_writer :elements
|
65
|
+
|
66
|
+
# @return [Array] Just sets up a default (to wit, []) for
|
67
|
+
# elements
|
68
|
+
def elements
|
69
|
+
@elements ||= []
|
70
|
+
end
|
71
|
+
|
62
72
|
# @return [Array<String>] An list of elements (actually just
|
63
73
|
# their method names) that should *always* exist if this
|
64
74
|
# page is loaded; used to wait for the page to load and
|
@@ -72,6 +82,17 @@ module Gless
|
|
72
82
|
@validator_elements ||= []
|
73
83
|
end
|
74
84
|
|
85
|
+
# @return [Array<String>] An list of validator procedures for this page.
|
86
|
+
# This provides a more low-level version of validator elements. For
|
87
|
+
# more information, see the documentation for +add_validator+.
|
88
|
+
attr_writer :validator_blocks
|
89
|
+
|
90
|
+
# @return [Array] Just sets up a default (to wit, []) for
|
91
|
+
# validator_blocks
|
92
|
+
def validator_blocks
|
93
|
+
@validator_blocks ||= []
|
94
|
+
end
|
95
|
+
|
75
96
|
# Specifies the title that this page is expected to have.
|
76
97
|
#
|
77
98
|
# @param [String,Regexp] expected_title
|
@@ -98,8 +119,8 @@ module Gless
|
|
98
119
|
# That's about as complicated as it gets.
|
99
120
|
#
|
100
121
|
# The first two arguments (name and type) are required. The
|
101
|
-
# rest is a hash. +:
|
102
|
-
# (see below) have special meaning.
|
122
|
+
# rest is a hash. +:validator+, +:click_destination+, +:parent+,
|
123
|
+
# +:proc+, and +:cache+ (see below) have special meaning.
|
103
124
|
#
|
104
125
|
# Anything else is taken to be a Watir selector. If no
|
105
126
|
# selector is forthcoming, the name is taken to be the element
|
@@ -126,6 +147,21 @@ module Gless
|
|
126
147
|
# bit of the class name of the page that clicking on this
|
127
148
|
# element leads to, if any.
|
128
149
|
#
|
150
|
+
# @option opts [Symbol] :parent (nil) A symbol of a parent element
|
151
|
+
# to which matching is restricted.
|
152
|
+
#
|
153
|
+
# @option opts [Symbol] :cache (nil) If non-nil, overrides the default
|
154
|
+
# cache setting and determines whether caching is enabled for this
|
155
|
+
# element. If false, a new look-up will be performed each time the
|
156
|
+
# element is accessed, and, if true, a look-up will only be performed
|
157
|
+
# once until the session changes the page.
|
158
|
+
#
|
159
|
+
# @option opts [Symbol] :proc (nil) If present, specifies a manual,
|
160
|
+
# low-level procedure to return a watir element, which overrides other
|
161
|
+
# selectors. When the watir element is needed, this procedure is
|
162
|
+
# called with the parent watir element passed as the argument (see
|
163
|
+
# +:parent+) if it exists, and otherwise the browser.
|
164
|
+
#
|
129
165
|
# @option opts [Object] ANY All other opts keys are used as
|
130
166
|
# Watir selectors to find the element on the page.
|
131
167
|
def element basename, type, opts = {}
|
@@ -134,11 +170,12 @@ module Gless
|
|
134
170
|
|
135
171
|
# Promote various other things into selectors; do this before
|
136
172
|
# we add in the default below
|
137
|
-
non_selector_opts = [ :validator, :click_destination ]
|
173
|
+
non_selector_opts = [ :validator, :click_destination, :parent, :cache ]
|
138
174
|
if ! opts[:selector]
|
175
|
+
opts[:selector] = {} if ! opts.keys.empty?
|
139
176
|
opts.keys.each do |key|
|
140
|
-
if ! non_selector_opts.member?(key)
|
141
|
-
opts[:selector] =
|
177
|
+
if (! non_selector_opts.member?(key)) && (key != :selector)
|
178
|
+
opts[:selector][key] = opts[key]
|
142
179
|
opts.delete(key)
|
143
180
|
end
|
144
181
|
end
|
@@ -152,9 +189,12 @@ module Gless
|
|
152
189
|
selector = opts[:selector]
|
153
190
|
click_destination = opts[:click_destination]
|
154
191
|
validator = opts[:validator]
|
192
|
+
parent = opts[:parent]
|
193
|
+
cache = opts[:cache]
|
155
194
|
|
156
|
-
methname = basename.to_s.tr('-', '_')
|
195
|
+
methname = basename.to_s.tr('-', '_').to_sym
|
157
196
|
|
197
|
+
elements << methname
|
158
198
|
if validator
|
159
199
|
# No class-compile-time logging; it's way too much work, as this runs at *rake* time
|
160
200
|
# $master_logger.debug "In GenericBasePage, for #{self.name}, element: #{basename} is a validator"
|
@@ -167,10 +207,21 @@ module Gless
|
|
167
207
|
end
|
168
208
|
|
169
209
|
define_method methname do
|
170
|
-
Gless::WrapWatir.new(@browser, @session, type, selector, click_destination)
|
210
|
+
cached_elements[methname] ||= Gless::WrapWatir.new(@browser, @session, self, type, selector, click_destination, parent, cache)
|
171
211
|
end
|
172
212
|
end
|
173
213
|
|
214
|
+
# Adds the given block to the list of validators to this page, which is
|
215
|
+
# run to ensure that the page is loaded. This provides a low-level
|
216
|
+
# version of validator elements, which has more flexibility in
|
217
|
+
# determining whether the page is loaded. The block is given two
|
218
|
+
# arguments: the browser, and the session. The block is expected to
|
219
|
+
# return true if the validation succeeded; i.e., the page is currently
|
220
|
+
# loaded according to the validator's test; and otherwise false.
|
221
|
+
def add_validator &blk
|
222
|
+
validator_blocks << blk
|
223
|
+
end
|
224
|
+
|
174
225
|
# @return [Rexexp,String] Used to give the URL string or pattern that matches this page; example:
|
175
226
|
#
|
176
227
|
# url %r{^:base_url/accounts/[0-9]+/apps$}
|
@@ -235,12 +286,14 @@ module Gless
|
|
235
286
|
end
|
236
287
|
|
237
288
|
# Fake inheritance time
|
238
|
-
self.class.
|
289
|
+
self.class.elements += self.class.ancestors.map { |x| x.respond_to?( :elements ) ? x.elements : nil }
|
290
|
+
self.class.elements = self.class.elements.flatten.compact.uniq
|
291
|
+
self.class.validator_elements += self.class.ancestors.map { |x| x.respond_to?( :validator_elements ) ? x.validator_elements : nil }
|
239
292
|
self.class.validator_elements = self.class.validator_elements.flatten.compact.uniq
|
240
293
|
|
241
294
|
self.class.url_patterns.map! { |x| substitute x }
|
242
295
|
|
243
|
-
@session.log.debug "In GenericBasePage, for #{self.class.name}, init: class vars: #{self.class.entry_url}, #{self.class.url_patterns}, #{self.class.validator_elements}"
|
296
|
+
@session.log.debug "In GenericBasePage, for #{self.class.name}, init: class vars: #{self.class.entry_url}, #{self.class.url_patterns}, #{self.class.elements}, #{self.class.validator_elements}"
|
244
297
|
end
|
245
298
|
|
246
299
|
# Return true if the given url matches this page's patterns
|
@@ -264,6 +317,8 @@ module Gless
|
|
264
317
|
def enter
|
265
318
|
@session.log.debug "#{self.class.name}: enter"
|
266
319
|
|
320
|
+
raise "#{self.class.name}.enter: no entry_url has been set" if self.class.entry_url.nil?
|
321
|
+
|
267
322
|
arrived? do
|
268
323
|
@session.log.info "#{self.class.name}: about to goto #{self.class.entry_url} from #{@browser.url}"
|
269
324
|
@browser.goto self.class.entry_url
|
@@ -296,6 +351,13 @@ module Gless
|
|
296
351
|
end
|
297
352
|
end
|
298
353
|
|
354
|
+
self.class.validator_blocks.each do |x|
|
355
|
+
if ! x.call @browser, @session
|
356
|
+
@session.log.debug "In GenericBasePage, for #{self.class.name}, arrived?: a validator block failed."
|
357
|
+
all_validate = false
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
299
361
|
if all_validate
|
300
362
|
if match_url( @browser.url )
|
301
363
|
@session.log.debug "In GenericBasePage, for #{self.class.name}, arrived?: all validator elements found."
|
@@ -335,5 +397,19 @@ module Gless
|
|
335
397
|
end
|
336
398
|
end
|
337
399
|
end
|
400
|
+
|
401
|
+
#******************************
|
402
|
+
# Object Level
|
403
|
+
#******************************
|
404
|
+
|
405
|
+
# @return [Hash] A hash of cached +WrapWatir+ elements indexed by the
|
406
|
+
# symbol name. This hash is cleared whenever the page changes.
|
407
|
+
attr_writer :cached_elements
|
408
|
+
|
409
|
+
# @return [Hash] A hash of cached +WrapWatir+ elements indexed by the
|
410
|
+
# symbol name. This hash is cleared whenever the page changes.
|
411
|
+
def cached_elements
|
412
|
+
@cached_elements ||= {}
|
413
|
+
end
|
338
414
|
end
|
339
415
|
end
|
data/lib/gless/browser.rb
CHANGED
@@ -30,7 +30,7 @@ module Gless
|
|
30
30
|
@browser = Watir::Browser.new(:remote, :url => "http://127.0.0.1:#{port}/wd/hub", :desired_capabilities => capabilities)
|
31
31
|
else
|
32
32
|
@logger.info "Launching local browser #{browser}"
|
33
|
-
@browser = Watir::Browser.new
|
33
|
+
@browser = Watir::Browser.new browser
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
data/lib/gless/session.rb
CHANGED
@@ -123,6 +123,7 @@ module Gless
|
|
123
123
|
@acceptable_pages.each do |page|
|
124
124
|
log.debug "Session: Checking our current url, #{@browser.url}, for a match in #{page.name}: #{@pages[page].match_url(@browser.url)}"
|
125
125
|
if @pages[page].match_url(@browser.url)
|
126
|
+
clear_cache
|
126
127
|
good_page = true
|
127
128
|
@current_page = page
|
128
129
|
new_page = @pages[page]
|
@@ -281,21 +282,53 @@ module Gless
|
|
281
282
|
|
282
283
|
# Deals with popup alerts in the browser (i.e. the javascript
|
283
284
|
# alert() function). Always clicks "ok" or equivalent.
|
284
|
-
#
|
285
|
-
# FIXME: Check the text of the alert to see that it's the one
|
286
|
-
# we want.
|
287
285
|
#
|
288
286
|
# Note that we're using @browser because things can be a bit
|
289
287
|
# wonky during an alert; we don't want to run session's "are we
|
290
288
|
# on the right page?" tests, or even talk to the page object.
|
291
|
-
|
292
|
-
|
289
|
+
#
|
290
|
+
# @param [Boolean] wait_for_alert (true) Whether to wait until an alert
|
291
|
+
# is present, failing if the request times out, before processing it;
|
292
|
+
# otherwise, handle any alerts if there are any currently present.
|
293
|
+
#
|
294
|
+
# @param [String,Regexp] expected_text (nil) If not nil, the text of the
|
295
|
+
# pop-up alert is checked against this parameter; if it
|
296
|
+
# differs, an exception will be raised.
|
297
|
+
def handle_alert wait_for_alert = true, expected_text = nil
|
298
|
+
@browser.alert.wait_until_present if wait_for_alert
|
293
299
|
|
294
300
|
if @browser.alert.exists?
|
295
|
-
|
301
|
+
begin
|
302
|
+
if expected_text
|
303
|
+
current_text = @browser.alert.text
|
304
|
+
if (expected_text.kind_of? Regexp) ? expected_text !~ current_text : expected_text != current_text
|
305
|
+
msg = "The actual alert text differs from what was expected. current_text: #{current_text}; expected_text: #{expected_text}"
|
306
|
+
@logger.error msg
|
307
|
+
raise msg
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
@browser.alert.ok
|
312
|
+
rescue Selenium::WebDriver::Error::NoAlertPresentError => e
|
313
|
+
msg = "Alert no longer exists; likely closed by user: #{e.message}"
|
314
|
+
if wait_for_alert
|
315
|
+
@logger.warn msg
|
316
|
+
raise
|
317
|
+
else
|
318
|
+
@logger.info msg
|
319
|
+
end
|
320
|
+
end
|
296
321
|
end
|
297
322
|
end
|
298
323
|
|
324
|
+
# Clears the cached elements. Used before each page change.
|
325
|
+
#
|
326
|
+
# @param [Class] page_class The page class of the page whose cached
|
327
|
+
# elements are to be cleared; defaults to the current page.
|
328
|
+
def clear_cache page_class = nil
|
329
|
+
@pages[page_class || current_page].cached_elements = Hash.new
|
330
|
+
end
|
331
|
+
|
299
332
|
# Does the heavy lifting, such as it is, for +acceptable_pages=+
|
300
333
|
#
|
301
334
|
# @param [Class, Symbol, Array] newpage A page class, or a
|
@@ -372,6 +405,7 @@ module Gless
|
|
372
405
|
@acceptable_pages.each do |page|
|
373
406
|
log.debug "Session: change_pages: Checking our current url, #{url}, for a match in #{page.name}: #{@pages[page].match_url(url)}"
|
374
407
|
if @pages[page].match_url(url) and @pages[page].arrived? == true
|
408
|
+
clear_cache
|
375
409
|
good_page = true
|
376
410
|
@current_page = page
|
377
411
|
new_page = @pages[page]
|
data/lib/gless/wrap_watir.rb
CHANGED
@@ -21,6 +21,10 @@ module Gless
|
|
21
21
|
require 'rspec'
|
22
22
|
include RSpec::Matchers
|
23
23
|
|
24
|
+
# @return [Gless::WrapWatir] The symbol for the parent of this element,
|
25
|
+
# restricting the scope of its selectorselement.
|
26
|
+
attr_accessor :parent
|
27
|
+
|
24
28
|
# Sets up the wrapping.
|
25
29
|
#
|
26
30
|
# As a special case, note that the selectors can include a :proc
|
@@ -38,6 +42,7 @@ module Gless
|
|
38
42
|
#
|
39
43
|
# @param [Gless::Browser] browser
|
40
44
|
# @param [Gless::Session] session
|
45
|
+
# @param [Gless::BasePage] page
|
41
46
|
# @param [Symbol] orig_type The type of the element; normally
|
42
47
|
# with watir you'd do something like
|
43
48
|
#
|
@@ -51,32 +56,61 @@ module Gless
|
|
51
56
|
#
|
52
57
|
# is the selector arguments.
|
53
58
|
# @param [Gless::BasePage, Array<Gless::BasePage>] click_destination Optional. A list of pages that are OK places to end up after we click on this element
|
54
|
-
|
59
|
+
# @param [Gless:WrapWatir] parents The symbol for the parent element under which the wrapped element is restricted.
|
60
|
+
# @param [Boolean] cache Whether to cache this element. If false,
|
61
|
+
# +find_elem+, unless overridden with its argument, performs a lookup
|
62
|
+
# each time it is invoked; otherwise, the watir element is recorded
|
63
|
+
# and kept until the session changes the page. If nil, the default value
|
64
|
+
# is retrieved from the config.
|
65
|
+
def initialize(browser, session, page, orig_type, orig_selector_args, click_destination, parent, cache)
|
55
66
|
@browser = browser
|
56
67
|
@session = session
|
68
|
+
@page = page
|
57
69
|
@orig_type = orig_type
|
58
70
|
@orig_selector_args = orig_selector_args
|
59
71
|
@num_retries = 3
|
60
72
|
@wait_time = 30
|
61
73
|
@click_destination = click_destination
|
74
|
+
@parent = parent
|
75
|
+
@cache = cache.nil? ? @session.get_config(:global, :cache) : cache
|
62
76
|
end
|
63
77
|
|
64
78
|
# Finds the element in question; deals with the fact that the
|
65
|
-
# selector could actually be a Proc.
|
79
|
+
# selector could actually be a Proc. If the element has already been
|
80
|
+
# found, return it; to find the element regardless, use find_elem_directly.
|
66
81
|
#
|
67
82
|
# Has no parameters because it uses @orig_type and
|
68
83
|
# @orig_selector_args. If @orig_selector_args has a :proc
|
69
84
|
# element, runs that with the browser as an argument, otherwise
|
70
85
|
# just passes those variables to the Watir browser as normal.
|
71
|
-
|
86
|
+
#
|
87
|
+
# @param [Boolean] use_cache If not nil, overrides the element's +cache+
|
88
|
+
# value. If false, the element is re-located; otherwise, if the element
|
89
|
+
# has already been found, return it.
|
90
|
+
def find_elem use_cache = nil
|
91
|
+
use_cache = @cache if use_cache.nil?
|
92
|
+
if use_cache
|
93
|
+
@cached_elem ||= find_elem_directly
|
94
|
+
else
|
95
|
+
@cached_elem = find_elem_directly
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Find the element in question, regardless of whether the element has
|
100
|
+
# already been identified. The cache is complete ignored and is not
|
101
|
+
# updated. To update the cache and re-locate the element, use +find_elem
|
102
|
+
# false+
|
103
|
+
def find_elem_directly
|
72
104
|
tries=0
|
73
105
|
begin
|
74
|
-
# Do we want to return more than
|
106
|
+
# Do we want to return more than one element?
|
75
107
|
multiples = false
|
76
108
|
|
109
|
+
par = parent ? @page.send(parent).find_elem : @browser
|
110
|
+
|
77
111
|
if @orig_selector_args.has_key? :proc
|
78
112
|
# If it's a Proc, it can handle its own visibility checking
|
79
|
-
return @orig_selector_args[:proc].call
|
113
|
+
return @orig_selector_args[:proc].call par
|
80
114
|
else
|
81
115
|
# We want all the relevant elements, so force that if it's
|
82
116
|
# not what was asked for
|
@@ -91,7 +125,7 @@ module Gless
|
|
91
125
|
end
|
92
126
|
end
|
93
127
|
@session.log.debug "WrapWatir: find_elem: elements type: #{type}"
|
94
|
-
elems =
|
128
|
+
elems = par.send(type, @orig_selector_args)
|
95
129
|
end
|
96
130
|
|
97
131
|
@session.log.debug "WrapWatir: find_elem: elements identified by #{trimmed_selectors.inspect} initial version: #{elems.inspect}"
|
@@ -101,7 +135,7 @@ module Gless
|
|
101
135
|
# Generally, watir-webdriver code expects *something*
|
102
136
|
# back, and uses .present? to see if it's really there, so
|
103
137
|
# we get the singleton to satisfy that need.
|
104
|
-
return
|
138
|
+
return par.send(@orig_type, @orig_selector_args)
|
105
139
|
end
|
106
140
|
|
107
141
|
# We got something unexpected; just give it back
|
data/lib/gless.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gless
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-06-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -118,7 +118,6 @@ extensions: []
|
|
118
118
|
extra_rdoc_files: []
|
119
119
|
files:
|
120
120
|
- .gitignore
|
121
|
-
- .rvmrc
|
122
121
|
- Changelog.txt
|
123
122
|
- README.md
|
124
123
|
- Rakefile
|
@@ -127,7 +126,6 @@ files:
|
|
127
126
|
- examples/test_github/features/support/env.rb
|
128
127
|
- examples/test_github/features/support/step_definitions/test_github_steps.rb
|
129
128
|
- examples/test_github/features/test_github/test_github.feature
|
130
|
-
- examples/test_github/lib/config/development.yml
|
131
129
|
- examples/test_github/lib/config/development.yml.example
|
132
130
|
- examples/test_github/lib/pages/test_github/blog_page.rb
|
133
131
|
- examples/test_github/lib/pages/test_github/explore_page.rb
|
@@ -166,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
164
|
version: '0'
|
167
165
|
requirements: []
|
168
166
|
rubyforge_project:
|
169
|
-
rubygems_version: 1.8.
|
167
|
+
rubygems_version: 1.8.25
|
170
168
|
signing_key:
|
171
169
|
specification_version: 3
|
172
170
|
summary: A wrapper for Watir-WebDriver based on modelling web page and web site structure.
|
data/.rvmrc
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
#!/usr/bin/env bash
|
2
|
-
|
3
|
-
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
-
# development environment upon cd'ing into the directory
|
5
|
-
|
6
|
-
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
|
7
|
-
# Only full ruby name is supported here, for short names use:
|
8
|
-
# echo "rvm use 1.9.3" > .rvmrc
|
9
|
-
environment_id="ruby-1.9.3-p194@gless"
|
10
|
-
|
11
|
-
# Uncomment the following lines if you want to verify rvm version per project
|
12
|
-
# rvmrc_rvm_version="1.14.12 (stable)" # 1.10.1 seams as a safe start
|
13
|
-
# eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
|
14
|
-
# echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
|
15
|
-
# return 1
|
16
|
-
# }
|
17
|
-
|
18
|
-
# First we attempt to load the desired environment directly from the environment
|
19
|
-
# file. This is very fast and efficient compared to running through the entire
|
20
|
-
# CLI and selector. If you want feedback on which environment was used then
|
21
|
-
# insert the word 'use' after --create as this triggers verbose mode.
|
22
|
-
if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
|
23
|
-
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
24
|
-
then
|
25
|
-
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
26
|
-
[[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
|
27
|
-
\. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
|
28
|
-
else
|
29
|
-
# If the environment file has not yet been created, use the RVM CLI to select.
|
30
|
-
rvm --create "$environment_id" || {
|
31
|
-
echo "Failed to create RVM environment '${environment_id}'."
|
32
|
-
return 1
|
33
|
-
}
|
34
|
-
fi
|
@@ -1,12 +0,0 @@
|
|
1
|
-
:global: # This tag distinguishes the global config from the per-test configs; *do not remove*
|
2
|
-
:site:
|
3
|
-
:class: TestGithub
|
4
|
-
:url: https://github.com
|
5
|
-
:browser:
|
6
|
-
:type: remote # Local or remote
|
7
|
-
:browser: chrome # Which browser to use
|
8
|
-
:port: 7444 # If remote, port to connect to the selenimu server, otherwise ignored
|
9
|
-
:verbose: false # Whether to engage in more verbose/info level logging
|
10
|
-
:debug: false # Whether to engage in debug logging
|
11
|
-
:screenshots: false # Whether, if debugging is on, to create screenshots as part of the replay log
|
12
|
-
:thumbnails: false # Whether, if screenshots are on, to create small-ish "thumbnail" pictures on the replay page; requires the imagemagick system package and the mini_magick gem
|