isomorfeus-puppetmaster 0.3.3 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1a369c88fa52e50d5258aad78591bcd079723ae8b31c1060829113f4cfc5323
4
- data.tar.gz: b420d2cce1ad70c3cf02e9afbe376e2d8ac4e8fda259a80d8b97bbdcdb5f5006
3
+ metadata.gz: e39fd34e187e7a7d720f8686a4bddadc81a697f59ab00a73b805cd8a2948f2ea
4
+ data.tar.gz: 6617fe83dccd1184592ccac1d6f8b562f0e89cfb96670278c8344c4e90c4dfee
5
5
  SHA512:
6
- metadata.gz: 6f1fd308a029db3d5d278906ff4f12957388c6e6c0588aeecfa47e420af518817b53ef7077d9fba1f2bf02b5aa99dd651e05f459abc822f47114137542b3851e
7
- data.tar.gz: d3c77ebab0d357c9aa6b1d47f18e66baed051fd4a9361c5636a3eba60a860841a5c13d479e4189d6440d6648657fbde71972f6a3c3758eb1db00912a16c41a7b
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 chromium headless and jsdom.
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,9 +19,7 @@ In Gemfile:
19
19
 
20
20
  Also requires the following npm modules with recommended versions:
21
21
 
22
- - [puppeteer 2.0.0](https://github.com/GoogleChrome/puppeteer#readme) - for the chromium driver
23
- - [jsdom 15.2.1](https://github.com/jsdom/jsdom#readme) - for the jsdom driver
24
- - [canvas 2.6.0](https://github.com/Automattic/node-canvas) - for the jsdom driver (optional)
22
+ - [puppeteer 10.1.x](https://github.com/GoogleChrome/puppeteer#readme) - for the chrome driver
25
23
 
26
24
  Simply install them in your projects root. Puppetmaster also depends on isomorfeus-speednode, which will be installed automatically.
27
25
  Speednode will pickup the node modules then from the projects root node_modules directory.
@@ -29,16 +27,12 @@ Speednode will pickup the node modules then from the projects root node_modules
29
27
  ## Configuration
30
28
 
31
29
  Puppetmaster provides these drivers:
32
- - chromium - a real browser, headless, fast
33
- - chromium_wsl - as above but with options so it can execute within the Windows Linux WSL
34
- - chromium_debug - opens a chromium browser window with devtools enabled, useful for debugging tests
35
- - jsdom - provides a dom implementation in javascript, can execute javascript in the document, super fast, headless, has certain limitations,
36
- especially because its not rendering anything (no element bounding box, etc.)
37
- - jsdom_canvas - jsdom driver with additional support for 'canvas', requires certain libraries to be installed, see: [canvas at github](https://github.com/Automattic/node-canvas)
30
+ - chrome - a real browser, headless, fast
31
+ - chrome_debug - opens a chrome browser window with devtools enabled, useful for debugging tests
38
32
 
39
- Chromium is the default driver. Selecting another driver, for example jsdom:
33
+ Chrome is the default driver. Selecting another driver, for example firefox:
40
34
  ```ruby
41
- Isomorfeus::Puppetmaster.driver = :jsdom
35
+ Isomorfeus::Puppetmaster.driver = :chrome_debug
42
36
  ```
43
37
 
44
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'
@@ -16,7 +16,7 @@ module Isomorfeus
16
16
  end
17
17
 
18
18
  def driver
19
- @driver ||= :chromium
19
+ @driver ||= :chrome
20
20
  end
21
21
 
22
22
  def driver=(drvr)
@@ -1,266 +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
- click
19
- close
20
- cookies
21
- console
22
- dismiss_confirm
23
- dismiss_leave_page
24
- dismiss_prompt
25
- dispatch_event
26
- double_click
27
- evaluate_script
28
- execute_script
29
- find
30
- find_all
31
- find_all_xpath
32
- find_xpath
33
- head
34
- html
35
- open_new_document
36
- remove_cookie
37
- render_base64
38
- reset_user_agent
39
- right_click
40
- save_pdf
41
- save_screenshot
42
- scroll_by
43
- scroll_to
44
- set_authentication_credentials
45
- set_cookie
46
- set_extra_headers
47
- set_url_blacklist
48
- set_user_agent
49
- title
50
- url
51
- user_agent
52
- viewport_maximize
53
- viewport_resize
54
- viewport_size
55
- wait_for
56
- wait_for_xpath
57
- ]
58
-
59
- attr_reader :handle, :response
60
-
61
- def initialize(driver, handle, response)
62
- @driver = driver
63
- @handle = handle
64
- @response = response
65
- ObjectSpace.define_finalizer(self, @driver.class.document_handle_disposer(@driver, @handle))
66
- end
67
-
68
- def browser
69
- @driver.browser
70
- end
71
-
72
- def await_ruby(ruby_source = '', &block)
73
- ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
74
- ruby_source = "#{ruby_source}.then { |result| $promise_result = result; $promise_resolved = true }.fail { |result| $promise_result = result; $promise_resolved = true }"
75
- compiled_ruby = compile_ruby_source(ruby_source)
76
- if compiled_ruby.start_with?('/*')
77
- start_of_code = compiled_ruby.index('*/') + 3
78
- compiled_ruby = compiled_ruby[start_of_code..-1]
79
- end
80
- evaluate_script <<~JAVASCRIPT
81
- (function(){
82
- fun = function() {
83
- if (Opal) {
84
- Opal.gvars.promise_resolved = false;
85
- Opal.await_ruby_exception = null;
86
- try {
87
- return #{compiled_ruby}
88
- } catch (e) {
89
- Opal.await_ruby_exception = e;
90
- Opal.gvars.promise_resolved = true;
91
- }
92
- } else {
93
- setTimeout(fun, 100);
94
- }
95
- }
96
- fun();
97
- })()
98
- JAVASCRIPT
99
- have_result = false
100
- start = Time.now
101
- until have_result do
102
- raise "await_ruby: execution timed out! Is Opal available?" if (Time.now - start) > 30
103
- have_result = evaluate_script 'Opal ? Opal.gvars.promise_resolved : null'
104
- sleep 0.1 unless have_result
105
- end
106
- result, exception = execute_script <<~JAVASCRIPT
107
- var result;
108
- var exception = false;
109
- if (Opal.await_ruby_exception) {
110
- var e = Opal.await_ruby_exception;
111
- exception = { message: e.message, name: e.name, stack: e.stack }
112
- } else if (typeof Opal.gvars.promise_result.$to_n === 'function') {
113
- result = Opal.gvars.promise_result.$to_n();
114
- }
115
- else { result = Opal.gvars.promise_result };
116
- delete Opal.gvars.promise_result;
117
- delete Opal.gvars.promise_resolved;
118
- return [result, exception];
119
- JAVASCRIPT
120
- if exception
121
- e = Isomorfeus::Puppetmaster::Error.new("#{exception['name']}: #{exception['message']}")
122
- e.set_backtrace(exception['stack'])
123
- raise e
124
- end
125
- result
126
- end
127
-
128
- def evaluate_ruby(ruby_source = '', &block)
129
- ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
130
- compiled_ruby = compile_ruby_source(ruby_source)
131
- if compiled_ruby.start_with?('/*')
132
- start_of_code = compiled_ruby.index('*/') + 3
133
- compiled_ruby = compiled_ruby[start_of_code..-1]
134
- end
135
- evaluate_script <<~JAVASCRIPT
136
- (function(){
137
- return #{compiled_ruby}
138
- })()
139
- JAVASCRIPT
140
- end
141
-
142
- def evaluate_with_opal(ruby_source = '', &block)
143
- ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
144
- compiled_ruby = compile_ruby_source(ruby_source)
145
- if compiled_ruby.start_with?('/*')
146
- start_of_code = compiled_ruby.index('*/') + 3
147
- compiled_ruby = compiled_ruby[start_of_code..-1]
148
- end
149
- evaluate_script <<~JAVASCRIPT
150
- (function(){
151
- if (typeof Opal === "undefined") {
152
- #{Isomorfeus::Puppetmaster.opal_prelude}
153
- }
154
- return #{compiled_ruby}
155
- })()
156
- JAVASCRIPT
157
- end
158
-
159
- def go_back
160
- @response = @driver.document_go_back(self)
161
- self
162
- end
163
-
164
- def go_forward
165
- @response = @driver.document_go_forward(self)
166
- self
167
- end
168
-
169
- def goto(uri)
170
- @response = @driver.document_goto(self, uri)
171
- self
172
- end
173
- alias_method :visit, :goto
174
-
175
- def has_content?(content, **options)
176
- body.has_content?(content, options)
177
- end
178
-
179
- def has_css?(selector, **options)
180
- body.has_css?(selector, options)
181
- end
182
-
183
- def has_current_path?(other_path)
184
- path == other_path
185
- end
186
-
187
- def has_text?(text, **options)
188
- body.has_text?(text, options)
189
- end
190
-
191
- def has_xpath?(query, **options)
192
- body.has_xpath?(query, options)
193
- end
194
-
195
- def isomorphic(ruby_source = '', &block)
196
- ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
197
- Isomorfeus::Puppetmaster.served_app.on_server(ruby_source)
198
- evaluate_ruby(ruby_source)
199
- end
200
-
201
- def isomorphic_with_opal(ruby_source = '', &block)
202
- ruby_source = Isomorfeus::Puppetmaster.block_source_code(&block) if block_given?
203
- Isomorfeus::Puppetmaster.served_app.on_server(ruby_source)
204
- evaluate_with_opal(ruby_source)
205
- end
206
-
207
- def method_missing(name, *args)
208
- method_name = name.to_s
209
- if method_name.start_with?('find_by_')
210
- what = method_name[8..-1]
211
- return find("[#{what}=\"#{args.first}\"]") if %w[name type value].include?(what)
212
- return find_xpath("//*[text()=\"#{args.first}\"]") if what == 'content'
213
- elsif method_name.start_with?('has_')
214
- # :has_checked_field?, #
215
- # :has_content?,
216
- # :has_css?,
217
- # :has_field?,
218
- # :has_link?,
219
- # :has_select?,
220
- # :has_selector?,
221
- # :has_table?,
222
- # :has_text?,
223
- # :has_unchecked_field?,
224
- # :has_xpath?,
225
- # :has_button?, # method_missing
226
- end
227
- super(name, *args)
228
- end
229
-
230
- def open_document_by(&block)
231
- open_documents = @driver.document_handles
232
- block.call
233
- new_documents = @driver.document_handles - open_documents
234
- raise 'Multiple documents opened' if new_documents.size > 1
235
- raise 'No window opened' if new_documents.size < 1
236
- Isomorfeus::Puppetmaster::Document.new(@driver, new_documents.first, Isomorfeus::Puppetmaster::Response.new)
237
- end
238
-
239
- def path
240
- URI.parse(url).path
241
- end
242
-
243
- def reload
244
- @response = @driver.reload(self)
245
- end
246
-
247
- def respond_to?(name, include_private = false)
248
- return true if %i[find_by_content find_by_name find_by_type find_by_value].include?(name)
249
- super(name, include_private)
250
- end
251
-
252
- # assertions
253
- # :assert_current_path,
254
- # :assert_no_current_path
255
- # assert_title
256
- # assert_no_title
257
-
258
- protected
259
-
260
- def compile_ruby_source(source_code)
261
- # TODO maybe use compile server
262
- Opal.compile(source_code, parse_comments: false)
263
- end
264
- end
265
- end
266
- 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
@@ -36,10 +36,11 @@ module Isomorfeus
36
36
 
37
37
  def initialize(options = {})
38
38
  # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-puppeteerlaunchoptions
39
- # init ExecJs context
39
+ # init ExecJS context
40
40
  @app = options.delete(:app)
41
41
  @options = options.dup
42
- @browser_type = @options.delete(:browser_type) { :chromium }
42
+ @browser_type = @options.delete(:browser_type) { :chrome }
43
+ @options[:product] = "'#{@browser_type}'" unless @options.key?(:product)
43
44
  @max_width = @options.delete(:max_width) { VIEWPORT_MAX_WIDTH }
44
45
  @max_height = @options.delete(:max_height) { VIEWPORT_MAX_HEIGHT }
45
46
  @width = @options.delete(:width) { VIEWPORT_DEFAULT_WIDTH > @max_width ? @max_width : VIEWPORT_DEFAULT_WIDTH }
@@ -218,7 +219,7 @@ module Isomorfeus
218
219
  get_result
219
220
  end
220
221
 
221
- def chromium_require
222
+ def default_require
222
223
  <<~JAVASCRIPT
223
224
  const MasterPuppeteer = require('puppeteer');
224
225
  JAVASCRIPT
@@ -277,8 +278,8 @@ module Isomorfeus
277
278
  def puppeteer_launch
278
279
  # todo target_handle, puppeteer save path
279
280
  puppeteer_require = case @browser_type
280
- when :chrome then chromium_require
281
- when :chromium then chromium_require
281
+ when :chrome then default_require
282
+ when :chromium then default_require
282
283
  else
283
284
  raise "Browser type #{@browser_type} not supported!"
284
285
  end
@@ -320,8 +320,10 @@ module Isomorfeus
320
320
  return [null, {name: err.name, message: err.message, stack: err.stack}];
321
321
  }
322
322
  }, #{args});
323
- LastResult = result[0];
324
- LastErr = result[1];
323
+ if (result) {
324
+ LastResult = result[0];
325
+ LastErr = result[1];
326
+ }
325
327
  JAVASCRIPT
326
328
  end
327
329
 
@@ -337,8 +339,10 @@ module Isomorfeus
337
339
  return [null, {name: err.name, message: err.message, stack: err.stack}];
338
340
  }
339
341
  }, #{args});
340
- LastResult = result[0];
341
- LastErr = result[1];
342
+ if (result) {
343
+ LastResult = result[0];
344
+ LastErr = result[1];
345
+ }
342
346
  JAVASCRIPT
343
347
  end
344
348
 
@@ -1,11 +1,7 @@
1
- Isomorfeus::Puppetmaster.register_driver(:chromium) do |app|
2
- Isomorfeus::Puppetmaster::Driver::Puppeteer.new(browser_type: :chromium, headless: true, app: app)
3
- end
4
-
5
- Isomorfeus::Puppetmaster.register_driver(:chromium_wsl) do |app|
6
- Isomorfeus::Puppetmaster::Driver::Puppeteer.new(browser_type: :chromium, headless: true, app: app, args: ['--no-sandbox'])
7
- end
8
-
9
- Isomorfeus::Puppetmaster.register_driver(:chromium_debug) do |app|
10
- Isomorfeus::Puppetmaster::Driver::Puppeteer.new(browser_type: :chromium, headless: false, devtools: true, app: app)
11
- 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
@@ -10,6 +10,14 @@ module Isomorfeus
10
10
  end
11
11
  end
12
12
 
13
+ base.define_singleton_method(:document_forward_kwargs) do |methods|
14
+ methods.each do |method|
15
+ define_method(method) do |*args, **kwargs, &block|
16
+ @driver.send("document_#{method}", self, *args, **kwargs, &block)
17
+ end
18
+ end
19
+ end
20
+
13
21
  base.define_singleton_method(:frame_forward) do |methods|
14
22
  methods.each do |method|
15
23
  define_method(method) do |*args|
@@ -62,4 +62,4 @@ Isomorfeus::Puppetmaster.register_server :puma do |app, port, host, **options|
62
62
  end.run.join
63
63
  end
64
64
 
65
- Isomorfeus::Puppetmaster.server = :puma
65
+ Isomorfeus::Puppetmaster.server = :iodine
@@ -1,3 +1,3 @@
1
1
  module Isomorfeus
2
- PUPPETMASTER_VERSION = '0.3.3'
2
+ PUPPETMASTER_VERSION = '0.4.1'
3
3
  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.3.3
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-19 00:00:00.000000000 Z
11
+ date: 2021-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.2.11
33
+ version: 0.3.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.2.11
40
+ version: 0.3.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: method_source
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 3.10.1
61
+ version: 3.11.1
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 3.10.1
68
+ version: 3.11.1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: opal
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: unparser
112
+ name: tty-which
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -123,19 +123,19 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: agoo
126
+ name: unparser
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - "~>"
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: 2.11.7
132
- type: :development
131
+ version: '0'
132
+ type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - "~>"
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: 2.11.7
138
+ version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: chunky_png
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -156,14 +156,14 @@ dependencies:
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: 0.30.0
159
+ version: 0.38.0
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: 0.30.0
166
+ version: 0.38.0
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: fastimage
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -184,14 +184,14 @@ dependencies:
184
184
  requirements:
185
185
  - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: 0.7.38
187
+ version: 0.7.44
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: 0.7.38
194
+ version: 0.7.44
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: irb
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -212,28 +212,28 @@ dependencies:
212
212
  requirements:
213
213
  - - "~>"
214
214
  - !ruby/object:Gem::Version
215
- version: '2.0'
215
+ version: '2.5'
216
216
  type: :development
217
217
  prerelease: false
218
218
  version_requirements: !ruby/object:Gem::Requirement
219
219
  requirements:
220
220
  - - "~>"
221
221
  - !ruby/object:Gem::Version
222
- version: '2.0'
222
+ version: '2.5'
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: nokogiri
225
225
  requirement: !ruby/object:Gem::Requirement
226
226
  requirements:
227
227
  - - "~>"
228
228
  - !ruby/object:Gem::Version
229
- version: 1.10.1
229
+ version: 1.12.2
230
230
  type: :development
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - "~>"
235
235
  - !ruby/object:Gem::Version
236
- version: 1.10.1
236
+ version: 1.12.2
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: os
239
239
  requirement: !ruby/object:Gem::Requirement
@@ -254,28 +254,28 @@ dependencies:
254
254
  requirements:
255
255
  - - ">="
256
256
  - !ruby/object:Gem::Version
257
- version: 1.3.3
257
+ version: 2.4.0
258
258
  type: :development
259
259
  prerelease: false
260
260
  version_requirements: !ruby/object:Gem::Requirement
261
261
  requirements:
262
262
  - - ">="
263
263
  - !ruby/object:Gem::Version
264
- version: 1.3.3
264
+ version: 2.4.0
265
265
  - !ruby/object:Gem::Dependency
266
266
  name: puma
267
267
  requirement: !ruby/object:Gem::Requirement
268
268
  requirements:
269
269
  - - "~>"
270
270
  - !ruby/object:Gem::Version
271
- version: 4.2.1
271
+ version: 5.3.0
272
272
  type: :development
273
273
  prerelease: false
274
274
  version_requirements: !ruby/object:Gem::Requirement
275
275
  requirements:
276
276
  - - "~>"
277
277
  - !ruby/object:Gem::Version
278
- version: 4.2.1
278
+ version: 5.3.0
279
279
  - !ruby/object:Gem::Dependency
280
280
  name: rake
281
281
  requirement: !ruby/object:Gem::Requirement
@@ -305,19 +305,33 @@ dependencies:
305
305
  - !ruby/object:Gem::Version
306
306
  version: '3.6'
307
307
  - !ruby/object:Gem::Dependency
308
- name: sinatra
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
309
323
  requirement: !ruby/object:Gem::Requirement
310
324
  requirements:
311
325
  - - "~>"
312
326
  - !ruby/object:Gem::Version
313
- version: '2.0'
327
+ version: 2.0.10
314
328
  type: :development
315
329
  prerelease: false
316
330
  version_requirements: !ruby/object:Gem::Requirement
317
331
  requirements:
318
332
  - - "~>"
319
333
  - !ruby/object:Gem::Version
320
- version: '2.0'
334
+ version: 2.0.10
321
335
  description: Acceptance testing for isomorfeus.
322
336
  email: jan@kursator.de
323
337
  executables: []
@@ -372,7 +386,7 @@ licenses:
372
386
  - MIT
373
387
  metadata:
374
388
  github_repo: ssh://github.com/isomorfeus/gems
375
- post_install_message:
389
+ post_install_message:
376
390
  rdoc_options: []
377
391
  require_paths:
378
392
  - lib
@@ -387,8 +401,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
387
401
  - !ruby/object:Gem::Version
388
402
  version: '0'
389
403
  requirements: []
390
- rubygems_version: 3.0.6
391
- signing_key:
404
+ rubygems_version: 3.2.15
405
+ signing_key:
392
406
  specification_version: 4
393
407
  summary: Acceptance testing for isomorfeus.
394
408
  test_files: []