isomorfeus-puppetmaster 0.4.0 → 0.4.1
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.
- checksums.yaml +4 -4
- data/LICENSE +8 -0
- data/README.md +7 -7
- data/lib/isomorfeus-puppetmaster.rb +46 -46
- data/lib/isomorfeus/puppetmaster.rb +1 -1
- data/lib/isomorfeus/puppetmaster/document.rb +271 -271
- data/lib/isomorfeus/puppetmaster/driver/puppeteer.rb +1 -1
- data/lib/isomorfeus/puppetmaster/driver_registration.rb +7 -9
- data/lib/isomorfeus/puppetmaster/dsl.rb +44 -44
- data/lib/isomorfeus/puppetmaster/server_registration.rb +1 -1
- data/lib/isomorfeus/puppetmaster/version.rb +1 -1
- metadata +35 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e39fd34e187e7a7d720f8686a4bddadc81a697f59ab00a73b805cd8a2948f2ea
|
4
|
+
data.tar.gz: 6617fe83dccd1184592ccac1d6f8b562f0e89cfb96670278c8344c4e90c4dfee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41a57c902823019014f86898f02cb30fa2c2c153b8839ae54be97e27b79f2dd610cb5949ca61dd624f389ff0e3239aa196faa950465ade8f781b4fca25ca1bd4
|
7
|
+
data.tar.gz: 267dd5d1757a8813f85b800e3e765de64d588dd9d88019f2f8a553e501da102a25700a22f60c2cc0027b8a20fad0ceb8304ed2d78a271c8a640ccceff0ce913f
|
data/LICENSE
CHANGED
@@ -19,3 +19,11 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
19
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
21
|
SOFTWARE.
|
22
|
+
|
23
|
+
Files in ruby/lib/isomorfeus/puppetmaster/rspec and ruby/spec directory originally taken from https://github.com/teamcapybara/capybara
|
24
|
+
|
25
|
+
(The MIT License)
|
26
|
+
|
27
|
+
Copyright (c) 2009-2018 Thomas Walpole, Jonas Nicklas
|
28
|
+
|
29
|
+
(as above)
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# isomorfeus-puppetmaster
|
2
2
|
|
3
3
|
A framework for acceptance tests or simply running tests in a headless browser.
|
4
|
-
Comes with drivers for
|
5
|
-
Allows for writing javascript tests in pure ruby.
|
4
|
+
Comes with drivers for chrome headless.
|
5
|
+
Allows for writing javascript browser tests in pure ruby.
|
6
6
|
|
7
7
|
### Community and Support
|
8
8
|
At the [Isomorfeus Framework Project](http://isomorfeus.com)
|
@@ -19,7 +19,7 @@ In Gemfile:
|
|
19
19
|
|
20
20
|
Also requires the following npm modules with recommended versions:
|
21
21
|
|
22
|
-
- [puppeteer
|
22
|
+
- [puppeteer 10.1.x](https://github.com/GoogleChrome/puppeteer#readme) - for the chrome driver
|
23
23
|
|
24
24
|
Simply install them in your projects root. Puppetmaster also depends on isomorfeus-speednode, which will be installed automatically.
|
25
25
|
Speednode will pickup the node modules then from the projects root node_modules directory.
|
@@ -27,12 +27,12 @@ Speednode will pickup the node modules then from the projects root node_modules
|
|
27
27
|
## Configuration
|
28
28
|
|
29
29
|
Puppetmaster provides these drivers:
|
30
|
-
-
|
31
|
-
-
|
30
|
+
- chrome - a real browser, headless, fast
|
31
|
+
- chrome_debug - opens a chrome browser window with devtools enabled, useful for debugging tests
|
32
32
|
|
33
|
-
|
33
|
+
Chrome is the default driver. Selecting another driver, for example firefox:
|
34
34
|
```ruby
|
35
|
-
Isomorfeus::Puppetmaster.driver = :
|
35
|
+
Isomorfeus::Puppetmaster.driver = :chrome_debug
|
36
36
|
```
|
37
37
|
|
38
38
|
Puppetmaster provides support for these rack servers:
|
@@ -1,46 +1,46 @@
|
|
1
|
-
require 'active_support/core_ext/string'
|
2
|
-
require 'uri'
|
3
|
-
require 'net/http'
|
4
|
-
require 'rack'
|
5
|
-
require 'opal'
|
6
|
-
require 'opal-browser'
|
7
|
-
require 'unparser'
|
8
|
-
require 'method_source'
|
9
|
-
require 'securerandom'
|
10
|
-
require 'isomorfeus-speednode'
|
11
|
-
|
12
|
-
# use execjs speednode for sure, unless something else has been specified
|
13
|
-
unless ENV["EXECJS_RUNTIME"]
|
14
|
-
ExecJS.runtime = ExecJS::Runtimes::Speednode
|
15
|
-
end
|
16
|
-
|
17
|
-
# require 'uglifier'
|
18
|
-
|
19
|
-
require 'isomorfeus/puppetmaster'
|
20
|
-
require 'isomorfeus/puppetmaster/self_forwardable'
|
21
|
-
require 'isomorfeus/puppetmaster/errors'
|
22
|
-
require 'isomorfeus/puppetmaster/cookie'
|
23
|
-
require 'isomorfeus/puppetmaster/console_message'
|
24
|
-
require 'isomorfeus/puppetmaster/request'
|
25
|
-
require 'isomorfeus/puppetmaster/response'
|
26
|
-
require 'isomorfeus/puppetmaster/node'
|
27
|
-
require 'isomorfeus/puppetmaster/node/content_editable'
|
28
|
-
require 'isomorfeus/puppetmaster/node/input'
|
29
|
-
require 'isomorfeus/puppetmaster/node/checkbox'
|
30
|
-
require 'isomorfeus/puppetmaster/node/filechooser'
|
31
|
-
require 'isomorfeus/puppetmaster/node/radiobutton'
|
32
|
-
require 'isomorfeus/puppetmaster/node/select'
|
33
|
-
require 'isomorfeus/puppetmaster/node/textarea'
|
34
|
-
require 'isomorfeus/puppetmaster/document'
|
35
|
-
require 'isomorfeus/puppetmaster/iframe'
|
36
|
-
require 'isomorfeus/puppetmaster/driver/puppeteer_document'
|
37
|
-
require 'isomorfeus/puppetmaster/driver/puppeteer_node'
|
38
|
-
require 'isomorfeus/puppetmaster/driver/puppeteer'
|
39
|
-
require 'isomorfeus/puppetmaster/driver_registration'
|
40
|
-
require 'isomorfeus/puppetmaster/server/executor_middleware'
|
41
|
-
require 'isomorfeus/puppetmaster/server/middleware'
|
42
|
-
require 'isomorfeus/puppetmaster/server/checker'
|
43
|
-
require 'isomorfeus/puppetmaster/server'
|
44
|
-
require 'isomorfeus/puppetmaster/server_registration'
|
45
|
-
|
46
|
-
require 'isomorfeus/puppetmaster/dsl'
|
1
|
+
require 'active_support/core_ext/string'
|
2
|
+
require 'uri'
|
3
|
+
require 'net/http'
|
4
|
+
require 'rack'
|
5
|
+
require 'opal'
|
6
|
+
require 'opal-browser'
|
7
|
+
require 'unparser'
|
8
|
+
require 'method_source'
|
9
|
+
require 'securerandom'
|
10
|
+
require 'isomorfeus-speednode'
|
11
|
+
|
12
|
+
# use execjs speednode for sure, unless something else has been specified
|
13
|
+
unless ENV["EXECJS_RUNTIME"]
|
14
|
+
ExecJS.runtime = ExecJS::Runtimes::Speednode
|
15
|
+
end
|
16
|
+
|
17
|
+
# require 'uglifier'
|
18
|
+
|
19
|
+
require 'isomorfeus/puppetmaster'
|
20
|
+
require 'isomorfeus/puppetmaster/self_forwardable'
|
21
|
+
require 'isomorfeus/puppetmaster/errors'
|
22
|
+
require 'isomorfeus/puppetmaster/cookie'
|
23
|
+
require 'isomorfeus/puppetmaster/console_message'
|
24
|
+
require 'isomorfeus/puppetmaster/request'
|
25
|
+
require 'isomorfeus/puppetmaster/response'
|
26
|
+
require 'isomorfeus/puppetmaster/node'
|
27
|
+
require 'isomorfeus/puppetmaster/node/content_editable'
|
28
|
+
require 'isomorfeus/puppetmaster/node/input'
|
29
|
+
require 'isomorfeus/puppetmaster/node/checkbox'
|
30
|
+
require 'isomorfeus/puppetmaster/node/filechooser'
|
31
|
+
require 'isomorfeus/puppetmaster/node/radiobutton'
|
32
|
+
require 'isomorfeus/puppetmaster/node/select'
|
33
|
+
require 'isomorfeus/puppetmaster/node/textarea'
|
34
|
+
require 'isomorfeus/puppetmaster/document'
|
35
|
+
require 'isomorfeus/puppetmaster/iframe'
|
36
|
+
require 'isomorfeus/puppetmaster/driver/puppeteer_document'
|
37
|
+
require 'isomorfeus/puppetmaster/driver/puppeteer_node'
|
38
|
+
require 'isomorfeus/puppetmaster/driver/puppeteer'
|
39
|
+
require 'isomorfeus/puppetmaster/driver_registration'
|
40
|
+
require 'isomorfeus/puppetmaster/server/executor_middleware'
|
41
|
+
require 'isomorfeus/puppetmaster/server/middleware'
|
42
|
+
require 'isomorfeus/puppetmaster/server/checker'
|
43
|
+
require 'isomorfeus/puppetmaster/server'
|
44
|
+
require 'isomorfeus/puppetmaster/server_registration'
|
45
|
+
|
46
|
+
require 'isomorfeus/puppetmaster/dsl'
|
@@ -1,271 +1,271 @@
|
|
1
|
-
module Isomorfeus
|
2
|
-
module Puppetmaster
|
3
|
-
class Document
|
4
|
-
extend Isomorfeus::Puppetmaster::SelfForwardable
|
5
|
-
|
6
|
-
document_forward %i[
|
7
|
-
all_text
|
8
|
-
accept_alert
|
9
|
-
accept_confirm
|
10
|
-
accept_leave_page
|
11
|
-
accept_prompt
|
12
|
-
body
|
13
|
-
bring_to_front
|
14
|
-
clear_authentication_credentials
|
15
|
-
clear_cookies
|
16
|
-
clear_extra_headers
|
17
|
-
clear_url_blacklist
|
18
|
-
close
|
19
|
-
cookies
|
20
|
-
console
|
21
|
-
dismiss_confirm
|
22
|
-
dismiss_leave_page
|
23
|
-
dismiss_prompt
|
24
|
-
dispatch_event
|
25
|
-
double_click
|
26
|
-
evaluate_script
|
27
|
-
execute_script
|
28
|
-
find
|
29
|
-
find_all
|
30
|
-
find_all_xpath
|
31
|
-
find_xpath
|
32
|
-
head
|
33
|
-
html
|
34
|
-
open_new_document
|
35
|
-
remove_cookie
|
36
|
-
reset_user_agent
|
37
|
-
right_click
|
38
|
-
scroll_by
|
39
|
-
scroll_to
|
40
|
-
set_authentication_credentials
|
41
|
-
set_extra_headers
|
42
|
-
set_url_blacklist
|
43
|
-
set_user_agent
|
44
|
-
title
|
45
|
-
url
|
46
|
-
user_agent
|
47
|
-
viewport_maximize
|
48
|
-
viewport_resize
|
49
|
-
viewport_size
|
50
|
-
wait_for
|
51
|
-
wait_for_xpath
|
52
|
-
]
|
53
|
-
|
54
|
-
document_forward_kwargs %i[
|
55
|
-
click
|
56
|
-
render_base64
|
57
|
-
save_pdf
|
58
|
-
save_screenshot
|
59
|
-
set_cookie
|
60
|
-
]
|
61
|
-
|
62
|
-
attr_reader :handle, :response
|
63
|
-
|
64
|
-
def initialize(driver, handle, response)
|
65
|
-
@driver = driver
|
66
|
-
@handle = handle
|
67
|
-
@response = response
|
68
|
-
ObjectSpace.define_finalizer(self, @driver.class.document_handle_disposer(@driver, @handle))
|
69
|
-
end
|
70
|
-
|
71
|
-
def browser
|
72
|
-
@driver.browser
|
73
|
-
end
|
74
|
-
|
75
|
-
def await_ruby(ruby_source = '', &block)
|
76
|
-
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
77
|
-
ruby_source = "#{ruby_source}.then { |result| $promise_result = result; $promise_resolved = true }.fail { |result| $promise_result = result; $promise_resolved = true }"
|
78
|
-
compiled_ruby = compile_ruby_source(ruby_source)
|
79
|
-
if compiled_ruby.start_with?('/*')
|
80
|
-
start_of_code = compiled_ruby.index('*/') + 3
|
81
|
-
compiled_ruby = compiled_ruby[start_of_code..-1]
|
82
|
-
end
|
83
|
-
evaluate_script <<~JAVASCRIPT
|
84
|
-
(function(){
|
85
|
-
fun = function() {
|
86
|
-
if (Opal) {
|
87
|
-
Opal.gvars.promise_resolved = false;
|
88
|
-
Opal.await_ruby_exception = null;
|
89
|
-
try {
|
90
|
-
return #{compiled_ruby}
|
91
|
-
} catch (e) {
|
92
|
-
Opal.await_ruby_exception = e;
|
93
|
-
Opal.gvars.promise_resolved = true;
|
94
|
-
}
|
95
|
-
} else {
|
96
|
-
setTimeout(fun, 100);
|
97
|
-
}
|
98
|
-
}
|
99
|
-
fun();
|
100
|
-
})()
|
101
|
-
JAVASCRIPT
|
102
|
-
have_result = false
|
103
|
-
start = Time.now
|
104
|
-
until have_result do
|
105
|
-
raise "await_ruby: execution timed out! Is Opal available?" if (Time.now - start) > 30
|
106
|
-
have_result = evaluate_script 'Opal ? Opal.gvars.promise_resolved : null'
|
107
|
-
sleep 0.1 unless have_result
|
108
|
-
end
|
109
|
-
result, exception = execute_script <<~JAVASCRIPT
|
110
|
-
var result;
|
111
|
-
var exception = false;
|
112
|
-
if (Opal.await_ruby_exception) {
|
113
|
-
var e = Opal.await_ruby_exception;
|
114
|
-
exception = { message: e.message, name: e.name, stack: e.stack }
|
115
|
-
} else if (Opal.gvars.promise_result['$respond_to?']('is_a?') && Opal.gvars.promise_result['$is_a?'](Opal.Exception)) {
|
116
|
-
let r = Opal.gvars.promise_result;
|
117
|
-
exception = { message: r.$message(), name: r.$class().$name(), stack: r.$backtrace() }
|
118
|
-
} else if (Opal.gvars.promise_result['$respond_to?']('to_n')) {
|
119
|
-
result = Opal.gvars.promise_result.$to_n()
|
120
|
-
} else { result = Opal.gvars.promise_result };
|
121
|
-
delete Opal.gvars.promise_result;
|
122
|
-
delete Opal.gvars.promise_resolved;
|
123
|
-
return [result, exception];
|
124
|
-
JAVASCRIPT
|
125
|
-
if exception
|
126
|
-
e = Isomorfeus::Puppetmaster::Error.new("#{exception['name']}: #{exception['message']}")
|
127
|
-
e.set_backtrace(exception['stack'])
|
128
|
-
raise e
|
129
|
-
end
|
130
|
-
result
|
131
|
-
end
|
132
|
-
|
133
|
-
def evaluate_ruby(ruby_source = '', &block)
|
134
|
-
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
135
|
-
compiled_ruby = compile_ruby_source(ruby_source)
|
136
|
-
if compiled_ruby.start_with?('/*')
|
137
|
-
start_of_code = compiled_ruby.index('*/') + 3
|
138
|
-
compiled_ruby = compiled_ruby[start_of_code..-1]
|
139
|
-
end
|
140
|
-
evaluate_script <<~JAVASCRIPT
|
141
|
-
(function(){
|
142
|
-
return #{compiled_ruby}
|
143
|
-
})()
|
144
|
-
JAVASCRIPT
|
145
|
-
end
|
146
|
-
|
147
|
-
def evaluate_with_opal(ruby_source = '', &block)
|
148
|
-
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
149
|
-
compiled_ruby = compile_ruby_source(ruby_source)
|
150
|
-
if compiled_ruby.start_with?('/*')
|
151
|
-
start_of_code = compiled_ruby.index('*/') + 3
|
152
|
-
compiled_ruby = compiled_ruby[start_of_code..-1]
|
153
|
-
end
|
154
|
-
evaluate_script <<~JAVASCRIPT
|
155
|
-
(function(){
|
156
|
-
if (typeof Opal === "undefined") {
|
157
|
-
#{Isomorfeus::Puppetmaster.opal_prelude}
|
158
|
-
}
|
159
|
-
return #{compiled_ruby}
|
160
|
-
})()
|
161
|
-
JAVASCRIPT
|
162
|
-
end
|
163
|
-
|
164
|
-
def go_back
|
165
|
-
@response = @driver.document_go_back(self)
|
166
|
-
self
|
167
|
-
end
|
168
|
-
|
169
|
-
def go_forward
|
170
|
-
@response = @driver.document_go_forward(self)
|
171
|
-
self
|
172
|
-
end
|
173
|
-
|
174
|
-
def goto(uri)
|
175
|
-
@response = @driver.document_goto(self, uri)
|
176
|
-
self
|
177
|
-
end
|
178
|
-
alias_method :visit, :goto
|
179
|
-
|
180
|
-
def has_content?(content, **options)
|
181
|
-
body.has_content?(content, **options)
|
182
|
-
end
|
183
|
-
|
184
|
-
def has_css?(selector, **options)
|
185
|
-
body.has_css?(selector, **options)
|
186
|
-
end
|
187
|
-
|
188
|
-
def has_current_path?(other_path)
|
189
|
-
path == other_path
|
190
|
-
end
|
191
|
-
|
192
|
-
def has_text?(text, **options)
|
193
|
-
body.has_text?(text, **options)
|
194
|
-
end
|
195
|
-
|
196
|
-
def has_xpath?(query, **options)
|
197
|
-
body.has_xpath?(query, **options)
|
198
|
-
end
|
199
|
-
|
200
|
-
def isomorphic(ruby_source = '', &block)
|
201
|
-
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
202
|
-
Isomorfeus::Puppetmaster.served_app.on_server(ruby_source)
|
203
|
-
evaluate_ruby(ruby_source)
|
204
|
-
end
|
205
|
-
|
206
|
-
def isomorphic_with_opal(ruby_source = '', &block)
|
207
|
-
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
208
|
-
Isomorfeus::Puppetmaster.served_app.on_server(ruby_source)
|
209
|
-
evaluate_with_opal(ruby_source)
|
210
|
-
end
|
211
|
-
|
212
|
-
def method_missing(name, *args)
|
213
|
-
method_name = name.to_s
|
214
|
-
if method_name.start_with?('find_by_')
|
215
|
-
what = method_name[8..-1]
|
216
|
-
return find("[#{what}=\"#{args.first}\"]") if %w[name type value].include?(what)
|
217
|
-
return find_xpath("//*[text()=\"#{args.first}\"]") if what == 'content'
|
218
|
-
elsif method_name.start_with?('has_')
|
219
|
-
# :has_checked_field?, #
|
220
|
-
# :has_content?,
|
221
|
-
# :has_css?,
|
222
|
-
# :has_field?,
|
223
|
-
# :has_link?,
|
224
|
-
# :has_select?,
|
225
|
-
# :has_selector?,
|
226
|
-
# :has_table?,
|
227
|
-
# :has_text?,
|
228
|
-
# :has_unchecked_field?,
|
229
|
-
# :has_xpath?,
|
230
|
-
# :has_button?, # method_missing
|
231
|
-
end
|
232
|
-
super(name, *args)
|
233
|
-
end
|
234
|
-
|
235
|
-
def open_document_by(&block)
|
236
|
-
open_documents = @driver.document_handles
|
237
|
-
block.call
|
238
|
-
new_documents = @driver.document_handles - open_documents
|
239
|
-
raise 'Multiple documents opened' if new_documents.size > 1
|
240
|
-
raise 'No window opened' if new_documents.size < 1
|
241
|
-
Isomorfeus::Puppetmaster::Document.new(@driver, new_documents.first, Isomorfeus::Puppetmaster::Response.new)
|
242
|
-
end
|
243
|
-
|
244
|
-
def path
|
245
|
-
URI.parse(url).path
|
246
|
-
end
|
247
|
-
|
248
|
-
def reload
|
249
|
-
@response = @driver.reload(self)
|
250
|
-
end
|
251
|
-
|
252
|
-
def respond_to?(name, include_private = false)
|
253
|
-
return true if %i[find_by_content find_by_name find_by_type find_by_value].include?(name)
|
254
|
-
super(name, include_private)
|
255
|
-
end
|
256
|
-
|
257
|
-
# assertions
|
258
|
-
# :assert_current_path,
|
259
|
-
# :assert_no_current_path
|
260
|
-
# assert_title
|
261
|
-
# assert_no_title
|
262
|
-
|
263
|
-
protected
|
264
|
-
|
265
|
-
def compile_ruby_source(source_code)
|
266
|
-
# TODO maybe use compile server, which can cache code
|
267
|
-
Opal.compile(source_code, parse_comments: false)
|
268
|
-
end
|
269
|
-
end
|
270
|
-
end
|
271
|
-
end
|
1
|
+
module Isomorfeus
|
2
|
+
module Puppetmaster
|
3
|
+
class Document
|
4
|
+
extend Isomorfeus::Puppetmaster::SelfForwardable
|
5
|
+
|
6
|
+
document_forward %i[
|
7
|
+
all_text
|
8
|
+
accept_alert
|
9
|
+
accept_confirm
|
10
|
+
accept_leave_page
|
11
|
+
accept_prompt
|
12
|
+
body
|
13
|
+
bring_to_front
|
14
|
+
clear_authentication_credentials
|
15
|
+
clear_cookies
|
16
|
+
clear_extra_headers
|
17
|
+
clear_url_blacklist
|
18
|
+
close
|
19
|
+
cookies
|
20
|
+
console
|
21
|
+
dismiss_confirm
|
22
|
+
dismiss_leave_page
|
23
|
+
dismiss_prompt
|
24
|
+
dispatch_event
|
25
|
+
double_click
|
26
|
+
evaluate_script
|
27
|
+
execute_script
|
28
|
+
find
|
29
|
+
find_all
|
30
|
+
find_all_xpath
|
31
|
+
find_xpath
|
32
|
+
head
|
33
|
+
html
|
34
|
+
open_new_document
|
35
|
+
remove_cookie
|
36
|
+
reset_user_agent
|
37
|
+
right_click
|
38
|
+
scroll_by
|
39
|
+
scroll_to
|
40
|
+
set_authentication_credentials
|
41
|
+
set_extra_headers
|
42
|
+
set_url_blacklist
|
43
|
+
set_user_agent
|
44
|
+
title
|
45
|
+
url
|
46
|
+
user_agent
|
47
|
+
viewport_maximize
|
48
|
+
viewport_resize
|
49
|
+
viewport_size
|
50
|
+
wait_for
|
51
|
+
wait_for_xpath
|
52
|
+
]
|
53
|
+
|
54
|
+
document_forward_kwargs %i[
|
55
|
+
click
|
56
|
+
render_base64
|
57
|
+
save_pdf
|
58
|
+
save_screenshot
|
59
|
+
set_cookie
|
60
|
+
]
|
61
|
+
|
62
|
+
attr_reader :handle, :response
|
63
|
+
|
64
|
+
def initialize(driver, handle, response)
|
65
|
+
@driver = driver
|
66
|
+
@handle = handle
|
67
|
+
@response = response
|
68
|
+
ObjectSpace.define_finalizer(self, @driver.class.document_handle_disposer(@driver, @handle))
|
69
|
+
end
|
70
|
+
|
71
|
+
def browser
|
72
|
+
@driver.browser
|
73
|
+
end
|
74
|
+
|
75
|
+
def await_ruby(ruby_source = '', &block)
|
76
|
+
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
77
|
+
ruby_source = "#{ruby_source}.then { |result| $promise_result = result; $promise_resolved = true }.fail { |result| $promise_result = result; $promise_resolved = true }"
|
78
|
+
compiled_ruby = compile_ruby_source(ruby_source)
|
79
|
+
if compiled_ruby.start_with?('/*')
|
80
|
+
start_of_code = compiled_ruby.index('*/') + 3
|
81
|
+
compiled_ruby = compiled_ruby[start_of_code..-1]
|
82
|
+
end
|
83
|
+
evaluate_script <<~JAVASCRIPT
|
84
|
+
(function(){
|
85
|
+
fun = function() {
|
86
|
+
if (Opal) {
|
87
|
+
Opal.gvars.promise_resolved = false;
|
88
|
+
Opal.await_ruby_exception = null;
|
89
|
+
try {
|
90
|
+
return #{compiled_ruby}
|
91
|
+
} catch (e) {
|
92
|
+
Opal.await_ruby_exception = e;
|
93
|
+
Opal.gvars.promise_resolved = true;
|
94
|
+
}
|
95
|
+
} else {
|
96
|
+
setTimeout(fun, 100);
|
97
|
+
}
|
98
|
+
}
|
99
|
+
fun();
|
100
|
+
})()
|
101
|
+
JAVASCRIPT
|
102
|
+
have_result = false
|
103
|
+
start = Time.now
|
104
|
+
until have_result do
|
105
|
+
raise "await_ruby: execution timed out! Is Opal available?" if (Time.now - start) > 30
|
106
|
+
have_result = evaluate_script 'Opal ? Opal.gvars.promise_resolved : null'
|
107
|
+
sleep 0.1 unless have_result
|
108
|
+
end
|
109
|
+
result, exception = execute_script <<~JAVASCRIPT
|
110
|
+
var result;
|
111
|
+
var exception = false;
|
112
|
+
if (Opal.await_ruby_exception) {
|
113
|
+
var e = Opal.await_ruby_exception;
|
114
|
+
exception = { message: e.message, name: e.name, stack: e.stack }
|
115
|
+
} else if (Opal.gvars.promise_result['$respond_to?']('is_a?') && Opal.gvars.promise_result['$is_a?'](Opal.Exception)) {
|
116
|
+
let r = Opal.gvars.promise_result;
|
117
|
+
exception = { message: r.$message(), name: r.$class().$name(), stack: r.$backtrace() }
|
118
|
+
} else if (Opal.gvars.promise_result['$respond_to?']('to_n')) {
|
119
|
+
result = Opal.gvars.promise_result.$to_n()
|
120
|
+
} else { result = Opal.gvars.promise_result };
|
121
|
+
delete Opal.gvars.promise_result;
|
122
|
+
delete Opal.gvars.promise_resolved;
|
123
|
+
return [result, exception];
|
124
|
+
JAVASCRIPT
|
125
|
+
if exception
|
126
|
+
e = Isomorfeus::Puppetmaster::Error.new("#{exception['name']}: #{exception['message']}")
|
127
|
+
e.set_backtrace(exception['stack'])
|
128
|
+
raise e
|
129
|
+
end
|
130
|
+
result
|
131
|
+
end
|
132
|
+
|
133
|
+
def evaluate_ruby(ruby_source = '', &block)
|
134
|
+
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
135
|
+
compiled_ruby = compile_ruby_source(ruby_source)
|
136
|
+
if compiled_ruby.start_with?('/*')
|
137
|
+
start_of_code = compiled_ruby.index('*/') + 3
|
138
|
+
compiled_ruby = compiled_ruby[start_of_code..-1]
|
139
|
+
end
|
140
|
+
evaluate_script <<~JAVASCRIPT
|
141
|
+
(function(){
|
142
|
+
return #{compiled_ruby}
|
143
|
+
})()
|
144
|
+
JAVASCRIPT
|
145
|
+
end
|
146
|
+
|
147
|
+
def evaluate_with_opal(ruby_source = '', &block)
|
148
|
+
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
149
|
+
compiled_ruby = compile_ruby_source(ruby_source)
|
150
|
+
if compiled_ruby.start_with?('/*')
|
151
|
+
start_of_code = compiled_ruby.index('*/') + 3
|
152
|
+
compiled_ruby = compiled_ruby[start_of_code..-1]
|
153
|
+
end
|
154
|
+
evaluate_script <<~JAVASCRIPT
|
155
|
+
(function(){
|
156
|
+
if (typeof Opal === "undefined") {
|
157
|
+
#{Isomorfeus::Puppetmaster.opal_prelude}
|
158
|
+
}
|
159
|
+
return #{compiled_ruby}
|
160
|
+
})()
|
161
|
+
JAVASCRIPT
|
162
|
+
end
|
163
|
+
|
164
|
+
def go_back
|
165
|
+
@response = @driver.document_go_back(self)
|
166
|
+
self
|
167
|
+
end
|
168
|
+
|
169
|
+
def go_forward
|
170
|
+
@response = @driver.document_go_forward(self)
|
171
|
+
self
|
172
|
+
end
|
173
|
+
|
174
|
+
def goto(uri)
|
175
|
+
@response = @driver.document_goto(self, uri)
|
176
|
+
self
|
177
|
+
end
|
178
|
+
alias_method :visit, :goto
|
179
|
+
|
180
|
+
def has_content?(content, **options)
|
181
|
+
body.has_content?(content, **options)
|
182
|
+
end
|
183
|
+
|
184
|
+
def has_css?(selector, **options)
|
185
|
+
body.has_css?(selector, **options)
|
186
|
+
end
|
187
|
+
|
188
|
+
def has_current_path?(other_path)
|
189
|
+
path == other_path
|
190
|
+
end
|
191
|
+
|
192
|
+
def has_text?(text, **options)
|
193
|
+
body.has_text?(text, **options)
|
194
|
+
end
|
195
|
+
|
196
|
+
def has_xpath?(query, **options)
|
197
|
+
body.has_xpath?(query, **options)
|
198
|
+
end
|
199
|
+
|
200
|
+
def isomorphic(ruby_source = '', &block)
|
201
|
+
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
202
|
+
Isomorfeus::Puppetmaster.served_app.on_server(ruby_source)
|
203
|
+
evaluate_ruby(ruby_source)
|
204
|
+
end
|
205
|
+
|
206
|
+
def isomorphic_with_opal(ruby_source = '', &block)
|
207
|
+
ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
|
208
|
+
Isomorfeus::Puppetmaster.served_app.on_server(ruby_source)
|
209
|
+
evaluate_with_opal(ruby_source)
|
210
|
+
end
|
211
|
+
|
212
|
+
def method_missing(name, *args)
|
213
|
+
method_name = name.to_s
|
214
|
+
if method_name.start_with?('find_by_')
|
215
|
+
what = method_name[8..-1]
|
216
|
+
return find("[#{what}=\"#{args.first}\"]") if %w[name type value].include?(what)
|
217
|
+
return find_xpath("//*[text()=\"#{args.first}\"]") if what == 'content'
|
218
|
+
elsif method_name.start_with?('has_')
|
219
|
+
# :has_checked_field?, #
|
220
|
+
# :has_content?,
|
221
|
+
# :has_css?,
|
222
|
+
# :has_field?,
|
223
|
+
# :has_link?,
|
224
|
+
# :has_select?,
|
225
|
+
# :has_selector?,
|
226
|
+
# :has_table?,
|
227
|
+
# :has_text?,
|
228
|
+
# :has_unchecked_field?,
|
229
|
+
# :has_xpath?,
|
230
|
+
# :has_button?, # method_missing
|
231
|
+
end
|
232
|
+
super(name, *args)
|
233
|
+
end
|
234
|
+
|
235
|
+
def open_document_by(&block)
|
236
|
+
open_documents = @driver.document_handles
|
237
|
+
block.call
|
238
|
+
new_documents = @driver.document_handles - open_documents
|
239
|
+
raise 'Multiple documents opened' if new_documents.size > 1
|
240
|
+
raise 'No window opened' if new_documents.size < 1
|
241
|
+
Isomorfeus::Puppetmaster::Document.new(@driver, new_documents.first, Isomorfeus::Puppetmaster::Response.new)
|
242
|
+
end
|
243
|
+
|
244
|
+
def path
|
245
|
+
URI.parse(url).path
|
246
|
+
end
|
247
|
+
|
248
|
+
def reload
|
249
|
+
@response = @driver.reload(self)
|
250
|
+
end
|
251
|
+
|
252
|
+
def respond_to?(name, include_private = false)
|
253
|
+
return true if %i[find_by_content find_by_name find_by_type find_by_value].include?(name)
|
254
|
+
super(name, include_private)
|
255
|
+
end
|
256
|
+
|
257
|
+
# assertions
|
258
|
+
# :assert_current_path,
|
259
|
+
# :assert_no_current_path
|
260
|
+
# assert_title
|
261
|
+
# assert_no_title
|
262
|
+
|
263
|
+
protected
|
264
|
+
|
265
|
+
def compile_ruby_source(source_code)
|
266
|
+
# TODO maybe use compile server, which can cache code
|
267
|
+
Opal.compile(source_code, parse_comments: false)
|
268
|
+
end
|
269
|
+
end
|
270
|
+
end
|
271
|
+
end
|
@@ -39,7 +39,7 @@ module Isomorfeus
|
|
39
39
|
# init ExecJS context
|
40
40
|
@app = options.delete(:app)
|
41
41
|
@options = options.dup
|
42
|
-
@browser_type = @options.delete(:browser_type) { :
|
42
|
+
@browser_type = @options.delete(:browser_type) { :chrome }
|
43
43
|
@options[:product] = "'#{@browser_type}'" unless @options.key?(:product)
|
44
44
|
@max_width = @options.delete(:max_width) { VIEWPORT_MAX_WIDTH }
|
45
45
|
@max_height = @options.delete(:max_height) { VIEWPORT_MAX_HEIGHT }
|
@@ -1,9 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
Isomorfeus::Puppetmaster::Driver::Puppeteer.new(browser_type: :chromium, headless: false, devtools: true, app: app)
|
9
|
-
end
|
1
|
+
Isomorfeus::Puppetmaster.register_driver(:chrome) do |app|
|
2
|
+
Isomorfeus::Puppetmaster::Driver::Puppeteer.new(browser_type: :chrome, headless: true, app: app)
|
3
|
+
end
|
4
|
+
|
5
|
+
Isomorfeus::Puppetmaster.register_driver(:chrome_debug) do |app|
|
6
|
+
Isomorfeus::Puppetmaster::Driver::Puppeteer.new(browser_type: :chrome, headless: false, app: app)
|
7
|
+
end
|
@@ -1,44 +1,44 @@
|
|
1
|
-
module Isomorfeus
|
2
|
-
module Puppetmaster
|
3
|
-
module DSL
|
4
|
-
def default_document
|
5
|
-
@puppetmaster_default_document ||= get_default_document
|
6
|
-
end
|
7
|
-
|
8
|
-
def goto(uri)
|
9
|
-
puppetmaster_session.document_goto(default_document, uri)
|
10
|
-
@puppetmaster_default_document
|
11
|
-
end
|
12
|
-
alias_method :visit, :goto
|
13
|
-
|
14
|
-
def on_server(ruby_source = '', &block)
|
15
|
-
Isomorfeus::Puppetmaster.served_app.on_server(ruby_source, &block)
|
16
|
-
end
|
17
|
-
|
18
|
-
def open_new_session(app = nil, driver = nil)
|
19
|
-
Isomorfeus::Puppetmaster.drivers[driver ? driver : Isomorfeus::Puppetmaster.driver].call(app ? app : Isomorfeus::Puppetmaster.served_app)
|
20
|
-
end
|
21
|
-
|
22
|
-
def open_new_document(uri = nil)
|
23
|
-
puppetmaster_session.document_open_new_document(nil, uri)
|
24
|
-
end
|
25
|
-
|
26
|
-
def reset_session!
|
27
|
-
@@puppetmaster_session = nil
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def get_default_document
|
33
|
-
doc = puppetmaster_session.default_document
|
34
|
-
return doc if doc
|
35
|
-
puppetmaster_session.document_open_new_document('about:blank')
|
36
|
-
end
|
37
|
-
|
38
|
-
def puppetmaster_session
|
39
|
-
@@puppetmaster_session ||= open_new_session(Isomorfeus::Puppetmaster.served_app)
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
1
|
+
module Isomorfeus
|
2
|
+
module Puppetmaster
|
3
|
+
module DSL
|
4
|
+
def default_document
|
5
|
+
@puppetmaster_default_document ||= get_default_document
|
6
|
+
end
|
7
|
+
|
8
|
+
def goto(uri)
|
9
|
+
puppetmaster_session.document_goto(default_document, uri)
|
10
|
+
@puppetmaster_default_document
|
11
|
+
end
|
12
|
+
alias_method :visit, :goto
|
13
|
+
|
14
|
+
def on_server(ruby_source = '', &block)
|
15
|
+
Isomorfeus::Puppetmaster.served_app.on_server(ruby_source, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def open_new_session(app = nil, driver = nil)
|
19
|
+
Isomorfeus::Puppetmaster.drivers[driver ? driver : Isomorfeus::Puppetmaster.driver].call(app ? app : Isomorfeus::Puppetmaster.served_app)
|
20
|
+
end
|
21
|
+
|
22
|
+
def open_new_document(uri = nil)
|
23
|
+
puppetmaster_session.document_open_new_document(nil, uri)
|
24
|
+
end
|
25
|
+
|
26
|
+
def reset_session!
|
27
|
+
@@puppetmaster_session = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def get_default_document
|
33
|
+
doc = puppetmaster_session.default_document
|
34
|
+
return doc if doc
|
35
|
+
puppetmaster_session.document_open_new_document('about:blank')
|
36
|
+
end
|
37
|
+
|
38
|
+
def puppetmaster_session
|
39
|
+
@@puppetmaster_session ||= open_new_session(Isomorfeus::Puppetmaster.served_app)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: isomorfeus-puppetmaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Biedermann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-05
|
11
|
+
date: 2021-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -178,6 +178,20 @@ dependencies:
|
|
178
178
|
- - ">="
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: iodine
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 0.7.44
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 0.7.44
|
181
195
|
- !ruby/object:Gem::Dependency
|
182
196
|
name: irb
|
183
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -212,14 +226,14 @@ dependencies:
|
|
212
226
|
requirements:
|
213
227
|
- - "~>"
|
214
228
|
- !ruby/object:Gem::Version
|
215
|
-
version: 1.
|
229
|
+
version: 1.12.2
|
216
230
|
type: :development
|
217
231
|
prerelease: false
|
218
232
|
version_requirements: !ruby/object:Gem::Requirement
|
219
233
|
requirements:
|
220
234
|
- - "~>"
|
221
235
|
- !ruby/object:Gem::Version
|
222
|
-
version: 1.
|
236
|
+
version: 1.12.2
|
223
237
|
- !ruby/object:Gem::Dependency
|
224
238
|
name: os
|
225
239
|
requirement: !ruby/object:Gem::Requirement
|
@@ -291,19 +305,33 @@ dependencies:
|
|
291
305
|
- !ruby/object:Gem::Version
|
292
306
|
version: '3.6'
|
293
307
|
- !ruby/object:Gem::Dependency
|
294
|
-
name:
|
308
|
+
name: roda
|
309
|
+
requirement: !ruby/object:Gem::Requirement
|
310
|
+
requirements:
|
311
|
+
- - "~>"
|
312
|
+
- !ruby/object:Gem::Version
|
313
|
+
version: 3.46.0
|
314
|
+
type: :development
|
315
|
+
prerelease: false
|
316
|
+
version_requirements: !ruby/object:Gem::Requirement
|
317
|
+
requirements:
|
318
|
+
- - "~>"
|
319
|
+
- !ruby/object:Gem::Version
|
320
|
+
version: 3.46.0
|
321
|
+
- !ruby/object:Gem::Dependency
|
322
|
+
name: tilt
|
295
323
|
requirement: !ruby/object:Gem::Requirement
|
296
324
|
requirements:
|
297
325
|
- - "~>"
|
298
326
|
- !ruby/object:Gem::Version
|
299
|
-
version: 2.
|
327
|
+
version: 2.0.10
|
300
328
|
type: :development
|
301
329
|
prerelease: false
|
302
330
|
version_requirements: !ruby/object:Gem::Requirement
|
303
331
|
requirements:
|
304
332
|
- - "~>"
|
305
333
|
- !ruby/object:Gem::Version
|
306
|
-
version: 2.
|
334
|
+
version: 2.0.10
|
307
335
|
description: Acceptance testing for isomorfeus.
|
308
336
|
email: jan@kursator.de
|
309
337
|
executables: []
|