playwright-ruby-client 0.2.1 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -5
  3. data/docs/api_coverage.md +116 -74
  4. data/lib/playwright.rb +48 -9
  5. data/lib/playwright/channel.rb +12 -2
  6. data/lib/playwright/channel_owners/artifact.rb +30 -0
  7. data/lib/playwright/channel_owners/binding_call.rb +3 -0
  8. data/lib/playwright/channel_owners/browser.rb +21 -0
  9. data/lib/playwright/channel_owners/browser_context.rb +154 -3
  10. data/lib/playwright/channel_owners/browser_type.rb +28 -0
  11. data/lib/playwright/channel_owners/dialog.rb +28 -0
  12. data/lib/playwright/channel_owners/element_handle.rb +7 -7
  13. data/lib/playwright/channel_owners/frame.rb +26 -5
  14. data/lib/playwright/channel_owners/js_handle.rb +2 -2
  15. data/lib/playwright/channel_owners/page.rb +125 -25
  16. data/lib/playwright/channel_owners/playwright.rb +24 -27
  17. data/lib/playwright/channel_owners/request.rb +26 -2
  18. data/lib/playwright/channel_owners/response.rb +60 -0
  19. data/lib/playwright/channel_owners/route.rb +78 -0
  20. data/lib/playwright/channel_owners/selectors.rb +19 -1
  21. data/lib/playwright/channel_owners/stream.rb +15 -0
  22. data/lib/playwright/connection.rb +11 -32
  23. data/lib/playwright/download.rb +27 -0
  24. data/lib/playwright/errors.rb +6 -0
  25. data/lib/playwright/events.rb +2 -5
  26. data/lib/playwright/keyboard_impl.rb +1 -1
  27. data/lib/playwright/mouse_impl.rb +41 -0
  28. data/lib/playwright/playwright_api.rb +3 -1
  29. data/lib/playwright/route_handler_entry.rb +28 -0
  30. data/lib/playwright/select_option_values.rb +31 -22
  31. data/lib/playwright/transport.rb +29 -7
  32. data/lib/playwright/url_matcher.rb +1 -1
  33. data/lib/playwright/utils.rb +9 -0
  34. data/lib/playwright/version.rb +1 -1
  35. data/lib/playwright/video.rb +51 -0
  36. data/lib/playwright/wait_helper.rb +2 -2
  37. data/lib/playwright_api/accessibility.rb +39 -1
  38. data/lib/playwright_api/android.rb +74 -2
  39. data/lib/playwright_api/android_device.rb +141 -23
  40. data/lib/playwright_api/android_input.rb +17 -13
  41. data/lib/playwright_api/android_socket.rb +16 -0
  42. data/lib/playwright_api/android_web_view.rb +21 -0
  43. data/lib/playwright_api/browser.rb +77 -2
  44. data/lib/playwright_api/browser_context.rb +178 -25
  45. data/lib/playwright_api/browser_type.rb +40 -9
  46. data/lib/playwright_api/dialog.rb +54 -7
  47. data/lib/playwright_api/element_handle.rb +105 -31
  48. data/lib/playwright_api/file_chooser.rb +6 -1
  49. data/lib/playwright_api/frame.rb +229 -36
  50. data/lib/playwright_api/js_handle.rb +23 -0
  51. data/lib/playwright_api/keyboard.rb +48 -1
  52. data/lib/playwright_api/mouse.rb +26 -5
  53. data/lib/playwright_api/page.rb +491 -81
  54. data/lib/playwright_api/playwright.rb +21 -4
  55. data/lib/playwright_api/request.rb +30 -2
  56. data/lib/playwright_api/response.rb +21 -11
  57. data/lib/playwright_api/route.rb +51 -5
  58. data/lib/playwright_api/selectors.rb +27 -1
  59. data/lib/playwright_api/touchscreen.rb +1 -1
  60. data/lib/playwright_api/worker.rb +25 -1
  61. data/playwright.gemspec +4 -2
  62. metadata +42 -14
  63. data/lib/playwright/channel_owners/chromium_browser.rb +0 -8
  64. data/lib/playwright/channel_owners/chromium_browser_context.rb +0 -8
  65. data/lib/playwright/channel_owners/download.rb +0 -27
  66. data/lib/playwright/channel_owners/firefox_browser.rb +0 -8
  67. data/lib/playwright/channel_owners/webkit_browser.rb +0 -8
  68. data/lib/playwright_api/binding_call.rb +0 -27
  69. data/lib/playwright_api/chromium_browser_context.rb +0 -59
  70. data/lib/playwright_api/download.rb +0 -95
  71. data/lib/playwright_api/video.rb +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 140f77362280a6874d89ed73fde1e80fa47e2b83f075b6207835f02ab62cb97f
4
- data.tar.gz: e715b39c620668eeea1a0dbb022865f759d02f59d2f3d23948c7c20536ca0136
3
+ metadata.gz: cd2cd0b1ca23f5807c139c717c91341d2279c98cf6a8b513560221f9da9701cf
4
+ data.tar.gz: 8a059997574ce31fb065b1dbc3dae5c94c3660ada06fc0eaaff5cb29cc6efa6b
5
5
  SHA512:
6
- metadata.gz: 0315d44031788794eca7f506ba9a20a81dbb6bf77c15efda873a1efc3e25074d46e1629ae07551f2dd8368f8a7609568cd719fd1470fdd3bf2717373168655a2
7
- data.tar.gz: a3b6a02b60059ac3ef14c0ca1222e3b88a3aaee588b8510c49ef748fab5f27c354417b1e38cc6adfe98e6b1f38805ed1c0cead8cfb465f4968e449c98dd5a9a5
6
+ metadata.gz: 6eb023ebb94129a006dcdacb383b43221dbcae61b1d1f474e382f84c2dd4d2b39d6c9cc878673e193f71c2409860bd69d0a8c865508a5930188aeb607325ed00
7
+ data.tar.gz: a3bd488faa4ef02f7afe9e50bd9e001429440b0bfd3a96a00ddf074aac809db828d06562985083b8573c31be966e64394253d6d5d26593cf4ad8434bc5660c50
data/README.md CHANGED
@@ -9,22 +9,34 @@ Note: Currently, this Gem is just a PoC (Proof of Concept). If you want to devel
9
9
  At this point, playwright-ruby-client doesn't include the downloader of playwright driver, so **we have to install [playwright](https://github.com/microsoft/playwright) in advance**.
10
10
 
11
11
  ```sh
12
+ npx playwright install
13
+ ```
14
+
15
+ and then, set `playwright_cli_executable_path: "npx playwright"` at `Playwright.create`.
16
+
17
+ **Prefer npm install instead of npx?**
18
+
19
+ Actually `npx playwright` is a bit slow. We can also use `npm install` to setup.
20
+
21
+ Instead of `npx playwright install`:
22
+
23
+ ```
12
24
  npm install playwright
13
25
  ./node_modules/.bin/playwright install
14
26
  ```
15
27
 
16
- and then, set `playwright_cli_executable_path: ./node_modules/.bin/playwright` at `Playwright.create`.
28
+ And set `playwright_cli_executable_path: './node_modules/.bin/playwright'`
17
29
 
18
30
  **Prefer playwrighting without Node.js?**
19
31
 
20
- Instead of npm install, you can also directly download playwright driver from playwright.azureedge.net/builds/. The URL can be easily detected from [here](https://github.com/microsoft/playwright-python/blob/79f6ce0a6a69c480573372706df84af5ef99c4a4/setup.py#L56-L61)
32
+ Instead of npm, you can also directly download playwright driver from playwright.azureedge.net/builds/. The URL can be easily detected from [here](https://github.com/microsoft/playwright-python/blob/79f6ce0a6a69c480573372706df84af5ef99c4a4/setup.py#L56-L61)
21
33
 
22
34
  ### Capture a site
23
35
 
24
36
  ```ruby
25
37
  require 'playwright'
26
38
 
27
- Playwright.create(playwright_cli_executable_path: '/path/to/playwright') do |playwright|
39
+ Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright|
28
40
  playwright.chromium.launch(headless: false) do |browser|
29
41
  page = browser.new_page
30
42
  page.goto('https://github.com/YusukeIwaki')
@@ -40,7 +52,7 @@ end
40
52
  ```ruby
41
53
  require 'playwright'
42
54
 
43
- Playwright.create(playwright_cli_executable_path: './node_modules/.bin/playwright') do |playwright|
55
+ Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright|
44
56
  playwright.chromium.launch(headless: false) do |browser|
45
57
  page = browser.new_page
46
58
  page.goto('https://github.com/')
@@ -82,7 +94,7 @@ $ bundle exec ruby main.rb
82
94
  ```ruby
83
95
  require 'playwright'
84
96
 
85
- Playwright.create(playwright_cli_executable_path: './node_modules/.bin/playwright') do |playwright|
97
+ Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright|
86
98
  devices = playwright.android.devices
87
99
  unless devices.empty?
88
100
  device = devices.last
data/docs/api_coverage.md CHANGED
@@ -19,24 +19,24 @@
19
19
 
20
20
  ## Response
21
21
 
22
- * ~~body~~
23
- * ~~finished~~
24
- * ~~frame~~
25
- * ~~headers~~
26
- * ~~json~~
27
- * ~~ok~~
28
- * ~~request~~
29
- * ~~status~~
30
- * ~~status_text~~
31
- * ~~text~~
32
- * ~~url~~
22
+ * body
23
+ * finished
24
+ * frame
25
+ * headers
26
+ * json
27
+ * ok
28
+ * request
29
+ * status
30
+ * status_text
31
+ * text
32
+ * url
33
33
 
34
- ## ~~Route~~
34
+ ## Route
35
35
 
36
- * ~~abort~~
37
- * ~~continue_~~
38
- * ~~fulfill~~
39
- * ~~request~~
36
+ * abort
37
+ * continue
38
+ * fulfill
39
+ * request
40
40
 
41
41
  ## ~~WebSocket~~
42
42
 
@@ -55,11 +55,11 @@
55
55
 
56
56
  ## Mouse
57
57
 
58
- * ~~click~~
59
- * ~~dblclick~~
60
- * ~~down~~
61
- * ~~move~~
62
- * ~~up~~
58
+ * click
59
+ * dblclick
60
+ * down
61
+ * move
62
+ * up
63
63
 
64
64
  ## Touchscreen
65
65
 
@@ -173,6 +173,7 @@
173
173
  * expect_navigation
174
174
  * wait_for_selector
175
175
  * ~~wait_for_timeout~~
176
+ * wait_for_url
176
177
 
177
178
  ## ~~Worker~~
178
179
 
@@ -182,7 +183,7 @@
182
183
 
183
184
  ## Selectors
184
185
 
185
- * ~~register~~
186
+ * register
186
187
 
187
188
  ## ConsoleMessage
188
189
 
@@ -191,26 +192,13 @@
191
192
  * text
192
193
  * type
193
194
 
194
- ## ~~Dialog~~
195
-
196
- * ~~accept~~
197
- * ~~default_value~~
198
- * ~~dismiss~~
199
- * ~~message~~
200
- * ~~type~~
201
-
202
- ## Download
203
-
204
- * delete
205
- * failure
206
- * path
207
- * save_as
208
- * suggested_filename
209
- * url
195
+ ## Dialog
210
196
 
211
- ## ~~Video~~
212
-
213
- * ~~path~~
197
+ * accept
198
+ * default_value
199
+ * dismiss
200
+ * message
201
+ * type
214
202
 
215
203
  ## Page
216
204
 
@@ -258,7 +246,7 @@
258
246
  * query_selector
259
247
  * query_selector_all
260
248
  * reload
261
- * ~~route~~
249
+ * route
262
250
  * screenshot
263
251
  * select_option
264
252
  * set_content
@@ -272,24 +260,25 @@
272
260
  * title
273
261
  * type
274
262
  * uncheck
275
- * ~~unroute~~
263
+ * unroute
276
264
  * url
277
- * ~~video~~
265
+ * video
278
266
  * viewport_size
267
+ * expect_console_message
268
+ * expect_download
279
269
  * expect_event
270
+ * expect_file_chooser
280
271
  * wait_for_function
281
272
  * wait_for_load_state
282
273
  * expect_navigation
274
+ * expect_popup
283
275
  * expect_request
284
276
  * expect_response
285
277
  * wait_for_selector
286
278
  * ~~wait_for_timeout~~
287
- * ~~workers~~
288
- * expect_download
289
- * expect_popup
279
+ * wait_for_url
290
280
  * ~~expect_worker~~
291
- * expect_console_message
292
- * expect_file_chooser
281
+ * ~~workers~~
293
282
  * ~~wait_for_event~~
294
283
  * accessibility
295
284
  * keyboard
@@ -298,28 +287,31 @@
298
287
 
299
288
  ## BrowserContext
300
289
 
301
- * ~~add_cookies~~
302
- * ~~add_init_script~~
303
- * ~~browser~~
304
- * ~~clear_cookies~~
305
- * ~~clear_permissions~~
290
+ * add_cookies
291
+ * add_init_script
292
+ * ~~background_pages~~
293
+ * browser
294
+ * clear_cookies
295
+ * clear_permissions
306
296
  * close
307
- * ~~cookies~~
308
- * ~~expose_binding~~
309
- * ~~expose_function~~
310
- * ~~grant_permissions~~
297
+ * cookies
298
+ * expose_binding
299
+ * expose_function
300
+ * grant_permissions
301
+ * ~~new_cdp_session~~
311
302
  * new_page
312
303
  * pages
313
- * ~~route~~
314
- * ~~set_default_navigation_timeout~~
315
- * ~~set_default_timeout~~
316
- * ~~set_extra_http_headers~~
317
- * ~~set_geolocation~~
318
- * ~~set_offline~~
304
+ * route
305
+ * ~~service_workers~~
306
+ * set_default_navigation_timeout
307
+ * set_default_timeout
308
+ * set_extra_http_headers
309
+ * set_geolocation
310
+ * set_offline
319
311
  * ~~storage_state~~
320
- * ~~unroute~~
321
- * ~~expect_event~~
322
- * ~~expect_page~~
312
+ * unroute
313
+ * expect_event
314
+ * expect_page
323
315
  * ~~wait_for_event~~
324
316
 
325
317
  ## ~~CDPSession~~
@@ -327,19 +319,16 @@
327
319
  * ~~detach~~
328
320
  * ~~send_message~~
329
321
 
330
- ## ChromiumBrowserContext
331
-
332
- * ~~background_pages~~
333
- * ~~new_cdp_session~~
334
- * ~~service_workers~~
335
-
336
322
  ## Browser
337
323
 
338
324
  * close
339
325
  * contexts
340
326
  * connected?
327
+ * ~~new_browser_cdp_session~~
341
328
  * new_context
342
329
  * new_page
330
+ * start_tracing
331
+ * stop_tracing
343
332
  * version
344
333
 
345
334
  ## BrowserType
@@ -355,5 +344,58 @@
355
344
  * chromium
356
345
  * devices
357
346
  * firefox
358
- * ~~selectors~~
347
+ * selectors
359
348
  * webkit
349
+
350
+ ## Android
351
+
352
+ * devices
353
+ * ~~set_default_timeout~~
354
+
355
+ ## AndroidDevice
356
+
357
+ * close
358
+ * ~~drag~~
359
+ * ~~fill~~
360
+ * ~~fling~~
361
+ * info
362
+ * ~~install_apk~~
363
+ * launch_browser
364
+ * ~~long_tap~~
365
+ * model
366
+ * ~~open~~
367
+ * ~~pinch_close~~
368
+ * ~~pinch_open~~
369
+ * ~~press~~
370
+ * ~~push~~
371
+ * screenshot
372
+ * ~~scroll~~
373
+ * serial
374
+ * ~~set_default_timeout~~
375
+ * shell
376
+ * ~~swipe~~
377
+ * ~~tap_point~~
378
+ * ~~wait~~
379
+ * ~~wait_for_event~~
380
+ * ~~web_view~~
381
+ * ~~web_views~~
382
+ * input
383
+
384
+ ## AndroidInput
385
+
386
+ * drag
387
+ * press
388
+ * ~~swipe~~
389
+ * tap_point
390
+ * type
391
+
392
+ ## ~~AndroidSocket~~
393
+
394
+ * ~~close~~
395
+ * ~~write~~
396
+
397
+ ## ~~AndroidWebView~~
398
+
399
+ * ~~page~~
400
+ * ~~pid~~
401
+ * ~~pkg~~
data/lib/playwright.rb CHANGED
@@ -17,14 +17,17 @@ require 'playwright/utils'
17
17
  require 'playwright/api_implementation'
18
18
  require 'playwright/channel'
19
19
  require 'playwright/channel_owner'
20
+ require 'playwright/download'
20
21
  require 'playwright/http_headers'
21
22
  require 'playwright/input_files'
22
23
  require 'playwright/connection'
24
+ require 'playwright/route_handler_entry'
23
25
  require 'playwright/select_option_values'
24
26
  require 'playwright/timeout_settings'
25
27
  require 'playwright/transport'
26
28
  require 'playwright/url_matcher'
27
29
  require 'playwright/version'
30
+ require 'playwright/video'
28
31
  require 'playwright/wait_helper'
29
32
 
30
33
  require 'playwright/playwright_api'
@@ -32,18 +35,54 @@ require 'playwright/playwright_api'
32
35
  Dir[File.join(__dir__, 'playwright_api', '*.rb')].each { |f| require f }
33
36
 
34
37
  module Playwright
35
- module_function def create(playwright_cli_executable_path:, &block)
36
- raise ArgumentError.new("block must be provided") unless block
38
+ class Execution
39
+ def initialize(connection, playwright)
40
+ @connection = connection
41
+ @playwright = playwright
42
+ end
43
+
44
+ def stop
45
+ @connection.stop
46
+ end
47
+
48
+ attr_reader :playwright
49
+ end
37
50
 
51
+ # Recommended to call this method with block.
52
+ #
53
+ # Playwright.create(...) do |playwright|
54
+ # browser = playwright.chromium.launch
55
+ # ...
56
+ # end
57
+ #
58
+ # When we use this method without block, an instance of Puppeteer::Execution is returned
59
+ # and we *must* call execution.stop on the end.
60
+ # The instance of playwright is available by calling execution.playwright
61
+ module_function def create(playwright_cli_executable_path:, &block)
38
62
  connection = Connection.new(playwright_cli_executable_path: playwright_cli_executable_path)
63
+ connection.async_run
64
+
65
+ execution =
66
+ begin
67
+ playwright = connection.wait_for_object_with_known_name('Playwright')
68
+ Execution.new(connection, PlaywrightApi.wrap(playwright))
69
+ rescue
70
+ connection.stop
71
+ raise
72
+ end
39
73
 
40
- playwright_promise = connection.async_wait_for_object_with_known_name('Playwright')
41
- Thread.new { connection.run }
42
- playwright = PlaywrightApi.wrap(playwright_promise.value!)
43
- begin
44
- block.call(playwright)
45
- ensure
46
- connection.stop
74
+ if block
75
+ begin
76
+ block.call(execution.playwright)
77
+ ensure
78
+ execution.stop
79
+ end
80
+ else
81
+ execution
47
82
  end
48
83
  end
84
+
85
+ module_function def instance
86
+ @playwright_instance
87
+ end
49
88
  end
@@ -15,8 +15,9 @@ module Playwright
15
15
 
16
16
  # @param method [String]
17
17
  # @param params [Hash]
18
+ # @return [Playwright::ChannelOwner|nil]
18
19
  def send_message_to_server(method, params = {})
19
- result = @connection.send_message_to_server(@guid, method, params)
20
+ result = send_message_to_server_result(method, params)
20
21
  if result.is_a?(Hash)
21
22
  _type, channel_owner = result.first
22
23
  channel_owner
@@ -27,8 +28,17 @@ module Playwright
27
28
 
28
29
  # @param method [String]
29
30
  # @param params [Hash]
30
- def send_no_reply(method, params)
31
+ # @return [Hash]
32
+ def send_message_to_server_result(method, params)
33
+ @connection.send_message_to_server(@guid, method, params)
34
+ end
35
+
36
+ # @param method [String]
37
+ # @param params [Hash]
38
+ # @returns nil
39
+ def async_send_message_to_server(method, params = {})
31
40
  @connection.async_send_message_to_server(@guid, method, params)
41
+
32
42
  nil
33
43
  end
34
44
  end