playwright-ruby-client 0.6.0 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) 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 +188 -0
  6. data/documentation/docs/api/browser_context.md +397 -0
  7. data/documentation/docs/api/browser_type.md +158 -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 +71 -0
  11. data/documentation/docs/api/element_handle.md +618 -0
  12. data/documentation/docs/api/experimental/_category_.yml +3 -0
  13. data/documentation/docs/api/experimental/android.md +26 -0
  14. data/documentation/docs/api/experimental/android_device.md +92 -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 +50 -0
  19. data/documentation/docs/api/frame.md +866 -0
  20. data/documentation/docs/api/js_handle.md +113 -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 +1402 -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 +79 -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 +47 -0
  31. data/documentation/docs/api/web_socket.md +7 -0
  32. data/documentation/docs/api/worker.md +24 -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 +205 -0
  39. data/documentation/docs/article/guides/recording_video.md +79 -0
  40. data/{docs → documentation/docs/include}/api_coverage.md +4 -3
  41. data/documentation/docusaurus.config.js +107 -0
  42. data/documentation/package.json +39 -0
  43. data/documentation/sidebars.js +15 -0
  44. data/documentation/src/components/HomepageFeatures.js +61 -0
  45. data/documentation/src/components/HomepageFeatures.module.css +13 -0
  46. data/documentation/src/css/custom.css +44 -0
  47. data/documentation/src/pages/index.js +50 -0
  48. data/documentation/src/pages/index.module.css +41 -0
  49. data/documentation/src/pages/markdown-page.md +7 -0
  50. data/documentation/static/.nojekyll +0 -0
  51. data/documentation/static/img/playwright-logo.svg +9 -0
  52. data/documentation/static/img/undraw_dropdown_menu.svg +1 -0
  53. data/documentation/static/img/undraw_web_development.svg +1 -0
  54. data/documentation/static/img/undraw_windows.svg +1 -0
  55. data/documentation/yarn.lock +8785 -0
  56. data/lib/playwright/channel_owners/binding_call.rb +33 -0
  57. data/lib/playwright/channel_owners/browser.rb +15 -27
  58. data/lib/playwright/channel_owners/browser_context.rb +15 -7
  59. data/lib/playwright/channel_owners/browser_type.rb +23 -8
  60. data/lib/playwright/channel_owners/element_handle.rb +2 -10
  61. data/lib/playwright/channel_owners/frame.rb +6 -28
  62. data/lib/playwright/channel_owners/js_handle.rb +2 -10
  63. data/lib/playwright/channel_owners/page.rb +18 -8
  64. data/lib/playwright/channel_owners/worker.rb +4 -0
  65. data/lib/playwright/input_files.rb +0 -8
  66. data/lib/playwright/javascript.rb +0 -10
  67. data/lib/playwright/javascript/expression.rb +2 -7
  68. data/lib/playwright/playwright_api.rb +16 -1
  69. data/lib/playwright/tracing_impl.rb +9 -9
  70. data/lib/playwright/version.rb +1 -1
  71. data/lib/playwright_api/accessibility.rb +7 -89
  72. data/lib/playwright_api/android.rb +10 -66
  73. data/lib/playwright_api/android_device.rb +10 -9
  74. data/lib/playwright_api/browser.rb +21 -172
  75. data/lib/playwright_api/browser_context.rb +54 -617
  76. data/lib/playwright_api/browser_type.rb +20 -108
  77. data/lib/playwright_api/cdp_session.rb +2 -25
  78. data/lib/playwright_api/console_message.rb +6 -6
  79. data/lib/playwright_api/dialog.rb +11 -92
  80. data/lib/playwright_api/element_handle.rb +60 -362
  81. data/lib/playwright_api/file_chooser.rb +0 -28
  82. data/lib/playwright_api/frame.rb +74 -713
  83. data/lib/playwright_api/js_handle.rb +16 -90
  84. data/lib/playwright_api/keyboard.rb +21 -213
  85. data/lib/playwright_api/mouse.rb +1 -45
  86. data/lib/playwright_api/page.rb +181 -1647
  87. data/lib/playwright_api/playwright.rb +14 -117
  88. data/lib/playwright_api/request.rb +15 -121
  89. data/lib/playwright_api/response.rb +7 -7
  90. data/lib/playwright_api/route.rb +8 -105
  91. data/lib/playwright_api/selectors.rb +6 -97
  92. data/lib/playwright_api/tracing.rb +7 -73
  93. data/lib/playwright_api/web_socket.rb +1 -1
  94. data/lib/playwright_api/worker.rb +28 -42
  95. metadata +57 -4
  96. data/lib/playwright/javascript/function.rb +0 -67
@@ -0,0 +1,8 @@
1
+ ---
2
+ sidebar_position: 10
3
+ ---
4
+
5
+ # Touchscreen
6
+
7
+ The Touchscreen class operates in main-frame CSS pixels relative to the top-left corner of the viewport. Methods on the
8
+ touchscreen can only be used in browser contexts that have been initialized with `hasTouch` set to true.
@@ -0,0 +1,47 @@
1
+ ---
2
+ sidebar_position: 10
3
+ ---
4
+
5
+ # Tracing
6
+
7
+ API for collecting and saving Playwright traces. Playwright traces can be opened using the Playwright CLI after
8
+ Playwright script runs.
9
+
10
+ Start with specifying the folder traces will be stored in:
11
+
12
+ ```python sync title=example_a767dfb400d98aef50f2767b94171d23474ea1ac1cf9b4d75d412936208e652d.py
13
+ browser = chromium.launch()
14
+ context = browser.new_context()
15
+ context.tracing.start(screenshots=True, snapshots=True)
16
+ page.goto("https://playwright.dev")
17
+ context.tracing.stop(path = "trace.zip")
18
+
19
+ ```
20
+
21
+
22
+
23
+ ## start
24
+
25
+ ```
26
+ def start(name: nil, screenshots: nil, snapshots: nil)
27
+ ```
28
+
29
+ Start tracing.
30
+
31
+ ```python sync title=example_e611abc8b1066118d0c87eae1bbbb08df655f36d50a94402fc56b8713150997b.py
32
+ context.tracing.start(name="trace", screenshots=True, snapshots=True)
33
+ page.goto("https://playwright.dev")
34
+ context.tracing.stop()
35
+ context.tracing.stop(path = "trace.zip")
36
+
37
+ ```
38
+
39
+
40
+
41
+ ## stop
42
+
43
+ ```
44
+ def stop(path: nil)
45
+ ```
46
+
47
+ Stop tracing.
@@ -0,0 +1,7 @@
1
+ ---
2
+ sidebar_position: 10
3
+ ---
4
+
5
+ # WebSocket
6
+
7
+ Not Implemented
@@ -0,0 +1,24 @@
1
+ ---
2
+ sidebar_position: 10
3
+ ---
4
+
5
+ # Worker
6
+
7
+ The Worker class represents a [WebWorker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API). `worker`
8
+ event is emitted on the page object to signal a worker creation. `close` event is emitted on the worker object when the
9
+ worker is gone.
10
+
11
+ ```py title=example_29716fdd4471a97923a64eebeee96330ab508226a496ae8fd13f12eb07d55ee6.py
12
+ def handle_worker(worker):
13
+ print("worker created: " + worker.url)
14
+ worker.on("close", lambda: print("worker destroyed: " + worker.url))
15
+
16
+ page.on('worker', handle_worker)
17
+
18
+ print("current workers:")
19
+ for worker in page.workers:
20
+ print(" " + worker.url)
21
+
22
+ ```
23
+
24
+
@@ -0,0 +1,11 @@
1
+ ---
2
+ position: 20
3
+ ---
4
+
5
+ # API Coverages
6
+
7
+ `playwright-ruby-client` doesn't cover all of the Playwright APIs. The APIs listed below without strikethrough are available in `playwright-ruby-client`.
8
+
9
+ import ApiCoverage from '../include/api_coverage.md'
10
+
11
+ <ApiCoverage />
@@ -0,0 +1,152 @@
1
+ ---
2
+ sidebar_position: 0
3
+ ---
4
+
5
+ # Getting started
6
+
7
+ `playwright-ruby-client` doesn't include Playwright driver nor its downloader. **We have to install Playwright in advance**
8
+
9
+ ```shell
10
+ $ npx playwright install
11
+ ```
12
+
13
+ and then set `playwright_cli_executable_path: "npx playwright"` into `Playwright.create`.
14
+
15
+ ## Enjoy with examples
16
+
17
+ ### Capture a site
18
+
19
+ Navigate pages with `page.goto(url)` and save the screenshot with `page.screenshot(path: './image.png')`.
20
+
21
+ ```rb {6-7}
22
+ require 'playwright'
23
+
24
+ Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright|
25
+ playwright.chromium.launch(headless: false) do |browser|
26
+ page = browser.new_page
27
+ page.goto('https://github.com/YusukeIwaki')
28
+ page.screenshot(path: './YusukeIwaki.png')
29
+ end
30
+ end
31
+ ```
32
+
33
+ ![image](https://user-images.githubusercontent.com/11763113/104339718-412f9180-553b-11eb-9116-908e1e4b5186.gif)
34
+
35
+ ### Simple scraping
36
+
37
+ Extract data from a site.
38
+
39
+ * Grab DOM elements with `page.query_selector(loc)` and `page.query_selector_all(loc)`
40
+ * Extract data with `elem.evaluate(js)` or `page.eval_on_selector(js)`
41
+ * Wait for navigation with `page.expect_navigation do ... end`
42
+
43
+ ```rb {12-14,17-21}
44
+ require 'playwright'
45
+
46
+ Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright|
47
+ playwright.chromium.launch(headless: false) do |browser|
48
+ page = browser.new_page
49
+ page.goto('https://github.com/')
50
+
51
+ form = page.query_selector("form.js-site-search-form")
52
+ search_input = form.query_selector("input.header-search-input")
53
+ search_input.click
54
+ page.keyboard.type("playwright")
55
+ page.expect_navigation {
56
+ page.keyboard.press("Enter")
57
+ }
58
+
59
+ list = page.query_selector("ul.repo-list")
60
+ items = list.query_selector_all("div.f4")
61
+ items.each do |item|
62
+ title = item.eval_on_selector("a", "a => a.innerText")
63
+ puts("==> #{title}")
64
+ end
65
+ end
66
+ end
67
+ ```
68
+
69
+ ```
70
+ $ bundle exec ruby main.rb
71
+ ==> microsoft/playwright
72
+ ==> microsoft/playwright-python
73
+ ==> microsoft/playwright-cli
74
+ ==> checkly/headless-recorder
75
+ ==> microsoft/playwright-sharp
76
+ ==> playwright-community/jest-playwright
77
+ ==> microsoft/playwright-test
78
+ ==> mxschmitt/playwright-go
79
+ ==> microsoft/playwright-java
80
+ ==> MarketSquare/robotframework-browser
81
+ ```
82
+
83
+ ### Android browser automation
84
+
85
+ As an experimental feature, we can automate Chrome for Android.
86
+
87
+ ```rb
88
+ require 'playwright'
89
+
90
+ Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright|
91
+ devices = playwright.android.devices
92
+ unless devices.empty?
93
+ device = devices.last
94
+ begin
95
+ puts "Model: #{device.model}"
96
+ puts "Serial: #{device.serial}"
97
+ puts device.shell('ls /system')
98
+
99
+ device.launch_browser do |context|
100
+ page = context.pages.first
101
+ page.goto('https://github.com/YusukeIwaki')
102
+ page.click('header button')
103
+ page.click('input[name="q"]')
104
+ page.keyboard.type('puppeteer')
105
+ page.expect_navigation {
106
+ page.keyboard.press('Enter')
107
+ }
108
+ page.screenshot(path: 'YusukeIwaki.android.png')
109
+ end
110
+ ensure
111
+ device.close
112
+ end
113
+ end
114
+ end
115
+ ```
116
+
117
+ ![image](https://user-images.githubusercontent.com/11763113/106615177-8467a800-65af-11eb-94d9-c56e71487e78.gif)
118
+
119
+ ### Android native automation
120
+
121
+ We have to download android-driver for Playwright in advance.
122
+
123
+ ```shell
124
+ $ wget https://github.com/microsoft/playwright/raw/master/bin/android-driver-target.apk -O /path/to/playwright-driver/package/bin/android-driver-target.apk
125
+ $ wget https://github.com/microsoft/playwright/raw/master/bin/android-driver.apk -O /path/to/playwright-driver/package/bin/android-driver.apk
126
+ ```
127
+
128
+ (If you downloaded Playwright via npm, replace /path/to/playwright-driver/package/ with ./node_modules/playwright/ above.)
129
+
130
+ ```rb
131
+ require 'playwright'
132
+
133
+ Playwright.create(playwright_cli_executable_path: ENV['PLAYWRIGHT_CLI_EXECUTABLE_PATH']) do |playwright|
134
+ devices = playwright.android.devices
135
+ unless devices.empty?
136
+ device = devices.last
137
+ begin
138
+ device.shell('input keyevent POWER')
139
+ device.shell('input keyevent POWER')
140
+ device.shell('input keyevent 82')
141
+ sleep 1
142
+ device.shell('cmd statusbar expand-notifications')
143
+
144
+ # pp device.tree
145
+ # pp device.info(res: 'com.android.systemui:id/clock')
146
+ device.tap_on(res: 'com.android.systemui:id/clock')
147
+ ensure
148
+ device.close
149
+ end
150
+ end
151
+ end
152
+ ```
@@ -0,0 +1,3 @@
1
+ label: Guides
2
+ position: 10
3
+ collapsed: false
@@ -0,0 +1,49 @@
1
+ ---
2
+ sidebar_position: 1
3
+ ---
4
+
5
+ # Download Playwright driver
6
+
7
+ `playwright-ruby-client` doesn't include Playwright driver nor its downloader. **We have to install Playwright in advance**, and set the proper CLI path like `Playwright.create(playwright_cli_executable_path: /path/to/playwright)`
8
+
9
+ Choose any of the three ways as you prefer to download the driver:
10
+
11
+ * `npx`: suitable for playground use, and not suitable for continuous usage.
12
+ * `npm install`: the best choice for most use cases, with existing Node.js environment.
13
+ * Direct download: maybe a good choice for Docker :whale: integration.
14
+
15
+ ## Using `npx`
16
+
17
+ ```shell
18
+ $ npx playwright install
19
+ ```
20
+
21
+ and then set `playwright_cli_executable_path: "npx playwright"` at `Playwright.create`.
22
+
23
+
24
+ ## Using `npm install`
25
+
26
+ Actually `npx playwright` is a bit slow. We can also use `npm install` to setup.
27
+
28
+ Instead of `npx playwright install`:
29
+
30
+ ```shell
31
+ $ export PLAYWRIGHT_CLI_VERSION=$(bundle exec ruby -e 'puts Playwright::COMPATIBLE_PLAYWRIGHT_VERSION.strip')
32
+ $ npm install playwright@$PLAYWRIGHT_CLI_VERSION || npm install playwright@next
33
+ $ ./node_modules/.bin/playwright install
34
+ ```
35
+
36
+ and then set `playwright_cli_executable_path: './node_modules/.bin/playwright'`
37
+
38
+
39
+ ## Directly download driver without Node.js installation.
40
+
41
+ Instead of npm, you can also directly download playwright driver from playwright.azureedge.net. (The URL can be easily detected from [here](https://github.com/microsoft/playwright-python/blob/cfc1030a69d1e934cac579687a680eac53d4b9ee/setup.py#L75))
42
+
43
+
44
+ ```shell
45
+ $ export PLAYWRIGHT_CLI_VERSION=$(bundle exec ruby -e 'puts Playwright::COMPATIBLE_PLAYWRIGHT_VERSION.strip')
46
+ $ wget https://playwright.azureedge.net/builds/driver/playwright-$PLAYWRIGHT_CLI_VERSION-linux.zip
47
+ ```
48
+
49
+ and then extract it, and set `playwright_cli_executable_path: '/path/to/playwright-1.11.0-linux/playwright.sh'`
@@ -0,0 +1,119 @@
1
+ ---
2
+ sidebar_position: 2
3
+ ---
4
+
5
+ # Launch Browser
6
+
7
+ ![image](https://user-images.githubusercontent.com/11763113/118982444-68e5a900-b9b6-11eb-92a8-3e8fcbe36186.png)
8
+
9
+ ## Create Playwright session
10
+
11
+ In oder to launch browser, it is required to create Playwright session.
12
+
13
+ In previous examples,
14
+
15
+ ```rb
16
+ Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright|
17
+ # Play with `playwright` here
18
+ end
19
+ ```
20
+
21
+ this is the exact procedure for creating Playwright session. Choose either of method for creating the session.
22
+
23
+ ### Define scoped Playwright session with block
24
+
25
+ ```rb
26
+ Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright|
27
+ # Play with `playwright` here
28
+ end
29
+ ```
30
+
31
+ As is described repetedly, this is the recommended way for creating Playwright session. Even when any exception happens, Playwright session is safely ended on leaving the block.
32
+
33
+ Internally `playwright run-driver` session is alive during the block.
34
+
35
+ ### Define start/end of the Playwright session separately without block.
36
+
37
+ Sometimes we have to define separated start/end definition. `playwright-ruby-client` also allows it.
38
+
39
+ ```rb
40
+ class SomeClass
41
+
42
+ def start_playwright
43
+ # Start Playwright driver (runs `playwright run-driver` internally)
44
+ @playwright_exec = Playwright.create(playwright_cli_executable_path: 'npx playwright')
45
+ end
46
+
47
+ def stop_playwright!
48
+ # Stop Playwright driver
49
+ @playwright_exec.stop
50
+ end
51
+
52
+ def play_with_playwright(&blk)
53
+ # Acquire Playwright instance with PlaywrightExecution#playwright
54
+ playwright = @playwright_exec.playwright
55
+
56
+ browser = playwright.chromium.launch
57
+
58
+ begin
59
+ blk.call(browser)
60
+ ensure
61
+ browser.close
62
+ end
63
+ end
64
+ end
65
+ ```
66
+
67
+ Note that we have to make sure to call `PlaywrightExecution#stop` (`stop_playwright!` in this case).
68
+
69
+ ## Create browser instance
70
+
71
+ Playwright allows launching several browsers.
72
+
73
+ * `playwright.chromium.launch` for launching Chrome, Microsoft Edge, Chromium
74
+ * `playwright.firefox.launch` for launching (modified version of) Firefox
75
+ * `playwright.webkit.launch` for launching (modified version of) WebKit/Safari
76
+
77
+ It is recommended in most cases to launch browser with block, which automatically closes the launched browser on end.
78
+
79
+ ```rb
80
+ # scoped browser block
81
+ playwright.chromium.launch do |browser|
82
+ # Play with `browser`
83
+ end
84
+ ```
85
+
86
+ Of course, you can manually call `Browser#close` when the browser is launched without block.
87
+
88
+ ```rb
89
+ # separated start/end
90
+ browser = playwright.chromium.launch
91
+
92
+ begin
93
+ # Play with `@browser`
94
+ ensure
95
+ browser.close
96
+ end
97
+ ```
98
+
99
+ ## Open new window and new tab
100
+
101
+ Use `Browser#new_context` to prepare a new browser window and use `BrowserContext#new_page` to create a new tab.
102
+ Also we can use `Browser#new_page` to create a new window and new tab at once.
103
+
104
+ ```rb
105
+ Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright|
106
+ playwright.chromium.launch(headless: false) do |browser| # Chromium task icon appers in.
107
+ context = browser.new_context # Prepare new window.
108
+ page = context.new_page # Open new window and new tab here. (about:blank)
109
+ page.goto('https://example.com') # Navigate to a site.
110
+
111
+ page2 = context.new_page # Open another tab here.
112
+ page2.goto('https://example.com') # Navigate to a site.
113
+
114
+ another_context = browser.new_context # Prepare another window here.
115
+ another_page = another_context.new_page # Open a new window and new tab.
116
+ another_page.goto('https://example.com/') # Navigate to a site.
117
+ end
118
+ end
119
+ ```
@@ -0,0 +1,205 @@
1
+ ---
2
+ sidebar_position: 3
3
+ ---
4
+
5
+ # Integration into Ruby on Rails application
6
+
7
+ `playwright-ruby-client` is a client library just for browser automation. `capybara-playwright-driver` provides the [Capybara](https://github.com/teamcapybara/capybara) driver based on playwright-ruby-client and makes it easy to integrate into Ruby on Rails applications.
8
+
9
+ ## Installation
10
+
11
+ Add the line below into Gemfile:
12
+
13
+ ```rb
14
+ gem 'capybara-playwright-driver'
15
+ ```
16
+
17
+ and then `bundle install`.
18
+
19
+ Note that capybara-playwright-driver does not depend on Selenium. But `selenium-webdriver` is also required [on Rails 5.x, 6.0](https://github.com/rails/rails/pull/39179)
20
+
21
+ ## Register and configure Capybara driver
22
+
23
+ ```rb
24
+ Capybara.register_driver(:playwright) do |app|
25
+ Capybara::Playwright::Driver.new(app,
26
+ browser_type: :chromium, # :chromium (default) or :firefox, :webkit
27
+ headless: false, # true for headless mode (default), false for headful mode.
28
+ )
29
+ end
30
+ ```
31
+
32
+ ### Update timeout
33
+
34
+ Capybara sets the default value of timeout to *2 seconds*. Generally it is too short to wait for HTTP responses.
35
+
36
+ It is recommended to set the timeout to 15-30 seconds for Playwright driver.
37
+
38
+ ```rb
39
+ Capybara.default_max_wait_time = 15
40
+ ```
41
+
42
+ ### (Optional) Update default driver
43
+
44
+ By default, Capybara driver is set to `:rack_test`, which works only with non-JS contents. If your Rails application has many JavaScript contents, it is recommended to change the default driver to `:playwrite`.
45
+
46
+ ```rb
47
+ Capybara.default_driver = :playwright
48
+ Capybara.javascript_driver = :playwright
49
+ ```
50
+
51
+ It is not mandatry. Without changing the default driver, you can still use Playwright driver by specifying `Capybara.current_driver = :playwright` (or `driven_by :playwright` in system spec) explicitly.
52
+
53
+ ### (reference) Available driver options
54
+
55
+ These parameters can be passed into `Capybara::Playwright::Driver.new`
56
+
57
+ * `playwright_cli_executable_path`
58
+ * Refer [this article](./download_playwright_driver) to understand what to specify.
59
+ * `browser_type`
60
+ * `:chromium` (default), `:firefox`, or `:webkit`
61
+ * Parameters for [Playwright::BrowserType#launch](/docs/api/browser_type#launch)
62
+ * args
63
+ * channel
64
+ * `chrome`, `msedge`, `chrome-beta`, `chrome-dev`, `chrome-canary`, `msedge-beta`, `msedge-dev` Browser distribution channel. Read more about using [Google Chrome & Microsoft Edge](https://playwright.dev/docs/browsers#google-chrome--microsoft-edge)
65
+ * devtools
66
+ * downloadsPath
67
+ * env
68
+ * executablePath
69
+ * firefoxUserPrefs
70
+ * headless
71
+ * ignoreDefaultArgs
72
+ * proxy
73
+ * slowMo
74
+ * timeout
75
+ * Parameters for [Playwright::Browser#new_context](/docs/api/browser#new_context)
76
+ * bypassCSP
77
+ * colorScheme
78
+ * deviceScaleFactor
79
+ * extraHTTPHeaders
80
+ * geolocation
81
+ * hasTouch
82
+ * httpCredentials
83
+ * ignoreHTTPSErrors
84
+ * isMobile
85
+ * javaScriptEnabled
86
+ * locale
87
+ * noViewport
88
+ * offline
89
+ * permissions
90
+ * proxy
91
+ * record_har_omit_content
92
+ * record_har_path
93
+ * record_video_dir
94
+ * record_video_size
95
+ * screen
96
+ * storageState
97
+ * timezoneId
98
+ * userAgent
99
+ * viewport
100
+
101
+ ```ruby
102
+ driver_opts = {
103
+ # `playwright` command path.
104
+ playwright_cli_executable_path: './node_modules/.bin/playwright',
105
+
106
+ # Use firefox for testing.
107
+ browser_type: :firefox,
108
+
109
+ # Headful mode.
110
+ headless: false,
111
+
112
+ # Slower operation
113
+ slowMo: 50, # integer. (50-100 would be good for most cases)
114
+ }
115
+
116
+ Capybara::Playwright::Driver.new(app, driver_opts)
117
+ ```
118
+
119
+
120
+ ## Available functions and Limitations
121
+
122
+ ### Capybara DSL
123
+
124
+ Most of the methods of `Capybara::Session` and `Capybara::Node::Element` are available. However the following method is not yet implemented.
125
+
126
+ * `Capybara::Node::Element#drop`
127
+
128
+ ### Playwright-native scripting
129
+
130
+ We can also describe Playwright-native automation script using `with_playwright_page` and `with_playwright_element_handle`.
131
+
132
+ ```ruby
133
+ # With Capybara DSL
134
+ find('a[data-item-type="global_search"]').click
135
+
136
+ # With Playwright-native Page
137
+ Capybara.current_session.driver.with_playwright_page do |page|
138
+ # `page` is an instance of Playwright::Page.
139
+ page.click('a[data-item-type="global_search"]')
140
+ end
141
+ ```
142
+
143
+ ```ruby
144
+ all('.list-item').each do |li|
145
+ # With Capybara::Node::Element method
146
+ puts li.all('a').first.text
147
+
148
+ # With Playwright-native ElementHandle
149
+ puts li.with_playwright_element_handle do |handle|
150
+ # `handle` is an instance of Playwright::ElementHandle
151
+ handle.query_selector('a').text_content
152
+ end
153
+ end
154
+ ```
155
+
156
+ Generally, Capybara DSL seems simple, but Playwright-native scripting are more precise and efficient. Also `waitForNavigation`, `waitForSelector`, and many other Playwright functions are available with Playwright-native scripting.
157
+
158
+ ### Screen recording
159
+
160
+ NO NEED to keep sitting in front of screen during test. Just record what happened with video.
161
+
162
+ For example, we can store the video for [Allure report](https://github.com/allure-framework/allure-ruby) as below:
163
+
164
+ ```ruby
165
+ before do |example|
166
+ Capybara.current_session.driver.on_save_screenrecord do |video_path|
167
+ Allure.add_attachment(
168
+ name: "screenrecord - #{example.description}",
169
+ source: File.read(video_path),
170
+ type: Allure::ContentType::WEBM,
171
+ test_case: true,
172
+ )
173
+ end
174
+ end
175
+ ```
176
+
177
+ ![sceenrecord](https://user-images.githubusercontent.com/11763113/121126629-71b5f600-c863-11eb-8f88-7924ab669946.gif)
178
+
179
+ For more details, refer [Recording video](./recording_video.md#using-screen-recording-from-capybara-driver)
180
+
181
+
182
+ ### Screenshot just before teardown
183
+
184
+ In addition to `Capybara::Session#save_screenshot`, capybara-playwright-driver have another method for storing last screen state just before teardown.
185
+
186
+ For example, we can attach the screenshot for [Allure report](https://github.com/allure-framework/allure-ruby) as below:
187
+
188
+ ```ruby
189
+ before do |example|
190
+ Capybara.current_session.driver.on_save_raw_screenshot_before_reset do |raw_screenshot|
191
+ Allure.add_attachment(
192
+ name: "screenshot - #{example.description}",
193
+ source: raw_screenshot,
194
+ type: Allure::ContentType::PNG,
195
+ test_case: true,
196
+ )
197
+ end
198
+ end
199
+ ```
200
+
201
+ ### Limitations
202
+
203
+ * Playwright doesn't allow clicking invisible DOM elements or moving elements. `click` sometimes doesn't work as Selenium does. See the detail in https://playwright.dev/docs/actionability/
204
+ * `current_window.maximize` and `current_window.fullscreen` work only on headful (non-headless) mode, as selenium driver does.
205
+ * `Capybara::Node::Element#drag_to` does not accept `html5` parameter.