playwright-ruby-client 1.14.0 → 1.15.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/docs/api/browser.md +2 -0
  3. data/documentation/docs/api/browser_type.md +1 -0
  4. data/documentation/docs/api/experimental/android_device.md +1 -0
  5. data/documentation/docs/api/frame.md +4 -6
  6. data/documentation/docs/api/locator.md +13 -0
  7. data/documentation/docs/api/page.md +3 -5
  8. data/documentation/docs/api/selectors.md +29 -3
  9. data/lib/playwright.rb +44 -4
  10. data/lib/playwright/channel_owners/browser_type.rb +0 -1
  11. data/lib/playwright/channel_owners/playwright.rb +9 -0
  12. data/lib/playwright/connection.rb +3 -8
  13. data/lib/playwright/utils.rb +0 -1
  14. data/lib/playwright/version.rb +2 -2
  15. data/lib/playwright_api/android.rb +6 -6
  16. data/lib/playwright_api/android_device.rb +8 -7
  17. data/lib/playwright_api/browser.rb +10 -8
  18. data/lib/playwright_api/browser_context.rb +6 -6
  19. data/lib/playwright_api/browser_type.rb +8 -7
  20. data/lib/playwright_api/cdp_session.rb +6 -6
  21. data/lib/playwright_api/console_message.rb +6 -6
  22. data/lib/playwright_api/dialog.rb +6 -6
  23. data/lib/playwright_api/element_handle.rb +6 -6
  24. data/lib/playwright_api/frame.rb +10 -12
  25. data/lib/playwright_api/js_handle.rb +6 -6
  26. data/lib/playwright_api/locator.rb +13 -0
  27. data/lib/playwright_api/page.rb +9 -11
  28. data/lib/playwright_api/playwright.rb +6 -6
  29. data/lib/playwright_api/request.rb +6 -6
  30. data/lib/playwright_api/response.rb +6 -6
  31. data/lib/playwright_api/route.rb +6 -6
  32. data/lib/playwright_api/selectors.rb +38 -7
  33. data/lib/playwright_api/web_socket.rb +6 -6
  34. data/lib/playwright_api/worker.rb +6 -6
  35. metadata +5 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d6f164b2d4296ab3f30bfb22cd5fbec86ab522df916913ab19731dd452c55efa
4
- data.tar.gz: 56371e88f29c8a7e7e398582a7cda693f45d8ebbb5bf6ce6e3fa0e748a2175bc
3
+ metadata.gz: ae7bd712526c9e50089204c128fc6aff20ff430e2f58d04faea66d429ab53357
4
+ data.tar.gz: 95cb87802b32b1ce4487f6bc7a0fe897c5cdf285cef09700dc9472b8caea46d1
5
5
  SHA512:
6
- metadata.gz: d97fd45d76a1cf4202be4aae7527974b01d8f90fd1de5e4fb4ed1267d3d3eeb601d5dddc49eb70559688c6bc816df82bc8c667e6aec7d2226ce078a2e0182a25
7
- data.tar.gz: 602c97a88eb16aab95590391ae26f7ba777904668d4e270e3e24fe05122606d3f23d68901e529bb28b23a91458cdf7ce165de0c87621e0ad4ef9f8a711ccaf5f
6
+ metadata.gz: b6854306d49f2bdf5a2f51bcfc639297043a52d9f0c38b3eb1b8db3931462cd98c42f0d45a35867352dccce25637efcc414b5c14edfe9d332c176d10a9fe9723
7
+ data.tar.gz: 4e1e89f99491cb4d2cc3ef1092b5a95fcd7486b2b19cd45dcc01d2d25ac5884c4ab6ba956172f41017561aee74013c2902ac787d0d5a1d6b71ef5eacf8740056
@@ -99,6 +99,7 @@ def new_context(
99
99
  reducedMotion: nil,
100
100
  screen: nil,
101
101
  storageState: nil,
102
+ strictSelectors: nil,
102
103
  timezoneId: nil,
103
104
  userAgent: nil,
104
105
  viewport: nil,
@@ -148,6 +149,7 @@ def new_page(
148
149
  reducedMotion: nil,
149
150
  screen: nil,
150
151
  storageState: nil,
152
+ strictSelectors: nil,
151
153
  timezoneId: nil,
152
154
  userAgent: nil,
153
155
  viewport: nil,
@@ -137,6 +137,7 @@ def launch_persistent_context(
137
137
  reducedMotion: nil,
138
138
  screen: nil,
139
139
  slowMo: nil,
140
+ strictSelectors: nil,
140
141
  timeout: nil,
141
142
  timezoneId: nil,
142
143
  tracesDir: nil,
@@ -50,6 +50,7 @@ def launch_browser(
50
50
  record_video_size: nil,
51
51
  reducedMotion: nil,
52
52
  screen: nil,
53
+ strictSelectors: nil,
53
54
  timezoneId: nil,
54
55
  userAgent: nil,
55
56
  viewport: nil,
@@ -401,18 +401,18 @@ def goto(url, referer: nil, timeout: nil, waitUntil: nil)
401
401
  Returns the main resource response. In case of multiple redirects, the navigation will resolve with the response of the
402
402
  last redirect.
403
403
 
404
- `frame.goto` will throw an error if:
404
+ The method will throw an error if:
405
405
  - there's an SSL error (e.g. in case of self-signed certificates).
406
406
  - target URL is invalid.
407
407
  - the `timeout` is exceeded during navigation.
408
408
  - the remote server does not respond or is unreachable.
409
409
  - the main resource failed to load.
410
410
 
411
- `frame.goto` will not throw an error when any valid HTTP status code is returned by the remote server, including 404
412
- "Not Found" and 500 "Internal Server Error". The status code for such responses can be retrieved by calling
411
+ The method will not throw an error when any valid HTTP status code is returned by the remote server, including 404 "Not
412
+ Found" and 500 "Internal Server Error". The status code for such responses can be retrieved by calling
413
413
  [Response#status](./response#status).
414
414
 
415
- > NOTE: `frame.goto` either throws an error or returns a main resource response. The only exceptions are navigation to
415
+ > NOTE: The method either throws an error or returns a main resource response. The only exceptions are navigation to
416
416
  `about:blank` or navigation to the same URL with a different hash, which would succeed and return `null`.
417
417
  > NOTE: Headless mode doesn't support navigation to a PDF document. See the
418
418
  [upstream issue](https://bugs.chromium.org/p/chromium/issues/detail?id=761295).
@@ -533,8 +533,6 @@ The method returns an element locator that can be used to perform actions in the
533
533
  element immediately before performing an action, so a series of actions on the same locator can in fact be performed on
534
534
  different DOM elements. That would happen if the DOM structure between those actions has changed.
535
535
 
536
- Note that locator always implies visibility, so it will always be locating visible elements.
537
-
538
536
  ## name
539
537
 
540
538
  ```
@@ -34,6 +34,19 @@ locator.hover
34
34
  locator.click
35
35
  ```
36
36
 
37
+ **Strictness**
38
+
39
+ Locators are strict. This means that all operations on locators that imply some target DOM element will throw if more
40
+ than one element matches given selector.
41
+
42
+ ```ruby
43
+ # Throws if there are several buttons in DOM:
44
+ page.locator('button').click
45
+
46
+ # Works because we explicitly tell locator to pick the first element:
47
+ page.locator('button').first.click
48
+ ```
49
+
37
50
 
38
51
 
39
52
  ## all_inner_texts
@@ -622,18 +622,18 @@ def goto(url, referer: nil, timeout: nil, waitUntil: nil)
622
622
  Returns the main resource response. In case of multiple redirects, the navigation will resolve with the response of the
623
623
  last redirect.
624
624
 
625
- `page.goto` will throw an error if:
625
+ The method will throw an error if:
626
626
  - there's an SSL error (e.g. in case of self-signed certificates).
627
627
  - target URL is invalid.
628
628
  - the `timeout` is exceeded during navigation.
629
629
  - the remote server does not respond or is unreachable.
630
630
  - the main resource failed to load.
631
631
 
632
- `page.goto` will not throw an error when any valid HTTP status code is returned by the remote server, including 404 "Not
632
+ The method will not throw an error when any valid HTTP status code is returned by the remote server, including 404 "Not
633
633
  Found" and 500 "Internal Server Error". The status code for such responses can be retrieved by calling
634
634
  [Response#status](./response#status).
635
635
 
636
- > NOTE: `page.goto` either throws an error or returns a main resource response. The only exceptions are navigation to
636
+ > NOTE: The method either throws an error or returns a main resource response. The only exceptions are navigation to
637
637
  `about:blank` or navigation to the same URL with a different hash, which would succeed and return `null`.
638
638
  > NOTE: Headless mode doesn't support navigation to a PDF document. See the
639
639
  [upstream issue](https://bugs.chromium.org/p/chromium/issues/detail?id=761295).
@@ -758,8 +758,6 @@ The method returns an element locator that can be used to perform actions on the
758
758
  element immediately before performing an action, so a series of actions on the same locator can in fact be performed on
759
759
  different DOM elements. That would happen if the DOM structure between those actions has changed.
760
760
 
761
- Note that locator always implies visibility, so it will always be locating visible elements.
762
-
763
761
  Shortcut for main frame's [Frame#locator](./frame#locator).
764
762
 
765
763
  ## main_frame
@@ -15,9 +15,35 @@ def register(name, contentScript: nil, path: nil, script: nil)
15
15
 
16
16
  An example of registering selector engine that queries elements based on a tag name:
17
17
 
18
- ```python sync title=example_49f0cb9b5a21d0d5fe2b180c847bdb21068b335b4c2f42d5c05eb1957297899f.py
19
- # FIXME: add snippet
20
-
18
+ ```ruby
19
+ tag_selector = <<~JAVASCRIPT
20
+ {
21
+ // Returns the first element matching given selector in the root's subtree.
22
+ query(root, selector) {
23
+ return root.querySelector(selector);
24
+ },
25
+ // Returns all elements matching given selector in the root's subtree.
26
+ queryAll(root, selector) {
27
+ return Array.from(root.querySelectorAll(selector));
28
+ }
29
+ }
30
+ JAVASCRIPT
31
+
32
+ # Register the engine. Selectors will be prefixed with "tag=".
33
+ playwright.selectors.register("tag", script: tag_selector)
34
+ playwright.chromium.launch do |browser|
35
+ page = browser.new_page()
36
+ page.content = '<div><button>Click me</button></div>'
37
+
38
+ # Use the selector prefixed with its name.
39
+ button = page.query_selector('tag=button')
40
+ # Combine it with other selector engines.
41
+ page.click('tag=div >> text="Click me"')
42
+
43
+ # Can use it in any methods supporting selectors.
44
+ button_count = page.eval_on_selector_all('tag=button', 'buttons => buttons.length')
45
+ button_count # => 1
46
+ end
21
47
  ```
22
48
 
23
49
 
data/lib/playwright.rb CHANGED
@@ -35,16 +35,18 @@ Dir[File.join(__dir__, 'playwright_api', '*.rb')].each { |f| require f }
35
35
 
36
36
  module Playwright
37
37
  class Execution
38
- def initialize(connection, playwright)
38
+ def initialize(connection, playwright, browser = nil)
39
39
  @connection = connection
40
40
  @playwright = playwright
41
+ @browser = browser
41
42
  end
42
43
 
43
44
  def stop
45
+ @browser&.close
44
46
  @connection.stop
45
47
  end
46
48
 
47
- attr_reader :playwright
49
+ attr_reader :playwright, :browser
48
50
  end
49
51
 
50
52
  # Recommended to call this method with block.
@@ -64,7 +66,7 @@ module Playwright
64
66
 
65
67
  execution =
66
68
  begin
67
- playwright = connection.wait_for_object_with_known_name('Playwright')
69
+ playwright = connection.initialize_playwright
68
70
  Execution.new(connection, PlaywrightApi.wrap(playwright))
69
71
  rescue
70
72
  connection.stop
@@ -100,7 +102,7 @@ module Playwright
100
102
 
101
103
  execution =
102
104
  begin
103
- playwright = connection.wait_for_object_with_known_name('Playwright')
105
+ playwright = connection.initialize_playwright
104
106
  Execution.new(connection, PlaywrightApi.wrap(playwright))
105
107
  rescue
106
108
  connection.stop
@@ -117,4 +119,42 @@ module Playwright
117
119
  execution
118
120
  end
119
121
  end
122
+
123
+ # Connects to Playwright server, launched by `npx playwright launch-server chromium` or `playwright.chromium.launchServer()`
124
+ #
125
+ # Playwright.connect_to_browser_server('ws://....') do |browser|
126
+ # page = browser.new_page
127
+ # ...
128
+ # end
129
+ #
130
+ # @experimental
131
+ module_function def connect_to_browser_server(ws_endpoint, &block)
132
+ require 'playwright/web_socket_client'
133
+ require 'playwright/web_socket_transport'
134
+
135
+ transport = WebSocketTransport.new(ws_endpoint: ws_endpoint)
136
+ connection = Connection.new(transport)
137
+ connection.async_run
138
+
139
+ execution =
140
+ begin
141
+ playwright = connection.initialize_playwright
142
+ browser = playwright.send(:pre_launched_browser)
143
+ browser.send(:update_as_remote)
144
+ Execution.new(connection, PlaywrightApi.wrap(playwright), PlaywrightApi.wrap(browser))
145
+ rescue
146
+ connection.stop
147
+ raise
148
+ end
149
+
150
+ if block
151
+ begin
152
+ block.call(execution.browser)
153
+ ensure
154
+ execution.stop
155
+ end
156
+ else
157
+ execution
158
+ end
159
+ end
120
160
  end
@@ -42,7 +42,6 @@ module Playwright
42
42
  raise 'Connecting over CDP is only supported in Chromium.' unless name == 'chromium'
43
43
 
44
44
  params = {
45
- sdkLanguage: 'ruby',
46
45
  endpointURL: endpointURL,
47
46
  headers: headers,
48
47
  slowMo: slowMo,
@@ -30,6 +30,15 @@ module Playwright
30
30
  end.to_h
31
31
  end
32
32
 
33
+ # used only from Playwright#connect_to_browser_server
34
+ private def pre_launched_browser
35
+ unless @initializer['preLaunchedBrowser']
36
+ raise 'Malformed endpoint. Did you use launchServer method?'
37
+ end
38
+
39
+ ::Playwright::ChannelOwners::Browser.from(@initializer['preLaunchedBrowser'])
40
+ end
41
+
33
42
  private def parse_device_descriptor(descriptor)
34
43
  # This return value can be passed into Browser#new_context as it is.
35
44
  # ex:
@@ -31,14 +31,9 @@ module Playwright
31
31
  @transport.stop
32
32
  end
33
33
 
34
- def wait_for_object_with_known_name(guid)
35
- if @objects[guid]
36
- return @objects[guid]
37
- end
38
-
39
- callback = Concurrent::Promises.resolvable_future
40
- @waiting_for_object[guid] = callback
41
- callback.value!
34
+ def initialize_playwright
35
+ result = send_message_to_server('', 'initialize', { sdkLanguage: 'ruby' })
36
+ ChannelOwners::Playwright.from(result['playwright'])
42
37
  end
43
38
 
44
39
  def async_send_message_to_server(guid, method, params)
@@ -3,7 +3,6 @@ module Playwright
3
3
  module PrepareBrowserContextOptions
4
4
  # @see https://github.com/microsoft/playwright/blob/5a2cfdbd47ed3c3deff77bb73e5fac34241f649d/src/client/browserContext.ts#L265
5
5
  private def prepare_browser_context_options(params)
6
- params[:sdkLanguage] = 'ruby'
7
6
  if params[:noViewport] == 0
8
7
  params.delete(:noViewport)
9
8
  params[:noDefaultViewport] = true
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playwright
4
- VERSION = '1.14.0'
5
- COMPATIBLE_PLAYWRIGHT_VERSION = '1.14.0'
4
+ VERSION = '1.15.beta1'
5
+ COMPATIBLE_PLAYWRIGHT_VERSION = '1.15.0'
6
6
  end
@@ -36,12 +36,6 @@ module Playwright
36
36
  end
37
37
  alias_method :default_timeout=, :set_default_timeout
38
38
 
39
- # -- inherited from EventEmitter --
40
- # @nodoc
41
- def once(event, callback)
42
- event_emitter_proxy.once(event, callback)
43
- end
44
-
45
39
  # -- inherited from EventEmitter --
46
40
  # @nodoc
47
41
  def on(event, callback)
@@ -54,6 +48,12 @@ module Playwright
54
48
  event_emitter_proxy.off(event, callback)
55
49
  end
56
50
 
51
+ # -- inherited from EventEmitter --
52
+ # @nodoc
53
+ def once(event, callback)
54
+ event_emitter_proxy.once(event, callback)
55
+ end
56
+
57
57
  private def event_emitter_proxy
58
58
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
59
59
  end
@@ -62,11 +62,12 @@ module Playwright
62
62
  record_video_size: nil,
63
63
  reducedMotion: nil,
64
64
  screen: nil,
65
+ strictSelectors: nil,
65
66
  timezoneId: nil,
66
67
  userAgent: nil,
67
68
  viewport: nil,
68
69
  &block)
69
- wrap_impl(@impl.launch_browser(acceptDownloads: unwrap_impl(acceptDownloads), baseURL: unwrap_impl(baseURL), bypassCSP: unwrap_impl(bypassCSP), colorScheme: unwrap_impl(colorScheme), command: unwrap_impl(command), deviceScaleFactor: unwrap_impl(deviceScaleFactor), extraHTTPHeaders: unwrap_impl(extraHTTPHeaders), geolocation: unwrap_impl(geolocation), hasTouch: unwrap_impl(hasTouch), httpCredentials: unwrap_impl(httpCredentials), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), isMobile: unwrap_impl(isMobile), javaScriptEnabled: unwrap_impl(javaScriptEnabled), locale: unwrap_impl(locale), noViewport: unwrap_impl(noViewport), offline: unwrap_impl(offline), permissions: unwrap_impl(permissions), record_har_omit_content: unwrap_impl(record_har_omit_content), record_har_path: unwrap_impl(record_har_path), record_video_dir: unwrap_impl(record_video_dir), record_video_size: unwrap_impl(record_video_size), reducedMotion: unwrap_impl(reducedMotion), screen: unwrap_impl(screen), timezoneId: unwrap_impl(timezoneId), userAgent: unwrap_impl(userAgent), viewport: unwrap_impl(viewport), &wrap_block_call(block)))
70
+ wrap_impl(@impl.launch_browser(acceptDownloads: unwrap_impl(acceptDownloads), baseURL: unwrap_impl(baseURL), bypassCSP: unwrap_impl(bypassCSP), colorScheme: unwrap_impl(colorScheme), command: unwrap_impl(command), deviceScaleFactor: unwrap_impl(deviceScaleFactor), extraHTTPHeaders: unwrap_impl(extraHTTPHeaders), geolocation: unwrap_impl(geolocation), hasTouch: unwrap_impl(hasTouch), httpCredentials: unwrap_impl(httpCredentials), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), isMobile: unwrap_impl(isMobile), javaScriptEnabled: unwrap_impl(javaScriptEnabled), locale: unwrap_impl(locale), noViewport: unwrap_impl(noViewport), offline: unwrap_impl(offline), permissions: unwrap_impl(permissions), record_har_omit_content: unwrap_impl(record_har_omit_content), record_har_path: unwrap_impl(record_har_path), record_video_dir: unwrap_impl(record_video_dir), record_video_size: unwrap_impl(record_video_size), reducedMotion: unwrap_impl(reducedMotion), screen: unwrap_impl(screen), strictSelectors: unwrap_impl(strictSelectors), timezoneId: unwrap_impl(timezoneId), userAgent: unwrap_impl(userAgent), viewport: unwrap_impl(viewport), &wrap_block_call(block)))
70
71
  end
71
72
 
72
73
  # Performs a long tap on the widget defined by `selector`.
@@ -172,12 +173,6 @@ module Playwright
172
173
  wrap_impl(@impl.tree)
173
174
  end
174
175
 
175
- # -- inherited from EventEmitter --
176
- # @nodoc
177
- def once(event, callback)
178
- event_emitter_proxy.once(event, callback)
179
- end
180
-
181
176
  # -- inherited from EventEmitter --
182
177
  # @nodoc
183
178
  def on(event, callback)
@@ -190,6 +185,12 @@ module Playwright
190
185
  event_emitter_proxy.off(event, callback)
191
186
  end
192
187
 
188
+ # -- inherited from EventEmitter --
189
+ # @nodoc
190
+ def once(event, callback)
191
+ event_emitter_proxy.once(event, callback)
192
+ end
193
+
193
194
  private def event_emitter_proxy
194
195
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
195
196
  end
@@ -88,11 +88,12 @@ module Playwright
88
88
  reducedMotion: nil,
89
89
  screen: nil,
90
90
  storageState: nil,
91
+ strictSelectors: nil,
91
92
  timezoneId: nil,
92
93
  userAgent: nil,
93
94
  viewport: nil,
94
95
  &block)
95
- wrap_impl(@impl.new_context(acceptDownloads: unwrap_impl(acceptDownloads), baseURL: unwrap_impl(baseURL), bypassCSP: unwrap_impl(bypassCSP), colorScheme: unwrap_impl(colorScheme), deviceScaleFactor: unwrap_impl(deviceScaleFactor), extraHTTPHeaders: unwrap_impl(extraHTTPHeaders), geolocation: unwrap_impl(geolocation), hasTouch: unwrap_impl(hasTouch), httpCredentials: unwrap_impl(httpCredentials), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), isMobile: unwrap_impl(isMobile), javaScriptEnabled: unwrap_impl(javaScriptEnabled), locale: unwrap_impl(locale), noViewport: unwrap_impl(noViewport), offline: unwrap_impl(offline), permissions: unwrap_impl(permissions), proxy: unwrap_impl(proxy), record_har_omit_content: unwrap_impl(record_har_omit_content), record_har_path: unwrap_impl(record_har_path), record_video_dir: unwrap_impl(record_video_dir), record_video_size: unwrap_impl(record_video_size), reducedMotion: unwrap_impl(reducedMotion), screen: unwrap_impl(screen), storageState: unwrap_impl(storageState), timezoneId: unwrap_impl(timezoneId), userAgent: unwrap_impl(userAgent), viewport: unwrap_impl(viewport), &wrap_block_call(block)))
96
+ wrap_impl(@impl.new_context(acceptDownloads: unwrap_impl(acceptDownloads), baseURL: unwrap_impl(baseURL), bypassCSP: unwrap_impl(bypassCSP), colorScheme: unwrap_impl(colorScheme), deviceScaleFactor: unwrap_impl(deviceScaleFactor), extraHTTPHeaders: unwrap_impl(extraHTTPHeaders), geolocation: unwrap_impl(geolocation), hasTouch: unwrap_impl(hasTouch), httpCredentials: unwrap_impl(httpCredentials), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), isMobile: unwrap_impl(isMobile), javaScriptEnabled: unwrap_impl(javaScriptEnabled), locale: unwrap_impl(locale), noViewport: unwrap_impl(noViewport), offline: unwrap_impl(offline), permissions: unwrap_impl(permissions), proxy: unwrap_impl(proxy), record_har_omit_content: unwrap_impl(record_har_omit_content), record_har_path: unwrap_impl(record_har_path), record_video_dir: unwrap_impl(record_video_dir), record_video_size: unwrap_impl(record_video_size), reducedMotion: unwrap_impl(reducedMotion), screen: unwrap_impl(screen), storageState: unwrap_impl(storageState), strictSelectors: unwrap_impl(strictSelectors), timezoneId: unwrap_impl(timezoneId), userAgent: unwrap_impl(userAgent), viewport: unwrap_impl(viewport), &wrap_block_call(block)))
96
97
  end
97
98
 
98
99
  # Creates a new page in a new browser context. Closing this page will close the context as well.
@@ -125,11 +126,12 @@ module Playwright
125
126
  reducedMotion: nil,
126
127
  screen: nil,
127
128
  storageState: nil,
129
+ strictSelectors: nil,
128
130
  timezoneId: nil,
129
131
  userAgent: nil,
130
132
  viewport: nil,
131
133
  &block)
132
- wrap_impl(@impl.new_page(acceptDownloads: unwrap_impl(acceptDownloads), baseURL: unwrap_impl(baseURL), bypassCSP: unwrap_impl(bypassCSP), colorScheme: unwrap_impl(colorScheme), deviceScaleFactor: unwrap_impl(deviceScaleFactor), extraHTTPHeaders: unwrap_impl(extraHTTPHeaders), geolocation: unwrap_impl(geolocation), hasTouch: unwrap_impl(hasTouch), httpCredentials: unwrap_impl(httpCredentials), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), isMobile: unwrap_impl(isMobile), javaScriptEnabled: unwrap_impl(javaScriptEnabled), locale: unwrap_impl(locale), noViewport: unwrap_impl(noViewport), offline: unwrap_impl(offline), permissions: unwrap_impl(permissions), proxy: unwrap_impl(proxy), record_har_omit_content: unwrap_impl(record_har_omit_content), record_har_path: unwrap_impl(record_har_path), record_video_dir: unwrap_impl(record_video_dir), record_video_size: unwrap_impl(record_video_size), reducedMotion: unwrap_impl(reducedMotion), screen: unwrap_impl(screen), storageState: unwrap_impl(storageState), timezoneId: unwrap_impl(timezoneId), userAgent: unwrap_impl(userAgent), viewport: unwrap_impl(viewport), &wrap_block_call(block)))
134
+ wrap_impl(@impl.new_page(acceptDownloads: unwrap_impl(acceptDownloads), baseURL: unwrap_impl(baseURL), bypassCSP: unwrap_impl(bypassCSP), colorScheme: unwrap_impl(colorScheme), deviceScaleFactor: unwrap_impl(deviceScaleFactor), extraHTTPHeaders: unwrap_impl(extraHTTPHeaders), geolocation: unwrap_impl(geolocation), hasTouch: unwrap_impl(hasTouch), httpCredentials: unwrap_impl(httpCredentials), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), isMobile: unwrap_impl(isMobile), javaScriptEnabled: unwrap_impl(javaScriptEnabled), locale: unwrap_impl(locale), noViewport: unwrap_impl(noViewport), offline: unwrap_impl(offline), permissions: unwrap_impl(permissions), proxy: unwrap_impl(proxy), record_har_omit_content: unwrap_impl(record_har_omit_content), record_har_path: unwrap_impl(record_har_path), record_video_dir: unwrap_impl(record_video_dir), record_video_size: unwrap_impl(record_video_size), reducedMotion: unwrap_impl(reducedMotion), screen: unwrap_impl(screen), storageState: unwrap_impl(storageState), strictSelectors: unwrap_impl(strictSelectors), timezoneId: unwrap_impl(timezoneId), userAgent: unwrap_impl(userAgent), viewport: unwrap_impl(viewport), &wrap_block_call(block)))
133
135
  end
134
136
 
135
137
  # > NOTE: This API controls [Chromium Tracing](https://www.chromium.org/developers/how-tos/trace-event-profiling-tool)
@@ -162,12 +164,6 @@ module Playwright
162
164
  wrap_impl(@impl.version)
163
165
  end
164
166
 
165
- # -- inherited from EventEmitter --
166
- # @nodoc
167
- def once(event, callback)
168
- event_emitter_proxy.once(event, callback)
169
- end
170
-
171
167
  # -- inherited from EventEmitter --
172
168
  # @nodoc
173
169
  def on(event, callback)
@@ -180,6 +176,12 @@ module Playwright
180
176
  event_emitter_proxy.off(event, callback)
181
177
  end
182
178
 
179
+ # -- inherited from EventEmitter --
180
+ # @nodoc
181
+ def once(event, callback)
182
+ event_emitter_proxy.once(event, callback)
183
+ end
184
+
183
185
  private def event_emitter_proxy
184
186
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
185
187
  end
@@ -387,12 +387,6 @@ module Playwright
387
387
  wrap_impl(@impl.options=(unwrap_impl(req)))
388
388
  end
389
389
 
390
- # -- inherited from EventEmitter --
391
- # @nodoc
392
- def once(event, callback)
393
- event_emitter_proxy.once(event, callback)
394
- end
395
-
396
390
  # -- inherited from EventEmitter --
397
391
  # @nodoc
398
392
  def on(event, callback)
@@ -405,6 +399,12 @@ module Playwright
405
399
  event_emitter_proxy.off(event, callback)
406
400
  end
407
401
 
402
+ # -- inherited from EventEmitter --
403
+ # @nodoc
404
+ def once(event, callback)
405
+ event_emitter_proxy.once(event, callback)
406
+ end
407
+
408
408
  private def event_emitter_proxy
409
409
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
410
410
  end
@@ -130,13 +130,14 @@ module Playwright
130
130
  reducedMotion: nil,
131
131
  screen: nil,
132
132
  slowMo: nil,
133
+ strictSelectors: nil,
133
134
  timeout: nil,
134
135
  timezoneId: nil,
135
136
  tracesDir: nil,
136
137
  userAgent: nil,
137
138
  viewport: nil,
138
139
  &block)
139
- wrap_impl(@impl.launch_persistent_context(unwrap_impl(userDataDir), acceptDownloads: unwrap_impl(acceptDownloads), args: unwrap_impl(args), baseURL: unwrap_impl(baseURL), bypassCSP: unwrap_impl(bypassCSP), channel: unwrap_impl(channel), chromiumSandbox: unwrap_impl(chromiumSandbox), colorScheme: unwrap_impl(colorScheme), deviceScaleFactor: unwrap_impl(deviceScaleFactor), devtools: unwrap_impl(devtools), downloadsPath: unwrap_impl(downloadsPath), env: unwrap_impl(env), executablePath: unwrap_impl(executablePath), extraHTTPHeaders: unwrap_impl(extraHTTPHeaders), geolocation: unwrap_impl(geolocation), handleSIGHUP: unwrap_impl(handleSIGHUP), handleSIGINT: unwrap_impl(handleSIGINT), handleSIGTERM: unwrap_impl(handleSIGTERM), hasTouch: unwrap_impl(hasTouch), headless: unwrap_impl(headless), httpCredentials: unwrap_impl(httpCredentials), ignoreDefaultArgs: unwrap_impl(ignoreDefaultArgs), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), isMobile: unwrap_impl(isMobile), javaScriptEnabled: unwrap_impl(javaScriptEnabled), locale: unwrap_impl(locale), noViewport: unwrap_impl(noViewport), offline: unwrap_impl(offline), permissions: unwrap_impl(permissions), proxy: unwrap_impl(proxy), record_har_omit_content: unwrap_impl(record_har_omit_content), record_har_path: unwrap_impl(record_har_path), record_video_dir: unwrap_impl(record_video_dir), record_video_size: unwrap_impl(record_video_size), reducedMotion: unwrap_impl(reducedMotion), screen: unwrap_impl(screen), slowMo: unwrap_impl(slowMo), timeout: unwrap_impl(timeout), timezoneId: unwrap_impl(timezoneId), tracesDir: unwrap_impl(tracesDir), userAgent: unwrap_impl(userAgent), viewport: unwrap_impl(viewport), &wrap_block_call(block)))
140
+ wrap_impl(@impl.launch_persistent_context(unwrap_impl(userDataDir), acceptDownloads: unwrap_impl(acceptDownloads), args: unwrap_impl(args), baseURL: unwrap_impl(baseURL), bypassCSP: unwrap_impl(bypassCSP), channel: unwrap_impl(channel), chromiumSandbox: unwrap_impl(chromiumSandbox), colorScheme: unwrap_impl(colorScheme), deviceScaleFactor: unwrap_impl(deviceScaleFactor), devtools: unwrap_impl(devtools), downloadsPath: unwrap_impl(downloadsPath), env: unwrap_impl(env), executablePath: unwrap_impl(executablePath), extraHTTPHeaders: unwrap_impl(extraHTTPHeaders), geolocation: unwrap_impl(geolocation), handleSIGHUP: unwrap_impl(handleSIGHUP), handleSIGINT: unwrap_impl(handleSIGINT), handleSIGTERM: unwrap_impl(handleSIGTERM), hasTouch: unwrap_impl(hasTouch), headless: unwrap_impl(headless), httpCredentials: unwrap_impl(httpCredentials), ignoreDefaultArgs: unwrap_impl(ignoreDefaultArgs), ignoreHTTPSErrors: unwrap_impl(ignoreHTTPSErrors), isMobile: unwrap_impl(isMobile), javaScriptEnabled: unwrap_impl(javaScriptEnabled), locale: unwrap_impl(locale), noViewport: unwrap_impl(noViewport), offline: unwrap_impl(offline), permissions: unwrap_impl(permissions), proxy: unwrap_impl(proxy), record_har_omit_content: unwrap_impl(record_har_omit_content), record_har_path: unwrap_impl(record_har_path), record_video_dir: unwrap_impl(record_video_dir), record_video_size: unwrap_impl(record_video_size), reducedMotion: unwrap_impl(reducedMotion), screen: unwrap_impl(screen), slowMo: unwrap_impl(slowMo), strictSelectors: unwrap_impl(strictSelectors), timeout: unwrap_impl(timeout), timezoneId: unwrap_impl(timezoneId), tracesDir: unwrap_impl(tracesDir), userAgent: unwrap_impl(userAgent), viewport: unwrap_impl(viewport), &wrap_block_call(block)))
140
141
  end
141
142
 
142
143
  # Returns browser name. For example: `'chromium'`, `'webkit'` or `'firefox'`.
@@ -144,12 +145,6 @@ module Playwright
144
145
  wrap_impl(@impl.name)
145
146
  end
146
147
 
147
- # -- inherited from EventEmitter --
148
- # @nodoc
149
- def once(event, callback)
150
- event_emitter_proxy.once(event, callback)
151
- end
152
-
153
148
  # -- inherited from EventEmitter --
154
149
  # @nodoc
155
150
  def on(event, callback)
@@ -162,6 +157,12 @@ module Playwright
162
157
  event_emitter_proxy.off(event, callback)
163
158
  end
164
159
 
160
+ # -- inherited from EventEmitter --
161
+ # @nodoc
162
+ def once(event, callback)
163
+ event_emitter_proxy.once(event, callback)
164
+ end
165
+
165
166
  private def event_emitter_proxy
166
167
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
167
168
  end
@@ -33,12 +33,6 @@ module Playwright
33
33
  wrap_impl(@impl.send_message(unwrap_impl(method), params: unwrap_impl(params)))
34
34
  end
35
35
 
36
- # -- inherited from EventEmitter --
37
- # @nodoc
38
- def once(event, callback)
39
- event_emitter_proxy.once(event, callback)
40
- end
41
-
42
36
  # -- inherited from EventEmitter --
43
37
  # @nodoc
44
38
  def on(event, callback)
@@ -51,6 +45,12 @@ module Playwright
51
45
  event_emitter_proxy.off(event, callback)
52
46
  end
53
47
 
48
+ # -- inherited from EventEmitter --
49
+ # @nodoc
50
+ def once(event, callback)
51
+ event_emitter_proxy.once(event, callback)
52
+ end
53
+
54
54
  private def event_emitter_proxy
55
55
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
56
56
  end
@@ -23,12 +23,6 @@ module Playwright
23
23
  wrap_impl(@impl.type)
24
24
  end
25
25
 
26
- # -- inherited from EventEmitter --
27
- # @nodoc
28
- def once(event, callback)
29
- event_emitter_proxy.once(event, callback)
30
- end
31
-
32
26
  # -- inherited from EventEmitter --
33
27
  # @nodoc
34
28
  def on(event, callback)
@@ -41,6 +35,12 @@ module Playwright
41
35
  event_emitter_proxy.off(event, callback)
42
36
  end
43
37
 
38
+ # -- inherited from EventEmitter --
39
+ # @nodoc
40
+ def once(event, callback)
41
+ event_emitter_proxy.once(event, callback)
42
+ end
43
+
44
44
  private def event_emitter_proxy
45
45
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
46
46
  end
@@ -58,12 +58,6 @@ module Playwright
58
58
  wrap_impl(@impl.accept_async(promptText: unwrap_impl(promptText)))
59
59
  end
60
60
 
61
- # -- inherited from EventEmitter --
62
- # @nodoc
63
- def once(event, callback)
64
- event_emitter_proxy.once(event, callback)
65
- end
66
-
67
61
  # -- inherited from EventEmitter --
68
62
  # @nodoc
69
63
  def on(event, callback)
@@ -76,6 +70,12 @@ module Playwright
76
70
  event_emitter_proxy.off(event, callback)
77
71
  end
78
72
 
73
+ # -- inherited from EventEmitter --
74
+ # @nodoc
75
+ def once(event, callback)
76
+ event_emitter_proxy.once(event, callback)
77
+ end
78
+
79
79
  private def event_emitter_proxy
80
80
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
81
81
  end
@@ -529,12 +529,6 @@ module Playwright
529
529
  wrap_impl(@impl.wait_for_selector(unwrap_impl(selector), state: unwrap_impl(state), timeout: unwrap_impl(timeout)))
530
530
  end
531
531
 
532
- # -- inherited from EventEmitter --
533
- # @nodoc
534
- def once(event, callback)
535
- event_emitter_proxy.once(event, callback)
536
- end
537
-
538
532
  # -- inherited from EventEmitter --
539
533
  # @nodoc
540
534
  def on(event, callback)
@@ -547,6 +541,12 @@ module Playwright
547
541
  event_emitter_proxy.off(event, callback)
548
542
  end
549
543
 
544
+ # -- inherited from EventEmitter --
545
+ # @nodoc
546
+ def once(event, callback)
547
+ event_emitter_proxy.once(event, callback)
548
+ end
549
+
550
550
  private def event_emitter_proxy
551
551
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
552
552
  end
@@ -332,18 +332,18 @@ module Playwright
332
332
  # Returns the main resource response. In case of multiple redirects, the navigation will resolve with the response of the
333
333
  # last redirect.
334
334
  #
335
- # `frame.goto` will throw an error if:
335
+ # The method will throw an error if:
336
336
  # - there's an SSL error (e.g. in case of self-signed certificates).
337
337
  # - target URL is invalid.
338
338
  # - the `timeout` is exceeded during navigation.
339
339
  # - the remote server does not respond or is unreachable.
340
340
  # - the main resource failed to load.
341
341
  #
342
- # `frame.goto` will not throw an error when any valid HTTP status code is returned by the remote server, including 404
343
- # "Not Found" and 500 "Internal Server Error". The status code for such responses can be retrieved by calling
342
+ # The method will not throw an error when any valid HTTP status code is returned by the remote server, including 404 "Not
343
+ # Found" and 500 "Internal Server Error". The status code for such responses can be retrieved by calling
344
344
  # [`method: Response.status`].
345
345
  #
346
- # > NOTE: `frame.goto` either throws an error or returns a main resource response. The only exceptions are navigation to
346
+ # > NOTE: The method either throws an error or returns a main resource response. The only exceptions are navigation to
347
347
  # `about:blank` or navigation to the same URL with a different hash, which would succeed and return `null`.
348
348
  # > NOTE: Headless mode doesn't support navigation to a PDF document. See the
349
349
  # [upstream issue](https://bugs.chromium.org/p/chromium/issues/detail?id=761295).
@@ -427,8 +427,6 @@ module Playwright
427
427
  # The method returns an element locator that can be used to perform actions in the frame. Locator is resolved to the
428
428
  # element immediately before performing an action, so a series of actions on the same locator can in fact be performed on
429
429
  # different DOM elements. That would happen if the DOM structure between those actions has changed.
430
- #
431
- # Note that locator always implies visibility, so it will always be locating visible elements.
432
430
  def locator(selector)
433
431
  wrap_impl(@impl.locator(unwrap_impl(selector)))
434
432
  end
@@ -740,12 +738,6 @@ module Playwright
740
738
  wrap_impl(@impl.detached=(unwrap_impl(req)))
741
739
  end
742
740
 
743
- # -- inherited from EventEmitter --
744
- # @nodoc
745
- def once(event, callback)
746
- event_emitter_proxy.once(event, callback)
747
- end
748
-
749
741
  # -- inherited from EventEmitter --
750
742
  # @nodoc
751
743
  def on(event, callback)
@@ -758,6 +750,12 @@ module Playwright
758
750
  event_emitter_proxy.off(event, callback)
759
751
  end
760
752
 
753
+ # -- inherited from EventEmitter --
754
+ # @nodoc
755
+ def once(event, callback)
756
+ event_emitter_proxy.once(event, callback)
757
+ end
758
+
761
759
  private def event_emitter_proxy
762
760
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
763
761
  end
@@ -88,12 +88,6 @@ module Playwright
88
88
  wrap_impl(@impl.to_s)
89
89
  end
90
90
 
91
- # -- inherited from EventEmitter --
92
- # @nodoc
93
- def once(event, callback)
94
- event_emitter_proxy.once(event, callback)
95
- end
96
-
97
91
  # -- inherited from EventEmitter --
98
92
  # @nodoc
99
93
  def on(event, callback)
@@ -106,6 +100,12 @@ module Playwright
106
100
  event_emitter_proxy.off(event, callback)
107
101
  end
108
102
 
103
+ # -- inherited from EventEmitter --
104
+ # @nodoc
105
+ def once(event, callback)
106
+ event_emitter_proxy.once(event, callback)
107
+ end
108
+
109
109
  private def event_emitter_proxy
110
110
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
111
111
  end
@@ -28,6 +28,19 @@ module Playwright
28
28
  # locator.hover()
29
29
  # locator.click()
30
30
  # ```
31
+ #
32
+ # **Strictness**
33
+ #
34
+ # Locators are strict. This means that all operations on locators that imply some target DOM element will throw if more
35
+ # than one element matches given selector.
36
+ #
37
+ # ```python sync
38
+ # # Throws if there are several buttons in DOM:
39
+ # page.locator('button').click()
40
+ #
41
+ # # Works because we explicitly tell locator to pick the first element:
42
+ # page.locator('button').first.click()
43
+ # ```
31
44
  class Locator < PlaywrightApi
32
45
 
33
46
  # Returns an array of `node.innerText` values for all matching nodes.
@@ -562,18 +562,18 @@ module Playwright
562
562
  # Returns the main resource response. In case of multiple redirects, the navigation will resolve with the response of the
563
563
  # last redirect.
564
564
  #
565
- # `page.goto` will throw an error if:
565
+ # The method will throw an error if:
566
566
  # - there's an SSL error (e.g. in case of self-signed certificates).
567
567
  # - target URL is invalid.
568
568
  # - the `timeout` is exceeded during navigation.
569
569
  # - the remote server does not respond or is unreachable.
570
570
  # - the main resource failed to load.
571
571
  #
572
- # `page.goto` will not throw an error when any valid HTTP status code is returned by the remote server, including 404 "Not
572
+ # The method will not throw an error when any valid HTTP status code is returned by the remote server, including 404 "Not
573
573
  # Found" and 500 "Internal Server Error". The status code for such responses can be retrieved by calling
574
574
  # [`method: Response.status`].
575
575
  #
576
- # > NOTE: `page.goto` either throws an error or returns a main resource response. The only exceptions are navigation to
576
+ # > NOTE: The method either throws an error or returns a main resource response. The only exceptions are navigation to
577
577
  # `about:blank` or navigation to the same URL with a different hash, which would succeed and return `null`.
578
578
  # > NOTE: Headless mode doesn't support navigation to a PDF document. See the
579
579
  # [upstream issue](https://bugs.chromium.org/p/chromium/issues/detail?id=761295).
@@ -662,8 +662,6 @@ module Playwright
662
662
  # element immediately before performing an action, so a series of actions on the same locator can in fact be performed on
663
663
  # different DOM elements. That would happen if the DOM structure between those actions has changed.
664
664
  #
665
- # Note that locator always implies visibility, so it will always be locating visible elements.
666
- #
667
665
  # Shortcut for main frame's [`method: Frame.locator`].
668
666
  def locator(selector)
669
667
  wrap_impl(@impl.locator(unwrap_impl(selector)))
@@ -1352,12 +1350,6 @@ module Playwright
1352
1350
  wrap_impl(@impl.guid)
1353
1351
  end
1354
1352
 
1355
- # -- inherited from EventEmitter --
1356
- # @nodoc
1357
- def once(event, callback)
1358
- event_emitter_proxy.once(event, callback)
1359
- end
1360
-
1361
1353
  # -- inherited from EventEmitter --
1362
1354
  # @nodoc
1363
1355
  def on(event, callback)
@@ -1370,6 +1362,12 @@ module Playwright
1370
1362
  event_emitter_proxy.off(event, callback)
1371
1363
  end
1372
1364
 
1365
+ # -- inherited from EventEmitter --
1366
+ # @nodoc
1367
+ def once(event, callback)
1368
+ event_emitter_proxy.once(event, callback)
1369
+ end
1370
+
1373
1371
  private def event_emitter_proxy
1374
1372
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
1375
1373
  end
@@ -91,12 +91,6 @@ module Playwright
91
91
  wrap_impl(@impl.electron)
92
92
  end
93
93
 
94
- # -- inherited from EventEmitter --
95
- # @nodoc
96
- def once(event, callback)
97
- event_emitter_proxy.once(event, callback)
98
- end
99
-
100
94
  # -- inherited from EventEmitter --
101
95
  # @nodoc
102
96
  def on(event, callback)
@@ -109,6 +103,12 @@ module Playwright
109
103
  event_emitter_proxy.off(event, callback)
110
104
  end
111
105
 
106
+ # -- inherited from EventEmitter --
107
+ # @nodoc
108
+ def once(event, callback)
109
+ event_emitter_proxy.once(event, callback)
110
+ end
111
+
112
112
  private def event_emitter_proxy
113
113
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
114
114
  end
@@ -128,12 +128,6 @@ module Playwright
128
128
  wrap_impl(@impl.url)
129
129
  end
130
130
 
131
- # -- inherited from EventEmitter --
132
- # @nodoc
133
- def once(event, callback)
134
- event_emitter_proxy.once(event, callback)
135
- end
136
-
137
131
  # -- inherited from EventEmitter --
138
132
  # @nodoc
139
133
  def on(event, callback)
@@ -146,6 +140,12 @@ module Playwright
146
140
  event_emitter_proxy.off(event, callback)
147
141
  end
148
142
 
143
+ # -- inherited from EventEmitter --
144
+ # @nodoc
145
+ def once(event, callback)
146
+ event_emitter_proxy.once(event, callback)
147
+ end
148
+
149
149
  private def event_emitter_proxy
150
150
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
151
151
  end
@@ -74,12 +74,6 @@ module Playwright
74
74
  wrap_impl(@impl.ok?)
75
75
  end
76
76
 
77
- # -- inherited from EventEmitter --
78
- # @nodoc
79
- def once(event, callback)
80
- event_emitter_proxy.once(event, callback)
81
- end
82
-
83
77
  # -- inherited from EventEmitter --
84
78
  # @nodoc
85
79
  def on(event, callback)
@@ -92,6 +86,12 @@ module Playwright
92
86
  event_emitter_proxy.off(event, callback)
93
87
  end
94
88
 
89
+ # -- inherited from EventEmitter --
90
+ # @nodoc
91
+ def once(event, callback)
92
+ event_emitter_proxy.once(event, callback)
93
+ end
94
+
95
95
  private def event_emitter_proxy
96
96
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
97
97
  end
@@ -56,12 +56,6 @@ module Playwright
56
56
  wrap_impl(@impl.request)
57
57
  end
58
58
 
59
- # -- inherited from EventEmitter --
60
- # @nodoc
61
- def once(event, callback)
62
- event_emitter_proxy.once(event, callback)
63
- end
64
-
65
59
  # -- inherited from EventEmitter --
66
60
  # @nodoc
67
61
  def on(event, callback)
@@ -74,6 +68,12 @@ module Playwright
74
68
  event_emitter_proxy.off(event, callback)
75
69
  end
76
70
 
71
+ # -- inherited from EventEmitter --
72
+ # @nodoc
73
+ def once(event, callback)
74
+ event_emitter_proxy.once(event, callback)
75
+ end
76
+
77
77
  private def event_emitter_proxy
78
78
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
79
79
  end
@@ -6,18 +6,43 @@ module Playwright
6
6
  # An example of registering selector engine that queries elements based on a tag name:
7
7
  #
8
8
  # ```python sync
9
- # # FIXME: add snippet
9
+ # from playwright.sync_api import sync_playwright
10
+ #
11
+ # def run(playwright):
12
+ # tag_selector = """
13
+ # {
14
+ # // Returns the first element matching given selector in the root's subtree.
15
+ # query(root, selector) {
16
+ # return root.querySelector(selector);
17
+ # },
18
+ # // Returns all elements matching given selector in the root's subtree.
19
+ # queryAll(root, selector) {
20
+ # return Array.from(root.querySelectorAll(selector));
21
+ # }
22
+ # }"""
23
+ #
24
+ # # Register the engine. Selectors will be prefixed with "tag=".
25
+ # playwright.selectors.register("tag", tag_selector)
26
+ # browser = playwright.chromium.launch()
27
+ # page = browser.new_page()
28
+ # page.set_content('<div><button>Click me</button></div>')
29
+ #
30
+ # # Use the selector prefixed with its name.
31
+ # button = page.query_selector('tag=button')
32
+ # # Combine it with other selector engines.
33
+ # page.click('tag=div >> text="Click me"')
34
+ # # Can use it in any methods supporting selectors.
35
+ # button_count = page.eval_on_selector_all('tag=button', 'buttons => buttons.length')
36
+ # print(button_count)
37
+ # browser.close()
38
+ #
39
+ # with sync_playwright() as playwright:
40
+ # run(playwright)
10
41
  # ```
11
42
  def register(name, contentScript: nil, path: nil, script: nil)
12
43
  wrap_impl(@impl.register(unwrap_impl(name), contentScript: unwrap_impl(contentScript), path: unwrap_impl(path), script: unwrap_impl(script)))
13
44
  end
14
45
 
15
- # -- inherited from EventEmitter --
16
- # @nodoc
17
- def once(event, callback)
18
- event_emitter_proxy.once(event, callback)
19
- end
20
-
21
46
  # -- inherited from EventEmitter --
22
47
  # @nodoc
23
48
  def on(event, callback)
@@ -30,6 +55,12 @@ module Playwright
30
55
  event_emitter_proxy.off(event, callback)
31
56
  end
32
57
 
58
+ # -- inherited from EventEmitter --
59
+ # @nodoc
60
+ def once(event, callback)
61
+ event_emitter_proxy.once(event, callback)
62
+ end
63
+
33
64
  private def event_emitter_proxy
34
65
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
35
66
  end
@@ -27,12 +27,6 @@ module Playwright
27
27
  wrap_impl(@impl.wait_for_event(unwrap_impl(event), predicate: unwrap_impl(predicate), timeout: unwrap_impl(timeout), &wrap_block_call(block)))
28
28
  end
29
29
 
30
- # -- inherited from EventEmitter --
31
- # @nodoc
32
- def once(event, callback)
33
- event_emitter_proxy.once(event, callback)
34
- end
35
-
36
30
  # -- inherited from EventEmitter --
37
31
  # @nodoc
38
32
  def on(event, callback)
@@ -45,6 +39,12 @@ module Playwright
45
39
  event_emitter_proxy.off(event, callback)
46
40
  end
47
41
 
42
+ # -- inherited from EventEmitter --
43
+ # @nodoc
44
+ def once(event, callback)
45
+ event_emitter_proxy.once(event, callback)
46
+ end
47
+
48
48
  private def event_emitter_proxy
49
49
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
50
50
  end
@@ -53,12 +53,6 @@ module Playwright
53
53
  wrap_impl(@impl.page=(unwrap_impl(req)))
54
54
  end
55
55
 
56
- # -- inherited from EventEmitter --
57
- # @nodoc
58
- def once(event, callback)
59
- event_emitter_proxy.once(event, callback)
60
- end
61
-
62
56
  # -- inherited from EventEmitter --
63
57
  # @nodoc
64
58
  def on(event, callback)
@@ -71,6 +65,12 @@ module Playwright
71
65
  event_emitter_proxy.off(event, callback)
72
66
  end
73
67
 
68
+ # -- inherited from EventEmitter --
69
+ # @nodoc
70
+ def once(event, callback)
71
+ event_emitter_proxy.once(event, callback)
72
+ end
73
+
74
74
  private def event_emitter_proxy
75
75
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
76
76
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: playwright-ruby-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.14.0
4
+ version: 1.15.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - YusukeIwaki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-08-14 00:00:00.000000000 Z
11
+ date: 2021-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -372,12 +372,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
372
372
  version: '2.4'
373
373
  required_rubygems_version: !ruby/object:Gem::Requirement
374
374
  requirements:
375
- - - ">="
375
+ - - ">"
376
376
  - !ruby/object:Gem::Version
377
- version: '0'
377
+ version: 1.3.1
378
378
  requirements: []
379
379
  rubygems_version: 3.2.22
380
380
  signing_key:
381
381
  specification_version: 4
382
- summary: The Ruby binding of playwright driver 1.14.0
382
+ summary: The Ruby binding of playwright driver 1.15.0
383
383
  test_files: []