playwright-ruby-client 0.0.3 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +119 -12
- data/docs/api_coverage.md +354 -0
- data/lib/playwright.rb +8 -0
- data/lib/playwright/channel_owner.rb +16 -2
- data/lib/playwright/channel_owners/android.rb +10 -1
- data/lib/playwright/channel_owners/android_device.rb +163 -0
- data/lib/playwright/channel_owners/browser.rb +22 -29
- data/lib/playwright/channel_owners/browser_context.rb +43 -0
- data/lib/playwright/channel_owners/console_message.rb +21 -0
- data/lib/playwright/channel_owners/element_handle.rb +314 -0
- data/lib/playwright/channel_owners/frame.rb +466 -7
- data/lib/playwright/channel_owners/js_handle.rb +55 -0
- data/lib/playwright/channel_owners/page.rb +353 -5
- data/lib/playwright/channel_owners/request.rb +90 -0
- data/lib/playwright/channel_owners/webkit_browser.rb +1 -1
- data/lib/playwright/connection.rb +15 -14
- data/lib/playwright/errors.rb +1 -1
- data/lib/playwright/event_emitter.rb +13 -0
- data/lib/playwright/input_files.rb +42 -0
- data/lib/playwright/input_type.rb +19 -0
- data/lib/playwright/input_types/android_input.rb +19 -0
- data/lib/playwright/input_types/keyboard.rb +32 -0
- data/lib/playwright/input_types/mouse.rb +4 -0
- data/lib/playwright/input_types/touchscreen.rb +4 -0
- data/lib/playwright/javascript.rb +13 -0
- data/lib/playwright/javascript/expression.rb +67 -0
- data/lib/playwright/javascript/function.rb +67 -0
- data/lib/playwright/javascript/value_parser.rb +75 -0
- data/lib/playwright/javascript/value_serializer.rb +54 -0
- data/lib/playwright/playwright_api.rb +45 -25
- data/lib/playwright/select_option_values.rb +32 -0
- data/lib/playwright/timeout_settings.rb +19 -0
- data/lib/playwright/url_matcher.rb +19 -0
- data/lib/playwright/utils.rb +37 -0
- data/lib/playwright/version.rb +1 -1
- data/lib/playwright/wait_helper.rb +73 -0
- data/lib/playwright_api/accessibility.rb +60 -6
- data/lib/playwright_api/android.rb +33 -0
- data/lib/playwright_api/android_device.rb +78 -0
- data/lib/playwright_api/android_input.rb +25 -0
- data/lib/playwright_api/binding_call.rb +18 -0
- data/lib/playwright_api/browser.rb +136 -44
- data/lib/playwright_api/browser_context.rb +378 -51
- data/lib/playwright_api/browser_type.rb +137 -55
- data/lib/playwright_api/cdp_session.rb +32 -7
- data/lib/playwright_api/chromium_browser_context.rb +31 -0
- data/lib/playwright_api/console_message.rb +27 -7
- data/lib/playwright_api/dialog.rb +47 -3
- data/lib/playwright_api/download.rb +29 -5
- data/lib/playwright_api/element_handle.rb +429 -143
- data/lib/playwright_api/file_chooser.rb +13 -2
- data/lib/playwright_api/frame.rb +633 -179
- data/lib/playwright_api/js_handle.rb +97 -17
- data/lib/playwright_api/keyboard.rb +152 -24
- data/lib/playwright_api/mouse.rb +28 -3
- data/lib/playwright_api/page.rb +1183 -317
- data/lib/playwright_api/playwright.rb +174 -13
- data/lib/playwright_api/request.rb +115 -30
- data/lib/playwright_api/response.rb +22 -3
- data/lib/playwright_api/route.rb +63 -4
- data/lib/playwright_api/selectors.rb +29 -7
- data/lib/playwright_api/touchscreen.rb +2 -1
- data/lib/playwright_api/video.rb +11 -1
- data/lib/playwright_api/web_socket.rb +5 -5
- data/lib/playwright_api/worker.rb +29 -5
- data/playwright.gemspec +3 -0
- metadata +68 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04f50e523a846e243058cbb53a44e0f4a6ecce32aa843a02ace9b855b2264862
|
4
|
+
data.tar.gz: a8c99b7550206d0ff90ad033e0391a9224f780ae1e009a8cab48441070adabaa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5e089555dc0d1ee2a86980d14d8310e338fa1d23b529a3d711895532dba64101300a198ed55b80f90342116b86baae8937c7526f992bc7ea9816297e385c436
|
7
|
+
data.tar.gz: d1da5e4e141043a37f3eccdd300865437264c795e343fa5652534d2fa04168d6f1326f7311c1f8c0212c98fd0d365b5b8f684b18b4b615b8825d5d65fa185562
|
data/README.md
CHANGED
@@ -4,24 +4,27 @@
|
|
4
4
|
|
5
5
|
A Ruby client for Playwright driver.
|
6
6
|
|
7
|
-
|
7
|
+
Note: Currently, this Gem is just a PoC (Proof of Concept). If you want to develop browser-automation for Chrome with Ruby, consider using [puppeteer-ruby](https://github.com/YusukeIwaki/puppeteer-ruby). The list of the available APIs of playwright-ruby-client is [here](./docs/api_coverage.md)
|
8
8
|
|
9
|
-
|
9
|
+
## Getting Started
|
10
10
|
|
11
|
-
|
11
|
+
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**.
|
12
12
|
|
13
|
-
|
13
|
+
```sh
|
14
|
+
npm install playwright
|
15
|
+
./node_modules/.bin/playwright install
|
16
|
+
```
|
14
17
|
|
15
|
-
|
18
|
+
and then, set `playwright_cli_executable_path: ./node_modules/.bin/playwright` at `Playwright.create`.
|
16
19
|
|
17
|
-
|
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)
|
18
21
|
|
19
22
|
### Capture a site
|
20
23
|
|
21
24
|
```ruby
|
22
25
|
require 'playwright'
|
23
26
|
|
24
|
-
Playwright.create(playwright_cli_executable_path: '/path/to/playwright
|
27
|
+
Playwright.create(playwright_cli_executable_path: '/path/to/playwright') do |playwright|
|
25
28
|
playwright.chromium.launch(headless: false) do |browser|
|
26
29
|
page = browser.new_page
|
27
30
|
page.goto('https://github.com/YusukeIwaki')
|
@@ -30,15 +33,119 @@ Playwright.create(playwright_cli_executable_path: '/path/to/playwright-cli') do
|
|
30
33
|
end
|
31
34
|
```
|
32
35
|
|
33
|
-
|
36
|
+
![image](https://user-images.githubusercontent.com/11763113/104339718-412f9180-553b-11eb-9116-908e1e4b5186.gif)
|
37
|
+
|
38
|
+
### Simple scraping
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
require 'playwright'
|
42
|
+
|
43
|
+
Playwright.create(playwright_cli_executable_path: './node_modules/.bin/playwright') do |playwright|
|
44
|
+
playwright.chromium.launch(headless: false) do |browser|
|
45
|
+
page = browser.new_page
|
46
|
+
page.goto('https://github.com/')
|
47
|
+
|
48
|
+
form = page.query_selector("form.js-site-search-form")
|
49
|
+
search_input = form.query_selector("input.header-search-input")
|
50
|
+
search_input.click
|
51
|
+
page.keyboard.type("playwright")
|
52
|
+
page.expect_navigation {
|
53
|
+
page.keyboard.press("Enter")
|
54
|
+
}
|
55
|
+
|
56
|
+
list = page.query_selector("ul.repo-list")
|
57
|
+
items = list.query_selector_all("div.f4")
|
58
|
+
items.each do |item|
|
59
|
+
title = item.eval_on_selector("a", "a => a.innerText")
|
60
|
+
puts("==> #{title}")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
```
|
65
|
+
|
66
|
+
```sh
|
67
|
+
$ bundle exec ruby main.rb
|
68
|
+
==> microsoft/playwright
|
69
|
+
==> microsoft/playwright-python
|
70
|
+
==> microsoft/playwright-cli
|
71
|
+
==> checkly/headless-recorder
|
72
|
+
==> microsoft/playwright-sharp
|
73
|
+
==> playwright-community/jest-playwright
|
74
|
+
==> microsoft/playwright-test
|
75
|
+
==> mxschmitt/playwright-go
|
76
|
+
==> microsoft/playwright-java
|
77
|
+
==> MarketSquare/robotframework-browser
|
78
|
+
```
|
79
|
+
|
80
|
+
### Android browser automation
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
require 'playwright'
|
84
|
+
|
85
|
+
Playwright.create(playwright_cli_executable_path: './node_modules/.bin/playwright') do |playwright|
|
86
|
+
devices = playwright.android.devices
|
87
|
+
unless devices.empty?
|
88
|
+
device = devices.last
|
89
|
+
begin
|
90
|
+
puts "Model: #{device.model}"
|
91
|
+
puts "Serial: #{device.serial}"
|
92
|
+
puts device.shell('ls /system')
|
93
|
+
|
94
|
+
device.launch_browser do |context|
|
95
|
+
page = context.pages.first
|
96
|
+
page.goto('https://github.com/YusukeIwaki')
|
97
|
+
page.click('header button')
|
98
|
+
page.click('input[name="q"]')
|
99
|
+
page.keyboard.type('puppeteer')
|
100
|
+
page.expect_navigation {
|
101
|
+
page.keyboard.press('Enter')
|
102
|
+
}
|
103
|
+
page.screenshot(path: 'YusukeIwaki.android.png')
|
104
|
+
end
|
105
|
+
ensure
|
106
|
+
device.close
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
```
|
111
|
+
|
112
|
+
![android-browser](https://user-images.githubusercontent.com/11763113/106615177-8467a800-65af-11eb-94d9-c56e71487e78.gif)
|
34
113
|
|
35
|
-
|
114
|
+
### Android native automation
|
36
115
|
|
37
|
-
|
116
|
+
We have to download android-driver for Playwright in advance.
|
38
117
|
|
39
|
-
|
118
|
+
```
|
119
|
+
wget https://github.com/microsoft/playwright/raw/master/bin/android-driver-target.apk -O /path/to/playwright-driver/package/bin/android-driver-target.apk
|
120
|
+
wget https://github.com/microsoft/playwright/raw/master/bin/android-driver.apk -O /path/to/playwright-driver/package/bin/android-driver.apk
|
121
|
+
```
|
40
122
|
|
41
|
-
|
123
|
+
(If you downloaded Playwright via npm, replace `/path/to/playwright-driver/package/` with `./node_modules/playwright/` above.)
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
require 'playwright'
|
127
|
+
|
128
|
+
Playwright.create(playwright_cli_executable_path: ENV['PLAYWRIGHT_CLI_EXECUTABLE_PATH']) do |playwright|
|
129
|
+
devices = playwright.android.devices
|
130
|
+
unless devices.empty?
|
131
|
+
device = devices.last
|
132
|
+
begin
|
133
|
+
device.shell('input keyevent POWER')
|
134
|
+
device.shell('input keyevent POWER')
|
135
|
+
device.shell('input keyevent 82')
|
136
|
+
sleep 1
|
137
|
+
device.shell('cmd statusbar expand-notifications')
|
138
|
+
|
139
|
+
# pp device.tree
|
140
|
+
# pp device.info(res: 'com.android.systemui:id/clock')
|
141
|
+
device.tap_on(res: 'com.android.systemui:id/clock')
|
142
|
+
ensure
|
143
|
+
device.close
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
```
|
42
149
|
|
43
150
|
## License
|
44
151
|
|
@@ -0,0 +1,354 @@
|
|
1
|
+
# API coverages
|
2
|
+
|
3
|
+
## Request
|
4
|
+
|
5
|
+
* failure
|
6
|
+
* frame
|
7
|
+
* headers
|
8
|
+
* navigation_request?
|
9
|
+
* method
|
10
|
+
* post_data
|
11
|
+
* post_data_buffer
|
12
|
+
* post_data_json
|
13
|
+
* redirected_from
|
14
|
+
* redirected_to
|
15
|
+
* resource_type
|
16
|
+
* response
|
17
|
+
* timing
|
18
|
+
* url
|
19
|
+
|
20
|
+
## Response
|
21
|
+
|
22
|
+
* ~~body~~
|
23
|
+
* ~~finished~~
|
24
|
+
* ~~frame~~
|
25
|
+
* ~~headers~~
|
26
|
+
* ~~json~~
|
27
|
+
* ~~ok~~
|
28
|
+
* ~~request~~
|
29
|
+
* ~~status~~
|
30
|
+
* ~~status_text~~
|
31
|
+
* ~~text~~
|
32
|
+
* ~~url~~
|
33
|
+
|
34
|
+
## ~~Route~~
|
35
|
+
|
36
|
+
* ~~abort~~
|
37
|
+
* ~~continue_~~
|
38
|
+
* ~~fulfill~~
|
39
|
+
* ~~request~~
|
40
|
+
|
41
|
+
## ~~WebSocket~~
|
42
|
+
|
43
|
+
* ~~closed?~~
|
44
|
+
* ~~url~~
|
45
|
+
* ~~expect_event~~
|
46
|
+
|
47
|
+
## Keyboard
|
48
|
+
|
49
|
+
* down
|
50
|
+
* insert_text
|
51
|
+
* press
|
52
|
+
* type
|
53
|
+
* up
|
54
|
+
|
55
|
+
## Mouse
|
56
|
+
|
57
|
+
* ~~click~~
|
58
|
+
* ~~dblclick~~
|
59
|
+
* ~~down~~
|
60
|
+
* ~~move~~
|
61
|
+
* ~~up~~
|
62
|
+
|
63
|
+
## Touchscreen
|
64
|
+
|
65
|
+
* ~~tap_point~~
|
66
|
+
|
67
|
+
## JSHandle
|
68
|
+
|
69
|
+
* as_element
|
70
|
+
* dispose
|
71
|
+
* evaluate
|
72
|
+
* evaluate_handle
|
73
|
+
* get_properties
|
74
|
+
* get_property
|
75
|
+
* json_value
|
76
|
+
|
77
|
+
## ElementHandle
|
78
|
+
|
79
|
+
* query_selector
|
80
|
+
* query_selector_all
|
81
|
+
* eval_on_selector
|
82
|
+
* eval_on_selector_all
|
83
|
+
* bounding_box
|
84
|
+
* check
|
85
|
+
* click
|
86
|
+
* content_frame
|
87
|
+
* dblclick
|
88
|
+
* dispatch_event
|
89
|
+
* fill
|
90
|
+
* focus
|
91
|
+
* get_attribute
|
92
|
+
* hover
|
93
|
+
* inner_html
|
94
|
+
* inner_text
|
95
|
+
* checked?
|
96
|
+
* disabled?
|
97
|
+
* editable?
|
98
|
+
* enabled?
|
99
|
+
* hidden?
|
100
|
+
* visible?
|
101
|
+
* owner_frame
|
102
|
+
* press
|
103
|
+
* screenshot
|
104
|
+
* scroll_into_view_if_needed
|
105
|
+
* select_option
|
106
|
+
* select_text
|
107
|
+
* set_input_files
|
108
|
+
* tap_point
|
109
|
+
* text_content
|
110
|
+
* type
|
111
|
+
* uncheck
|
112
|
+
* wait_for_element_state
|
113
|
+
* wait_for_selector
|
114
|
+
|
115
|
+
## ~~Accessibility~~
|
116
|
+
|
117
|
+
* ~~snapshot~~
|
118
|
+
|
119
|
+
## ~~FileChooser~~
|
120
|
+
|
121
|
+
* ~~element~~
|
122
|
+
* ~~multiple?~~
|
123
|
+
* ~~page~~
|
124
|
+
* ~~set_files~~
|
125
|
+
|
126
|
+
## Frame
|
127
|
+
|
128
|
+
* query_selector
|
129
|
+
* query_selector_all
|
130
|
+
* eval_on_selector
|
131
|
+
* eval_on_selector_all
|
132
|
+
* add_script_tag
|
133
|
+
* add_style_tag
|
134
|
+
* check
|
135
|
+
* child_frames
|
136
|
+
* click
|
137
|
+
* content
|
138
|
+
* dblclick
|
139
|
+
* dispatch_event
|
140
|
+
* evaluate
|
141
|
+
* evaluate_handle
|
142
|
+
* fill
|
143
|
+
* focus
|
144
|
+
* ~~frame_element~~
|
145
|
+
* get_attribute
|
146
|
+
* goto
|
147
|
+
* hover
|
148
|
+
* inner_html
|
149
|
+
* inner_text
|
150
|
+
* checked?
|
151
|
+
* detached?
|
152
|
+
* disabled?
|
153
|
+
* editable?
|
154
|
+
* enabled?
|
155
|
+
* hidden?
|
156
|
+
* visible?
|
157
|
+
* name
|
158
|
+
* page
|
159
|
+
* parent_frame
|
160
|
+
* press
|
161
|
+
* select_option
|
162
|
+
* set_content
|
163
|
+
* set_input_files
|
164
|
+
* tap_point
|
165
|
+
* text_content
|
166
|
+
* title
|
167
|
+
* type
|
168
|
+
* uncheck
|
169
|
+
* url
|
170
|
+
* wait_for_function
|
171
|
+
* wait_for_load_state
|
172
|
+
* expect_navigation
|
173
|
+
* ~~wait_for_selector~~
|
174
|
+
* ~~wait_for_timeout~~
|
175
|
+
|
176
|
+
## ~~Worker~~
|
177
|
+
|
178
|
+
* ~~evaluate~~
|
179
|
+
* ~~evaluate_handle~~
|
180
|
+
* ~~url~~
|
181
|
+
|
182
|
+
## Selectors
|
183
|
+
|
184
|
+
* ~~register~~
|
185
|
+
|
186
|
+
## ConsoleMessage
|
187
|
+
|
188
|
+
* args
|
189
|
+
* location
|
190
|
+
* text
|
191
|
+
* type
|
192
|
+
|
193
|
+
## ~~Dialog~~
|
194
|
+
|
195
|
+
* ~~accept~~
|
196
|
+
* ~~default_value~~
|
197
|
+
* ~~dismiss~~
|
198
|
+
* ~~message~~
|
199
|
+
* ~~type~~
|
200
|
+
|
201
|
+
## ~~Download~~
|
202
|
+
|
203
|
+
* ~~create_read_stream~~
|
204
|
+
* ~~delete~~
|
205
|
+
* ~~failure~~
|
206
|
+
* ~~path~~
|
207
|
+
* ~~save_as~~
|
208
|
+
* ~~suggested_filename~~
|
209
|
+
* ~~url~~
|
210
|
+
|
211
|
+
## ~~Video~~
|
212
|
+
|
213
|
+
* ~~path~~
|
214
|
+
|
215
|
+
## Page
|
216
|
+
|
217
|
+
* query_selector
|
218
|
+
* query_selector_all
|
219
|
+
* eval_on_selector
|
220
|
+
* eval_on_selector_all
|
221
|
+
* ~~add_init_script~~
|
222
|
+
* add_script_tag
|
223
|
+
* add_style_tag
|
224
|
+
* ~~bring_to_front~~
|
225
|
+
* ~~check~~
|
226
|
+
* click
|
227
|
+
* close
|
228
|
+
* content
|
229
|
+
* context
|
230
|
+
* dblclick
|
231
|
+
* ~~dispatch_event~~
|
232
|
+
* ~~emulate_media~~
|
233
|
+
* evaluate
|
234
|
+
* evaluate_handle
|
235
|
+
* ~~expose_binding~~
|
236
|
+
* ~~expose_function~~
|
237
|
+
* fill
|
238
|
+
* focus
|
239
|
+
* frame
|
240
|
+
* frames
|
241
|
+
* ~~get_attribute~~
|
242
|
+
* ~~go_back~~
|
243
|
+
* ~~go_forward~~
|
244
|
+
* goto
|
245
|
+
* ~~hover~~
|
246
|
+
* ~~inner_html~~
|
247
|
+
* ~~inner_text~~
|
248
|
+
* ~~checked?~~
|
249
|
+
* closed?
|
250
|
+
* ~~disabled?~~
|
251
|
+
* ~~editable?~~
|
252
|
+
* ~~enabled?~~
|
253
|
+
* ~~hidden?~~
|
254
|
+
* ~~visible?~~
|
255
|
+
* main_frame
|
256
|
+
* opener
|
257
|
+
* ~~pdf~~
|
258
|
+
* press
|
259
|
+
* reload
|
260
|
+
* ~~route~~
|
261
|
+
* screenshot
|
262
|
+
* ~~select_option~~
|
263
|
+
* set_content
|
264
|
+
* set_default_navigation_timeout
|
265
|
+
* set_default_timeout
|
266
|
+
* ~~set_extra_http_headers~~
|
267
|
+
* ~~set_input_files~~
|
268
|
+
* set_viewport_size
|
269
|
+
* ~~tap_point~~
|
270
|
+
* ~~text_content~~
|
271
|
+
* title
|
272
|
+
* type
|
273
|
+
* ~~uncheck~~
|
274
|
+
* ~~unroute~~
|
275
|
+
* url
|
276
|
+
* ~~video~~
|
277
|
+
* viewport_size
|
278
|
+
* expect_event
|
279
|
+
* wait_for_function
|
280
|
+
* wait_for_load_state
|
281
|
+
* expect_navigation
|
282
|
+
* expect_request
|
283
|
+
* expect_response
|
284
|
+
* ~~wait_for_selector~~
|
285
|
+
* ~~wait_for_timeout~~
|
286
|
+
* ~~workers~~
|
287
|
+
* accessibility
|
288
|
+
* ~~coverage~~
|
289
|
+
* keyboard
|
290
|
+
* mouse
|
291
|
+
* touchscreen
|
292
|
+
|
293
|
+
## BrowserContext
|
294
|
+
|
295
|
+
* ~~add_cookies~~
|
296
|
+
* ~~add_init_script~~
|
297
|
+
* ~~browser~~
|
298
|
+
* ~~clear_cookies~~
|
299
|
+
* ~~clear_permissions~~
|
300
|
+
* close
|
301
|
+
* ~~cookies~~
|
302
|
+
* ~~expose_binding~~
|
303
|
+
* ~~expose_function~~
|
304
|
+
* ~~grant_permissions~~
|
305
|
+
* new_page
|
306
|
+
* pages
|
307
|
+
* ~~route~~
|
308
|
+
* ~~set_default_navigation_timeout~~
|
309
|
+
* ~~set_default_timeout~~
|
310
|
+
* ~~set_extra_http_headers~~
|
311
|
+
* ~~set_geolocation~~
|
312
|
+
* ~~set_http_credentials~~
|
313
|
+
* ~~set_offline~~
|
314
|
+
* ~~storage_state~~
|
315
|
+
* ~~unroute~~
|
316
|
+
* ~~expect_event~~
|
317
|
+
|
318
|
+
## ~~CDPSession~~
|
319
|
+
|
320
|
+
* ~~detach~~
|
321
|
+
* ~~send_message~~
|
322
|
+
|
323
|
+
## ChromiumBrowserContext
|
324
|
+
|
325
|
+
* ~~background_pages~~
|
326
|
+
* ~~new_cdp_session~~
|
327
|
+
* ~~service_workers~~
|
328
|
+
|
329
|
+
## Browser
|
330
|
+
|
331
|
+
* close
|
332
|
+
* contexts
|
333
|
+
* connected?
|
334
|
+
* new_context
|
335
|
+
* new_page
|
336
|
+
* version
|
337
|
+
|
338
|
+
## BrowserType
|
339
|
+
|
340
|
+
* ~~connect~~
|
341
|
+
* executable_path
|
342
|
+
* launch
|
343
|
+
* ~~launch_persistent_context~~
|
344
|
+
* ~~launch_server~~
|
345
|
+
* name
|
346
|
+
|
347
|
+
## Playwright
|
348
|
+
|
349
|
+
* chromium
|
350
|
+
* devices
|
351
|
+
* ~~errors~~
|
352
|
+
* firefox
|
353
|
+
* ~~selectors~~
|
354
|
+
* webkit
|