gless 1.1.3 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|