playwright-ruby-client 0.5.6 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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'