playwright-ruby-client 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/docs/api_coverage.md +10 -1
  4. data/lib/playwright/channel_owner.rb +3 -0
  5. data/lib/playwright/channel_owners/browser.rb +27 -2
  6. data/lib/playwright/channel_owners/browser_context.rb +52 -1
  7. data/lib/playwright/channel_owners/browser_type.rb +8 -1
  8. data/lib/playwright/channel_owners/element_handle.rb +15 -6
  9. data/lib/playwright/channel_owners/frame.rb +23 -6
  10. data/lib/playwright/channel_owners/page.rb +25 -44
  11. data/lib/playwright/download.rb +3 -2
  12. data/lib/playwright/events.rb +4 -0
  13. data/lib/playwright/playwright_api.rb +1 -5
  14. data/lib/playwright/tracing_impl.rb +31 -0
  15. data/lib/playwright/version.rb +2 -1
  16. data/lib/playwright_api/accessibility.rb +8 -7
  17. data/lib/playwright_api/android.rb +7 -7
  18. data/lib/playwright_api/android_device.rb +6 -6
  19. data/lib/playwright_api/browser.rb +49 -6
  20. data/lib/playwright_api/browser_context.rb +205 -9
  21. data/lib/playwright_api/browser_type.rb +48 -9
  22. data/lib/playwright_api/console_message.rb +8 -6
  23. data/lib/playwright_api/dialog.rb +29 -6
  24. data/lib/playwright_api/element_handle.rb +130 -26
  25. data/lib/playwright_api/file_chooser.rb +7 -0
  26. data/lib/playwright_api/frame.rb +200 -27
  27. data/lib/playwright_api/js_handle.rb +23 -6
  28. data/lib/playwright_api/keyboard.rb +48 -0
  29. data/lib/playwright_api/page.rb +514 -44
  30. data/lib/playwright_api/playwright.rb +24 -6
  31. data/lib/playwright_api/request.rb +34 -6
  32. data/lib/playwright_api/response.rb +8 -8
  33. data/lib/playwright_api/route.rb +28 -8
  34. data/lib/playwright_api/selectors.rb +31 -6
  35. data/lib/playwright_api/tracing.rb +99 -0
  36. data/lib/playwright_api/worker.rb +2 -2
  37. data/playwright.gemspec +2 -2
  38. metadata +6 -18
@@ -64,6 +64,24 @@ module Playwright
64
64
  # with sync_playwright() as playwright:
65
65
  # run(playwright)
66
66
  # ```
67
+ #
68
+ # ```csharp
69
+ # using Microsoft.Playwright;
70
+ # using System.Threading.Tasks;
71
+ #
72
+ # class PlaywrightExample
73
+ # {
74
+ # public static async Task Main()
75
+ # {
76
+ # using var playwright = await Playwright.CreateAsync();
77
+ # await using var browser = await playwright.Chromium.LaunchAsync();
78
+ # var page = await browser.NewPageAsync();
79
+ #
80
+ # await page.GotoAsync("https://www.microsoft.com");
81
+ # // other actions...
82
+ # }
83
+ # }
84
+ # ```
67
85
  class Playwright < PlaywrightApi
68
86
 
69
87
  # This object can be used to launch or connect to Chromium, returning instances of `Browser`.
@@ -178,20 +196,20 @@ module Playwright
178
196
 
179
197
  # -- inherited from EventEmitter --
180
198
  # @nodoc
181
- def once(event, callback)
182
- event_emitter_proxy.once(event, callback)
199
+ def off(event, callback)
200
+ event_emitter_proxy.off(event, callback)
183
201
  end
184
202
 
185
203
  # -- inherited from EventEmitter --
186
204
  # @nodoc
187
- def on(event, callback)
188
- event_emitter_proxy.on(event, callback)
205
+ def once(event, callback)
206
+ event_emitter_proxy.once(event, callback)
189
207
  end
190
208
 
191
209
  # -- inherited from EventEmitter --
192
210
  # @nodoc
193
- def off(event, callback)
194
- event_emitter_proxy.off(event, callback)
211
+ def on(event, callback)
212
+ event_emitter_proxy.on(event, callback)
195
213
  end
196
214
 
197
215
  private def event_emitter_proxy
@@ -34,6 +34,13 @@ module Playwright
34
34
  # ```py
35
35
  # page.on("requestfailed", lambda request: print(request.url + " " + request.failure))
36
36
  # ```
37
+ #
38
+ # ```csharp
39
+ # page.RequestFailed += (_, request) =>
40
+ # {
41
+ # Console.WriteLine(request.Failure);
42
+ # };
43
+ # ```
37
44
  def failure
38
45
  wrap_impl(@impl.failure)
39
46
  end
@@ -105,6 +112,11 @@ module Playwright
105
112
  # print(response.request.redirected_from.url) # "http://example.com"
106
113
  # ```
107
114
  #
115
+ # ```csharp
116
+ # var response = await page.GotoAsync("http://www.microsoft.com");
117
+ # Console.WriteLine(response.Request.RedirectedFrom?.Url); // http://www.microsoft.com
118
+ # ```
119
+ #
108
120
  # If the website `https://google.com` has no redirects:
109
121
  #
110
122
  #
@@ -127,6 +139,11 @@ module Playwright
127
139
  # response = page.goto("https://google.com")
128
140
  # print(response.request.redirected_from) # None
129
141
  # ```
142
+ #
143
+ # ```csharp
144
+ # var response = await page.GotoAsync("https://www.google.com");
145
+ # Console.WriteLine(response.Request.RedirectedFrom?.Url); // null
146
+ # ```
130
147
  def redirected_from
131
148
  wrap_impl(@impl.redirected_from)
132
149
  end
@@ -147,6 +164,10 @@ module Playwright
147
164
  # ```py
148
165
  # assert request.redirected_from.redirected_to == request
149
166
  # ```
167
+ #
168
+ # ```csharp
169
+ # Console.WriteLine(request.RedirectedFrom?.RedirectedTo == request); // True
170
+ # ```
150
171
  def redirected_to
151
172
  wrap_impl(@impl.redirected_to)
152
173
  end
@@ -197,6 +218,13 @@ module Playwright
197
218
  # request = request_info.value
198
219
  # print(request.timing)
199
220
  # ```
221
+ #
222
+ # ```csharp
223
+ # var waitForEventTask = page.WaitForEventAsync(PageEvent.RequestFinished);
224
+ # await page.GotoAsync("https://www.microsoft.com");
225
+ # var request = await waitForEventTask;
226
+ # Console.WriteLine(request.Timing.ResponseEnd);
227
+ # ```
200
228
  def timing
201
229
  wrap_impl(@impl.timing)
202
230
  end
@@ -208,20 +236,20 @@ module Playwright
208
236
 
209
237
  # -- inherited from EventEmitter --
210
238
  # @nodoc
211
- def once(event, callback)
212
- event_emitter_proxy.once(event, callback)
239
+ def off(event, callback)
240
+ event_emitter_proxy.off(event, callback)
213
241
  end
214
242
 
215
243
  # -- inherited from EventEmitter --
216
244
  # @nodoc
217
- def on(event, callback)
218
- event_emitter_proxy.on(event, callback)
245
+ def once(event, callback)
246
+ event_emitter_proxy.once(event, callback)
219
247
  end
220
248
 
221
249
  # -- inherited from EventEmitter --
222
250
  # @nodoc
223
- def off(event, callback)
224
- event_emitter_proxy.off(event, callback)
251
+ def on(event, callback)
252
+ event_emitter_proxy.on(event, callback)
225
253
  end
226
254
 
227
255
  private def event_emitter_proxy
@@ -59,14 +59,20 @@ module Playwright
59
59
  wrap_impl(@impl.url)
60
60
  end
61
61
 
62
+ # @nodoc
63
+ def after_initialize
64
+ wrap_impl(@impl.after_initialize)
65
+ end
66
+
62
67
  # @nodoc
63
68
  def ok?
64
69
  wrap_impl(@impl.ok?)
65
70
  end
66
71
 
72
+ # -- inherited from EventEmitter --
67
73
  # @nodoc
68
- def after_initialize
69
- wrap_impl(@impl.after_initialize)
74
+ def off(event, callback)
75
+ event_emitter_proxy.off(event, callback)
70
76
  end
71
77
 
72
78
  # -- inherited from EventEmitter --
@@ -81,12 +87,6 @@ module Playwright
81
87
  event_emitter_proxy.on(event, callback)
82
88
  end
83
89
 
84
- # -- inherited from EventEmitter --
85
- # @nodoc
86
- def off(event, callback)
87
- event_emitter_proxy.off(event, callback)
88
- end
89
-
90
90
  private def event_emitter_proxy
91
91
  @event_emitter_proxy ||= EventEmitterProxy.new(self, @impl)
92
92
  end
@@ -41,7 +41,7 @@ module Playwright
41
41
  # "foo": "bar" # set "foo" header
42
42
  # "origin": None # remove "origin" header
43
43
  # }
44
- # await route.continue(headers=headers)
44
+ # await route.continue_(headers=headers)
45
45
  # }
46
46
  # await page.route("**/*", handle)
47
47
  # ```
@@ -54,10 +54,19 @@ module Playwright
54
54
  # "foo": "bar" # set "foo" header
55
55
  # "origin": None # remove "origin" header
56
56
  # }
57
- # route.continue(headers=headers)
57
+ # route.continue_(headers=headers)
58
58
  # }
59
59
  # page.route("**/*", handle)
60
60
  # ```
61
+ #
62
+ # ```csharp
63
+ # await page.RouteAsync("**/*", route =>
64
+ # {
65
+ # var headers = new Dictionary<string, string>(route.Request.Headers) { { "foo", "bar" } };
66
+ # headers.Remove("origin");
67
+ # route.ContinueAsync(headers);
68
+ # });
69
+ # ```
61
70
  def continue(headers: nil, method: nil, postData: nil, url: nil)
62
71
  wrap_impl(@impl.continue(headers: unwrap_impl(headers), method: unwrap_impl(method), postData: unwrap_impl(postData), url: unwrap_impl(url)))
63
72
  end
@@ -100,6 +109,13 @@ module Playwright
100
109
  # body="not found!"))
101
110
  # ```
102
111
  #
112
+ # ```csharp
113
+ # await page.RouteAsync("**/*", route => route.FulfillAsync(
114
+ # status: 404,
115
+ # contentType: "text/plain",
116
+ # body: "Not Found!"));
117
+ # ```
118
+ #
103
119
  # An example of serving static file:
104
120
  #
105
121
  #
@@ -119,6 +135,10 @@ module Playwright
119
135
  # ```python sync
120
136
  # page.route("**/xhr_endpoint", lambda route: route.fulfill(path="mock_data.json"))
121
137
  # ```
138
+ #
139
+ # ```csharp
140
+ # await page.RouteAsync("**/xhr_endpoint", route => route.FulfillAsync(path: "mock_data.json"));
141
+ # ```
122
142
  def fulfill(
123
143
  body: nil,
124
144
  contentType: nil,
@@ -135,20 +155,20 @@ module Playwright
135
155
 
136
156
  # -- inherited from EventEmitter --
137
157
  # @nodoc
138
- def once(event, callback)
139
- event_emitter_proxy.once(event, callback)
158
+ def off(event, callback)
159
+ event_emitter_proxy.off(event, callback)
140
160
  end
141
161
 
142
162
  # -- inherited from EventEmitter --
143
163
  # @nodoc
144
- def on(event, callback)
145
- event_emitter_proxy.on(event, callback)
164
+ def once(event, callback)
165
+ event_emitter_proxy.once(event, callback)
146
166
  end
147
167
 
148
168
  # -- inherited from EventEmitter --
149
169
  # @nodoc
150
- def off(event, callback)
151
- event_emitter_proxy.off(event, callback)
170
+ def on(event, callback)
171
+ event_emitter_proxy.on(event, callback)
152
172
  end
153
173
 
154
174
  private def event_emitter_proxy
@@ -74,26 +74,51 @@ module Playwright
74
74
  # ```python sync
75
75
  # # FIXME: add snippet
76
76
  # ```
77
+ #
78
+ # ```csharp
79
+ # using var playwright = await Playwright.CreateAsync();
80
+ # // Script that evaluates to a selector engine instance.
81
+ # await playwright.Selectors.RegisterAsync("tag", @"{
82
+ # // Returns the first element matching given selector in the root's subtree.
83
+ # query(root, selector) {
84
+ # return root.querySelector(selector);
85
+ # },
86
+ # // Returns all elements matching given selector in the root's subtree.
87
+ # queryAll(root, selector) {
88
+ # return Array.from(root.querySelectorAll(selector));
89
+ # }
90
+ # }");
91
+ #
92
+ # await using var browser = await playwright.Chromium.LaunchAsync();
93
+ # var page = await browser.NewPageAsync();
94
+ # await page.SetContentAsync("<div><button>Click me</button></div>");
95
+ # // Use the selector prefixed with its name.
96
+ # var button = await page.QuerySelectorAsync("tag=button");
97
+ # // Combine it with other selector engines.
98
+ # await page.ClickAsync("tag=div >> text=\"Click me\"");
99
+ # // Can use it in any methods supporting selectors.
100
+ # int buttonCount = await page.EvalOnSelectorAllAsync<int>("tag=button", "buttons => buttons.length");
101
+ # ```
77
102
  def register(name, contentScript: nil, path: nil, script: nil)
78
103
  wrap_impl(@impl.register(unwrap_impl(name), contentScript: unwrap_impl(contentScript), path: unwrap_impl(path), script: unwrap_impl(script)))
79
104
  end
80
105
 
81
106
  # -- inherited from EventEmitter --
82
107
  # @nodoc
83
- def once(event, callback)
84
- event_emitter_proxy.once(event, callback)
108
+ def off(event, callback)
109
+ event_emitter_proxy.off(event, callback)
85
110
  end
86
111
 
87
112
  # -- inherited from EventEmitter --
88
113
  # @nodoc
89
- def on(event, callback)
90
- event_emitter_proxy.on(event, callback)
114
+ def once(event, callback)
115
+ event_emitter_proxy.once(event, callback)
91
116
  end
92
117
 
93
118
  # -- inherited from EventEmitter --
94
119
  # @nodoc
95
- def off(event, callback)
96
- event_emitter_proxy.off(event, callback)
120
+ def on(event, callback)
121
+ event_emitter_proxy.on(event, callback)
97
122
  end
98
123
 
99
124
  private def event_emitter_proxy
@@ -0,0 +1,99 @@
1
+ module Playwright
2
+ # API for collecting and saving Playwright traces. Playwright traces can be opened using the Playwright CLI after
3
+ # Playwright script runs.
4
+ #
5
+ # Start with specifying the folder traces will be stored in:
6
+ #
7
+ #
8
+ # ```js
9
+ # const browser = await chromium.launch({ traceDir: 'traces' });
10
+ # const context = await browser.newContext();
11
+ # await context.tracing.start({ name: 'trace', screenshots: true, snapshots: true });
12
+ # const page = await context.newPage();
13
+ # await page.goto('https://playwright.dev');
14
+ # await context.tracing.stop();
15
+ # await context.tracing.export('trace.zip');
16
+ # ```
17
+ #
18
+ # ```java
19
+ # Browser browser = chromium.launch(new BrowserType.LaunchOptions().setTraceDir("trace"));
20
+ # BrowserContext context = browser.newContext();
21
+ # context.tracing.start(page, new Tracing.StartOptions()
22
+ # .setName("trace")
23
+ # .setScreenshots(true)
24
+ # .setSnapshots(true);
25
+ # Page page = context.newPage();
26
+ # page.goto("https://playwright.dev");
27
+ # context.tracing.stop();
28
+ # context.tracing.export(Paths.get("trace.zip")))
29
+ # ```
30
+ #
31
+ # ```python async
32
+ # browser = await chromium.launch(traceDir='traces')
33
+ # context = await browser.new_context()
34
+ # await context.tracing.start(name="trace", screenshots=True, snapshots=True)
35
+ # await page.goto("https://playwright.dev")
36
+ # await context.tracing.stop()
37
+ # await context.tracing.export("trace.zip")
38
+ # ```
39
+ #
40
+ # ```python sync
41
+ # browser = chromium.launch(traceDir='traces')
42
+ # context = browser.new_context()
43
+ # context.tracing.start(name="trace", screenshots=True, snapshots=True)
44
+ # page.goto("https://playwright.dev")
45
+ # context.tracing.stop()
46
+ # context.tracing.export("trace.zip")
47
+ # ```
48
+ class Tracing < PlaywrightApi
49
+
50
+ # Export trace into the file with the given name. Should be called after the tracing has stopped.
51
+ def export(path)
52
+ wrap_impl(@impl.export(unwrap_impl(path)))
53
+ end
54
+
55
+ # Start tracing.
56
+ #
57
+ #
58
+ # ```js
59
+ # await context.tracing.start({ name: 'trace', screenshots: true, snapshots: true });
60
+ # const page = await context.newPage();
61
+ # await page.goto('https://playwright.dev');
62
+ # await context.tracing.stop();
63
+ # await context.tracing.export('trace.zip');
64
+ # ```
65
+ #
66
+ # ```java
67
+ # context.tracing.start(page, new Tracing.StartOptions()
68
+ # .setName("trace")
69
+ # .setScreenshots(true)
70
+ # .setSnapshots(true);
71
+ # Page page = context.newPage();
72
+ # page.goto('https://playwright.dev');
73
+ # context.tracing.stop();
74
+ # context.tracing.export(Paths.get("trace.zip")))
75
+ # ```
76
+ #
77
+ # ```python async
78
+ # await context.tracing.start(name="trace", screenshots=True, snapshots=True)
79
+ # await page.goto("https://playwright.dev")
80
+ # await context.tracing.stop()
81
+ # await context.tracing.export("trace.zip")
82
+ # ```
83
+ #
84
+ # ```python sync
85
+ # context.tracing.start(name="trace", screenshots=True, snapshots=True)
86
+ # page.goto("https://playwright.dev")
87
+ # context.tracing.stop()
88
+ # context.tracing.export("trace.zip")
89
+ # ```
90
+ def start(name: nil, screenshots: nil, snapshots: nil)
91
+ wrap_impl(@impl.start(name: unwrap_impl(name), screenshots: unwrap_impl(screenshots), snapshots: unwrap_impl(snapshots)))
92
+ end
93
+
94
+ # Stop tracing.
95
+ def stop
96
+ wrap_impl(@impl.stop)
97
+ end
98
+ end
99
+ end
@@ -38,14 +38,14 @@ module Playwright
38
38
  # ```
39
39
  #
40
40
  # ```csharp
41
- # Page.Worker += (_, worker) =>
41
+ # page.Worker += (_, worker) =>
42
42
  # {
43
43
  # Console.WriteLine($"Worker created: {worker.Url}");
44
44
  # worker.Close += (_, _) => Console.WriteLine($"Worker closed {worker.Url}");
45
45
  # };
46
46
  #
47
47
  # Console.WriteLine("Current Workers:");
48
- # foreach(var pageWorker in Page.Workers)
48
+ # foreach(var pageWorker in page.Workers)
49
49
  # {
50
50
  # Console.WriteLine($"\tWorker: {pageWorker.Url}");
51
51
  # }
data/playwright.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
  spec.authors = ['YusukeIwaki']
12
12
  spec.email = ['q7w8e9w8q7w8e9@yahoo.co.jp']
13
13
 
14
- spec.summary = 'The Ruby binding of playwright driver'
14
+ spec.summary = "The Ruby binding of playwright driver #{Playwright::COMPATIBLE_PLAYWRIGHT_VERSION}"
15
15
  spec.homepage = 'https://github.com/YusukeIwaki/playwright-ruby-client'
16
16
  spec.license = 'MIT'
17
17
 
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ['lib']
26
26
 
27
+ spec.required_ruby_version = '>= 2.4'
27
28
  spec.add_dependency 'concurrent-ruby', '>= 1.1.6'
28
29
  spec.add_dependency 'mime-types', '>= 3.0'
29
30
  spec.add_development_dependency 'bundler', '~> 2.2.3'
@@ -33,7 +34,6 @@ Gem::Specification.new do |spec|
33
34
  spec.add_development_dependency 'rake', '~> 13.0.3'
34
35
  spec.add_development_dependency 'rspec', '~> 3.10.0 '
35
36
  spec.add_development_dependency 'rspec_junit_formatter' # for CircleCI.
36
- spec.add_development_dependency 'rubocop', '~> 1.7.0'
37
37
  spec.add_development_dependency 'rubocop-rspec'
38
38
  spec.add_development_dependency 'sinatra'
39
39
  spec.add_development_dependency 'webrick'