playwright-ruby-client 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/README.md +33 -0
  3. data/documentation/babel.config.js +3 -0
  4. data/documentation/docs/api/accessibility.md +7 -0
  5. data/documentation/docs/api/browser.md +185 -0
  6. data/documentation/docs/api/browser_context.md +398 -0
  7. data/documentation/docs/api/browser_type.md +105 -0
  8. data/documentation/docs/api/cdp_session.md +7 -0
  9. data/documentation/docs/api/console_message.md +41 -0
  10. data/documentation/docs/api/dialog.md +74 -0
  11. data/documentation/docs/api/element_handle.md +640 -0
  12. data/documentation/docs/api/experimental/_category_.yml +3 -0
  13. data/documentation/docs/api/experimental/android.md +25 -0
  14. data/documentation/docs/api/experimental/android_device.md +91 -0
  15. data/documentation/docs/api/experimental/android_input.md +38 -0
  16. data/documentation/docs/api/experimental/android_socket.md +7 -0
  17. data/documentation/docs/api/experimental/android_web_view.md +7 -0
  18. data/documentation/docs/api/file_chooser.md +51 -0
  19. data/documentation/docs/api/frame.md +867 -0
  20. data/documentation/docs/api/js_handle.md +116 -0
  21. data/documentation/docs/api/keyboard.md +157 -0
  22. data/documentation/docs/api/mouse.md +69 -0
  23. data/documentation/docs/api/page.md +1469 -0
  24. data/documentation/docs/api/playwright.md +63 -0
  25. data/documentation/docs/api/request.md +188 -0
  26. data/documentation/docs/api/response.md +97 -0
  27. data/documentation/docs/api/route.md +80 -0
  28. data/documentation/docs/api/selectors.md +23 -0
  29. data/documentation/docs/api/touchscreen.md +8 -0
  30. data/documentation/docs/api/tracing.md +54 -0
  31. data/documentation/docs/api/web_socket.md +7 -0
  32. data/documentation/docs/api/worker.md +7 -0
  33. data/documentation/docs/article/api_coverage.mdx +11 -0
  34. data/documentation/docs/article/getting_started.md +152 -0
  35. data/documentation/docs/article/guides/_category_.yml +3 -0
  36. data/documentation/docs/article/guides/download_playwright_driver.md +49 -0
  37. data/documentation/docs/article/guides/launch_browser.md +119 -0
  38. data/documentation/docs/article/guides/rails_integration.md +51 -0
  39. data/{docs → documentation/docs/include}/api_coverage.md +0 -0
  40. data/documentation/docusaurus.config.js +107 -0
  41. data/documentation/package.json +39 -0
  42. data/documentation/sidebars.js +15 -0
  43. data/documentation/src/components/HomepageFeatures.js +61 -0
  44. data/documentation/src/components/HomepageFeatures.module.css +13 -0
  45. data/documentation/src/css/custom.css +44 -0
  46. data/documentation/src/pages/index.js +50 -0
  47. data/documentation/src/pages/index.module.css +41 -0
  48. data/documentation/src/pages/markdown-page.md +7 -0
  49. data/documentation/static/.nojekyll +0 -0
  50. data/documentation/static/img/playwright-logo.svg +9 -0
  51. data/documentation/static/img/undraw_dropdown_menu.svg +1 -0
  52. data/documentation/static/img/undraw_web_development.svg +1 -0
  53. data/documentation/static/img/undraw_windows.svg +1 -0
  54. data/documentation/yarn.lock +8805 -0
  55. data/lib/playwright/channel_owners/binding_call.rb +33 -0
  56. data/lib/playwright/channel_owners/browser_context.rb +2 -2
  57. data/lib/playwright/channel_owners/element_handle.rb +2 -10
  58. data/lib/playwright/channel_owners/frame.rb +6 -28
  59. data/lib/playwright/channel_owners/js_handle.rb +2 -10
  60. data/lib/playwright/channel_owners/page.rb +10 -1
  61. data/lib/playwright/input_files.rb +0 -8
  62. data/lib/playwright/javascript.rb +0 -10
  63. data/lib/playwright/javascript/expression.rb +2 -7
  64. data/lib/playwright/version.rb +1 -1
  65. data/lib/playwright_api/accessibility.rb +7 -89
  66. data/lib/playwright_api/android.rb +7 -64
  67. data/lib/playwright_api/android_device.rb +8 -8
  68. data/lib/playwright_api/browser.rb +15 -169
  69. data/lib/playwright_api/browser_context.rb +47 -609
  70. data/lib/playwright_api/browser_type.rb +13 -103
  71. data/lib/playwright_api/cdp_session.rb +2 -25
  72. data/lib/playwright_api/console_message.rb +6 -6
  73. data/lib/playwright_api/dialog.rb +11 -92
  74. data/lib/playwright_api/element_handle.rb +60 -362
  75. data/lib/playwright_api/file_chooser.rb +0 -28
  76. data/lib/playwright_api/frame.rb +74 -713
  77. data/lib/playwright_api/js_handle.rb +16 -90
  78. data/lib/playwright_api/keyboard.rb +21 -213
  79. data/lib/playwright_api/mouse.rb +1 -45
  80. data/lib/playwright_api/page.rb +155 -1635
  81. data/lib/playwright_api/playwright.rb +14 -117
  82. data/lib/playwright_api/request.rb +15 -121
  83. data/lib/playwright_api/response.rb +9 -9
  84. data/lib/playwright_api/route.rb +8 -105
  85. data/lib/playwright_api/selectors.rb +6 -97
  86. data/lib/playwright_api/tracing.rb +1 -61
  87. data/lib/playwright_api/web_socket.rb +1 -1
  88. data/lib/playwright_api/worker.rb +6 -42
  89. metadata +55 -4
  90. data/lib/playwright/javascript/function.rb +0 -67
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a283a84899327e4b56db01800535c7231c1c2e94e7cbf11bd72ec60b1415c92c
4
- data.tar.gz: 5e929e57b0b8d3b0970c2a0cb5029acd6cc5bd23e419bf06bc1b0a45e2f5e781
3
+ metadata.gz: b365f47558ade3fcf3d803a070cbd61eb4eae6279f0d93c1641a53d9b50ec232
4
+ data.tar.gz: 353de7a190205c6d3d4542b3058afe24c0c634fe70811c15384b55d1cb464571
5
5
  SHA512:
6
- metadata.gz: d13545073c8a110c55098547c7f7c5c4adae5c542b6b18f78be4cf3e5187cf2c92d8ccc86484c0e7bdfbeaf619ff6c8f77ce2f9c82b5eccad4c72dffb22603a5
7
- data.tar.gz: ea4a751f747e5738121c8603eb3e495dd2ef32082d1fbd92841c2a0182637300b7c3bde0a00acbf1b25bdc572b140ff4e8a5a694dda95152f568ea5aa2760fef
6
+ metadata.gz: ec905a5051716af754993c11b5a484e5bf69a9b50cdb6681f583869d0cf70d23eb3265507d6739b6d006fc8419360dea8570f6fae6fc3ac8fdd6d44ae3547fd8
7
+ data.tar.gz: cf06e3351a40457108080dea85af6c8e417ffda3bec6671f9280ad42bc5fde7e58cf039016fe11387a7cb3e1347e1391f1440d23c2e54e512ca70e39ba90db38
@@ -0,0 +1,33 @@
1
+ # Website
2
+
3
+ This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator.
4
+
5
+ ## Installation
6
+
7
+ ```console
8
+ yarn install
9
+ ```
10
+
11
+ ## Local Development
12
+
13
+ ```console
14
+ yarn start
15
+ ```
16
+
17
+ This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
18
+
19
+ ## Build
20
+
21
+ ```console
22
+ yarn build
23
+ ```
24
+
25
+ This command generates static content into the `build` directory and can be served using any static contents hosting service.
26
+
27
+ ## Deployment
28
+
29
+ ```console
30
+ GIT_USER=<Your GitHub username> USE_SSH=true yarn deploy
31
+ ```
32
+
33
+ If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
3
+ };
@@ -0,0 +1,7 @@
1
+ ---
2
+ sidebar_position: 10
3
+ ---
4
+
5
+ # Accessibility
6
+
7
+ Not Implemented
@@ -0,0 +1,185 @@
1
+ ---
2
+ sidebar_position: 10
3
+ ---
4
+
5
+ # Browser
6
+
7
+ - extends: [EventEmitter]
8
+
9
+ A Browser is created via [BrowserType#launch](./browser_type#launch). An example of using a [Browser](./browser) to create a [Page](./page):
10
+
11
+ ```ruby
12
+ firefox = playwright.firefox
13
+ browser = firefox.launch
14
+ begin
15
+ page = browser.new_page
16
+ page.goto("https://example.com")
17
+ ensure
18
+ browser.close
19
+ end
20
+ ```
21
+
22
+
23
+
24
+ ## close
25
+
26
+ ```
27
+ def close
28
+ ```
29
+
30
+ In case this browser is obtained using [BrowserType#launch](./browser_type#launch), closes the browser and all of its pages (if any
31
+ were opened).
32
+
33
+ In case this browser is connected to, clears all created contexts belonging to this browser and disconnects from the
34
+ browser server.
35
+
36
+ The [Browser](./browser) object itself is considered to be disposed and cannot be used anymore.
37
+
38
+ ## contexts
39
+
40
+ ```
41
+ def contexts
42
+ ```
43
+
44
+ Returns an array of all open browser contexts. In a newly created browser, this will return zero browser contexts.
45
+
46
+ ```ruby
47
+ playwright.webkit.launch do |browser|
48
+ puts browser.contexts.count # => 0
49
+ context = browser.new_context
50
+ puts browser.contexts.count # => 1
51
+ end
52
+ ```
53
+
54
+
55
+
56
+ ## connected?
57
+
58
+ ```
59
+ def connected?
60
+ ```
61
+
62
+ Indicates that the browser is connected.
63
+
64
+ ## new_context
65
+
66
+ ```
67
+ def new_context(
68
+ acceptDownloads: nil,
69
+ bypassCSP: nil,
70
+ colorScheme: nil,
71
+ deviceScaleFactor: nil,
72
+ extraHTTPHeaders: nil,
73
+ geolocation: nil,
74
+ hasTouch: nil,
75
+ httpCredentials: nil,
76
+ ignoreHTTPSErrors: nil,
77
+ isMobile: nil,
78
+ javaScriptEnabled: nil,
79
+ locale: nil,
80
+ noViewport: nil,
81
+ offline: nil,
82
+ permissions: nil,
83
+ proxy: nil,
84
+ record_har_omit_content: nil,
85
+ record_har_path: nil,
86
+ record_video_dir: nil,
87
+ record_video_size: nil,
88
+ screen: nil,
89
+ storageState: nil,
90
+ timezoneId: nil,
91
+ userAgent: nil,
92
+ viewport: nil,
93
+ &block)
94
+ ```
95
+
96
+ Creates a new browser context. It won't share cookies/cache with other browser contexts.
97
+
98
+ ```ruby
99
+ playwright.firefox.launch do |browser| # or "chromium.launch" or "webkit.launch".
100
+ # create a new incognito browser context.
101
+ context = browser.new_context
102
+
103
+ # create a new page in a pristine context.
104
+ page = context.new_page()
105
+ page.goto("https://example.com")
106
+ end
107
+ ```
108
+
109
+
110
+
111
+ ## new_page
112
+
113
+ ```
114
+ def new_page(
115
+ acceptDownloads: nil,
116
+ bypassCSP: nil,
117
+ colorScheme: nil,
118
+ deviceScaleFactor: nil,
119
+ extraHTTPHeaders: nil,
120
+ geolocation: nil,
121
+ hasTouch: nil,
122
+ httpCredentials: nil,
123
+ ignoreHTTPSErrors: nil,
124
+ isMobile: nil,
125
+ javaScriptEnabled: nil,
126
+ locale: nil,
127
+ noViewport: nil,
128
+ offline: nil,
129
+ permissions: nil,
130
+ proxy: nil,
131
+ record_har_omit_content: nil,
132
+ record_har_path: nil,
133
+ record_video_dir: nil,
134
+ record_video_size: nil,
135
+ screen: nil,
136
+ storageState: nil,
137
+ timezoneId: nil,
138
+ userAgent: nil,
139
+ viewport: nil)
140
+ ```
141
+
142
+ Creates a new page in a new browser context. Closing this page will close the context as well.
143
+
144
+ This is a convenience API that should only be used for the single-page scenarios and short snippets. Production code and
145
+ testing frameworks should explicitly create [Browser#new_context](./browser#new_context) followed by the
146
+ [BrowserContext#new_page](./browser_context#new_page) to control their exact life times.
147
+
148
+ ## start_tracing
149
+
150
+ ```
151
+ def start_tracing(page: nil, categories: nil, path: nil, screenshots: nil)
152
+ ```
153
+
154
+ > NOTE: Tracing is only supported on Chromium-based browsers.
155
+
156
+ You can use [Browser#start_tracing](./browser#start_tracing) and [Browser#stop_tracing](./browser#stop_tracing) to create a trace file that can be
157
+ opened in Chrome DevTools performance panel.
158
+
159
+ ```ruby
160
+ browser.start_tracing(page: page, path: "trace.json")
161
+ begin
162
+ page.goto("https://www.google.com")
163
+ ensure
164
+ browser.stop_tracing
165
+ end
166
+ ```
167
+
168
+
169
+ ## stop_tracing
170
+
171
+ ```
172
+ def stop_tracing
173
+ ```
174
+
175
+ > NOTE: Tracing is only supported on Chromium-based browsers.
176
+
177
+ Returns the buffer with trace data.
178
+
179
+ ## version
180
+
181
+ ```
182
+ def version
183
+ ```
184
+
185
+ Returns the browser version.
@@ -0,0 +1,398 @@
1
+ ---
2
+ sidebar_position: 10
3
+ ---
4
+
5
+ # BrowserContext
6
+
7
+ - extends: [EventEmitter]
8
+
9
+ BrowserContexts provide a way to operate multiple independent browser sessions.
10
+
11
+ If a page opens another page, e.g. with a `window.open` call, the popup will belong to the parent page's browser
12
+ context.
13
+
14
+ Playwright allows creation of "incognito" browser contexts with [Browser#new_context](./browser#new_context) method. "Incognito" browser
15
+ contexts don't write any browsing data to disk.
16
+
17
+ ```ruby
18
+ # create a new incognito browser context
19
+ context = browser.new_context
20
+
21
+ # create a new page inside context.
22
+ page = context.new_page
23
+ page.goto("https://example.com")
24
+
25
+ # dispose context once it is no longer needed.
26
+ context.close()
27
+ ```
28
+
29
+
30
+
31
+ ## add_cookies
32
+
33
+ ```
34
+ def add_cookies(cookies)
35
+ ```
36
+
37
+ Adds cookies into this browser context. All pages within this context will have these cookies installed. Cookies can be
38
+ obtained via [BrowserContext#cookies](./browser_context#cookies).
39
+
40
+ ```ruby
41
+ browser_context.add_cookies([cookie_object1, cookie_object2])
42
+ ```
43
+
44
+
45
+
46
+ ## add_init_script
47
+
48
+ ```
49
+ def add_init_script(path: nil, script: nil)
50
+ ```
51
+
52
+ Adds a script which would be evaluated in one of the following scenarios:
53
+ - Whenever a page is created in the browser context or is navigated.
54
+ - Whenever a child frame is attached or navigated in any page in the browser context. In this case, the script is
55
+ evaluated in the context of the newly attached frame.
56
+
57
+ The script is evaluated after the document was created but before any of its scripts were run. This is useful to amend
58
+ the JavaScript environment, e.g. to seed `Math.random`.
59
+
60
+ An example of overriding `Math.random` before the page loads:
61
+
62
+ ```ruby
63
+ # in your playwright script, assuming the preload.js file is in same directory.
64
+ browser_context.add_init_script(path: "preload.js")
65
+ ```
66
+
67
+ > NOTE: The order of evaluation of multiple scripts installed via [BrowserContext#add_init_script](./browser_context#add_init_script) and
68
+ [Page#add_init_script](./page#add_init_script) is not defined.
69
+
70
+ ## browser
71
+
72
+ ```
73
+ def browser
74
+ ```
75
+
76
+ Returns the browser instance of the context. If it was launched as a persistent context null gets returned.
77
+
78
+ ## clear_cookies
79
+
80
+ ```
81
+ def clear_cookies
82
+ ```
83
+
84
+ Clears context cookies.
85
+
86
+ ## clear_permissions
87
+
88
+ ```
89
+ def clear_permissions
90
+ ```
91
+
92
+ Clears all permission overrides for the browser context.
93
+
94
+ ```ruby
95
+ context = browser.new_context
96
+ context.grant_permissions(["clipboard-read"])
97
+
98
+ # do stuff ..
99
+
100
+ context.clear_permissions
101
+ ```
102
+
103
+
104
+
105
+ ## close
106
+
107
+ ```
108
+ def close
109
+ ```
110
+
111
+ Closes the browser context. All the pages that belong to the browser context will be closed.
112
+
113
+ > NOTE: The default browser context cannot be closed.
114
+
115
+ ## cookies
116
+
117
+ ```
118
+ def cookies(urls: nil)
119
+ ```
120
+
121
+ If no URLs are specified, this method returns all cookies. If URLs are specified, only cookies that affect those URLs
122
+ are returned.
123
+
124
+ ## expose_binding
125
+
126
+ ```
127
+ def expose_binding(name, callback, handle: nil)
128
+ ```
129
+
130
+ The method adds a function called `name` on the `window` object of every frame in every page in the context. When
131
+ called, the function executes `callback` and returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) which resolves to the return value of `callback`. If
132
+ the `callback` returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), it will be awaited.
133
+
134
+ The first argument of the `callback` function contains information about the caller: `{ browserContext: BrowserContext,
135
+ page: Page, frame: Frame }`.
136
+
137
+ See [Page#expose_binding](./page#expose_binding) for page-only version.
138
+
139
+ An example of exposing page URL to all frames in all pages in the context:
140
+
141
+ ```ruby
142
+ browser_context.expose_binding("pageURL", ->(source) { source[:page].url })
143
+ page = browser_context.new_page
144
+
145
+ page.content = <<~HTML
146
+ <script>
147
+ async function onClick() {
148
+ document.querySelector('div').textContent = await window.pageURL();
149
+ }
150
+ </script>
151
+ <button onclick="onClick()">Click me</button>
152
+ <div></div>
153
+ HTML
154
+
155
+ page.click("button")
156
+ ```
157
+
158
+ An example of passing an element handle:
159
+
160
+ ```ruby
161
+ def print_text(source, element)
162
+ element.text_content
163
+ end
164
+
165
+ browser_context.expose_binding("clicked", method(:print_text), handle: true)
166
+ page = browser_context.new_page
167
+
168
+ page.content = <<~HTML
169
+ <script>
170
+ document.addEventListener('click', async (event) => {
171
+ alert(await window.clicked(event.target));
172
+ })
173
+ </script>
174
+ <div>Click me</div>
175
+ <div>Or click me</div>
176
+ HTML
177
+
178
+ page.click('div')
179
+ ```
180
+
181
+
182
+
183
+ ## expose_function
184
+
185
+ ```
186
+ def expose_function(name, callback)
187
+ ```
188
+
189
+ The method adds a function called `name` on the `window` object of every frame in every page in the context. When
190
+ called, the function executes `callback` and returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) which resolves to the return value of `callback`.
191
+
192
+ If the `callback` returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), it will be awaited.
193
+
194
+ See [Page#expose_function](./page#expose_function) for page-only version.
195
+
196
+ An example of adding an `sha256` function to all pages in the context:
197
+
198
+ ```ruby
199
+ require 'digest'
200
+
201
+ def sha256(text)
202
+ Digest::SHA256.hexdigest(text)
203
+ end
204
+
205
+ browser_context.expose_function("sha256", method(:sha256))
206
+ page = browser_context.new_page()
207
+ page.content = <<~HTML
208
+ <script>
209
+ async function onClick() {
210
+ document.querySelector('div').textContent = await window.sha256('PLAYWRIGHT');
211
+ }
212
+ </script>
213
+ <button onclick="onClick()">Click me</button>
214
+ <div></div>
215
+ HTML
216
+ page.click("button")
217
+ ```
218
+
219
+
220
+
221
+ ## grant_permissions
222
+
223
+ ```
224
+ def grant_permissions(permissions, origin: nil)
225
+ ```
226
+
227
+ Grants specified permissions to the browser context. Only grants corresponding permissions to the given origin if
228
+ specified.
229
+
230
+ ## new_page
231
+
232
+ ```
233
+ def new_page
234
+ ```
235
+
236
+ Creates a new page in the browser context.
237
+
238
+ ## pages
239
+
240
+ ```
241
+ def pages
242
+ ```
243
+
244
+ Returns all open pages in the context.
245
+
246
+ ## route
247
+
248
+ ```
249
+ def route(url, handler)
250
+ ```
251
+
252
+ Routing provides the capability to modify network requests that are made by any page in the browser context. Once route
253
+ is enabled, every request matching the url pattern will stall unless it's continued, fulfilled or aborted.
254
+
255
+ An example of a naive handler that aborts all image requests:
256
+
257
+ ```ruby
258
+ context = browser.new_context
259
+ page = context.new_page
260
+ context.route("**/*.{png,jpg,jpeg}", ->(route, request) { route.abort })
261
+ page.goto("https://example.com")
262
+ ```
263
+
264
+ or the same snippet using a regex pattern instead:
265
+
266
+ ```ruby
267
+ context = browser.new_context
268
+ page = context.new_page
269
+ context.route(/\.(png|jpg)$/, ->(route, request) { route.abort })
270
+ page.goto("https://example.com")
271
+ ```
272
+
273
+ It is possible to examine the request to decide the route action. For example, mocking all requests that contain some
274
+ post data, and leaving all other requests as is:
275
+
276
+ ```ruby
277
+ def handle_route(route, request)
278
+ if request.post_data["my-string"]
279
+ mocked_data = request.post_data.merge({ "my-string" => 'mocked-data'})
280
+ route.fulfill(postData: mocked_data)
281
+ else
282
+ route.continue
283
+ end
284
+ end
285
+ context.route("/api/**", method(:handle_route))
286
+ ```
287
+
288
+ Page routes (set up with [Page#route](./page#route)) take precedence over browser context routes when request matches both
289
+ handlers.
290
+
291
+ To remove a route with its handler you can use [BrowserContext#unroute](./browser_context#unroute).
292
+
293
+ > NOTE: Enabling routing disables http cache.
294
+
295
+ ## set_default_navigation_timeout
296
+
297
+ ```
298
+ def set_default_navigation_timeout(timeout)
299
+ ```
300
+ alias: `default_navigation_timeout=`
301
+
302
+ This setting will change the default maximum navigation time for the following methods and related shortcuts:
303
+ - [Page#go_back](./page#go_back)
304
+ - [Page#go_forward](./page#go_forward)
305
+ - [Page#goto](./page#goto)
306
+ - [Page#reload](./page#reload)
307
+ - [Page#set_content](./page#set_content)
308
+ - [Page#expect_navigation](./page#expect_navigation)
309
+
310
+ > NOTE: [Page#set_default_navigation_timeout](./page#set_default_navigation_timeout) and [Page#set_default_timeout](./page#set_default_timeout) take priority over
311
+ [BrowserContext#set_default_navigation_timeout](./browser_context#set_default_navigation_timeout).
312
+
313
+ ## set_default_timeout
314
+
315
+ ```
316
+ def set_default_timeout(timeout)
317
+ ```
318
+ alias: `default_timeout=`
319
+
320
+ This setting will change the default maximum time for all the methods accepting `timeout` option.
321
+
322
+ > NOTE: [Page#set_default_navigation_timeout](./page#set_default_navigation_timeout), [Page#set_default_timeout](./page#set_default_timeout) and
323
+ [BrowserContext#set_default_navigation_timeout](./browser_context#set_default_navigation_timeout) take priority over [BrowserContext#set_default_timeout](./browser_context#set_default_timeout).
324
+
325
+ ## set_extra_http_headers
326
+
327
+ ```
328
+ def set_extra_http_headers(headers)
329
+ ```
330
+ alias: `extra_http_headers=`
331
+
332
+ The extra HTTP headers will be sent with every request initiated by any page in the context. These headers are merged
333
+ with page-specific extra HTTP headers set with [Page#set_extra_http_headers](./page#set_extra_http_headers). If page overrides a particular
334
+ header, page-specific header value will be used instead of the browser context header value.
335
+
336
+ > NOTE: [BrowserContext#set_extra_http_headers](./browser_context#set_extra_http_headers) does not guarantee the order of headers in the outgoing requests.
337
+
338
+ ## set_geolocation
339
+
340
+ ```
341
+ def set_geolocation(geolocation)
342
+ ```
343
+ alias: `geolocation=`
344
+
345
+ Sets the context's geolocation. Passing `null` or `undefined` emulates position unavailable.
346
+
347
+ ```ruby
348
+ browser_context.geolocation = { latitude: 59.95, longitude: 30.31667 }
349
+ ```
350
+
351
+ > NOTE: Consider using [BrowserContext#grant_permissions](./browser_context#grant_permissions) to grant permissions for the browser context pages to
352
+ read its geolocation.
353
+
354
+ ## set_offline
355
+
356
+ ```
357
+ def set_offline(offline)
358
+ ```
359
+ alias: `offline=`
360
+
361
+
362
+
363
+ ## unroute
364
+
365
+ ```
366
+ def unroute(url, handler: nil)
367
+ ```
368
+
369
+ Removes a route created with [BrowserContext#route](./browser_context#route). When `handler` is not specified, removes all routes for
370
+ the `url`.
371
+
372
+ ## expect_event
373
+
374
+ ```
375
+ def expect_event(event, predicate: nil, timeout: nil, &block)
376
+ ```
377
+
378
+ Waits for event to fire and passes its value into the predicate function. Returns when the predicate returns truthy
379
+ value. Will throw an error if the context closes before the event is fired. Returns the event data value.
380
+
381
+ ```ruby
382
+ new_page = browser_context.expect_event('page') do
383
+ page.click('button')
384
+ end
385
+ ```
386
+
387
+
388
+
389
+ ## expect_page
390
+
391
+ ```
392
+ def expect_page(predicate: nil, timeout: nil)
393
+ ```
394
+
395
+ Performs action and waits for a new [Page](./page) to be created in the context. If predicate is provided, it passes [Page](./page) value into the `predicate` and waits for `predicate.call(page)` to return a truthy value. Will throw an error if
396
+ the context closes before new [Page](./page) is created.
397
+
398
+ ## tracing