ferrum 0.9 → 0.10

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8b4d6dc7aa1827fbf559e6025b82d29d15ed0e36a89793049266d8049fadabb9
4
- data.tar.gz: 6fab0202e85a17971d613db12e37a7ef85325eaf23f718b6801812df565ac64c
3
+ metadata.gz: c605388d1ea1a0f54f5f1ef24e56a93b60d109ec6eb02798d9de606cd54c29ef
4
+ data.tar.gz: a0cb3328ad526e51beaefb5eb8140659b1dd277acda5305f46464200d02ed24a
5
5
  SHA512:
6
- metadata.gz: fb109c1b65e73e8d0088734fa004fae3d15650121d01b44dc9086cdb193bb3c7f56c3ad911a2f6de5cd28522231b4e695b67eb515d90afe93b862eb64cfe7050
7
- data.tar.gz: a4d5e4c192cbd634c640d86027f3a8faeaf42efcd8fbaa9b0e8c6e81c04aa9921b7f2353eb739c35850363f1ed58f84d5895714f52ecd333d9ebdb50c1de4031
6
+ metadata.gz: c3e44b234a458079b268b7af941af8404a7aa9e6ade2d018ca07fdabcc21518a5d1ad6daafbcdcd3ed7dffe5f94f9b5a4fef36aa1b317178b1604df7f96a8a2b
7
+ data.tar.gz: 8b4ea9e0c5b0d029d743b1314dba4b6111f87f26ac4cb5c87e1b06d04b9693fc0570908456c4ced0860b07cc748d8ba783b320481d2879ec5df7b65ec70e85ec
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2019 Dmitry Vorotilin
3
+ Copyright (c) 2019-2020 Dmitry Vorotilin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # Ferrum - high-level API to control Chrome in Ruby
2
2
 
3
- [![Build Status](https://travis-ci.org/rubycdp/ferrum.svg?branch=master)](https://travis-ci.org/rubycdp/ferrum)
4
-
5
3
  <img align="right"
6
4
  width="320" height="241"
7
5
  alt="Ferrum logo"
@@ -32,9 +30,6 @@ Web design by [Evrone](https://evrone.com/), what else
32
30
  [we build with Ruby on Rails](https://evrone.com/ruby), what else
33
31
  [we do at Evrone](https://evrone.com/cases#case-studies).
34
32
 
35
- If you like this project, please consider to
36
- _[become a backer](https://www.patreon.com/rubycdp_ferrum)_ on Patreon.
37
-
38
33
 
39
34
  ## Index
40
35
 
@@ -55,6 +50,8 @@ _[become a backer](https://www.patreon.com/rubycdp_ferrum)_ on Patreon.
55
50
  * [Frame](https://github.com/rubycdp/ferrum#frame)
56
51
  * [Dialog](https://github.com/rubycdp/ferrum#dialog)
57
52
  * [Thread safety](https://github.com/rubycdp/ferrum#thread-safety)
53
+ * [Development](https://github.com/rubycdp/ferrum#development)
54
+ * [Contributing](https://github.com/rubycdp/ferrum#contributing)
58
55
  * [License](https://github.com/rubycdp/ferrum#license)
59
56
 
60
57
 
@@ -80,7 +77,7 @@ Navigate to a website and save a screenshot:
80
77
 
81
78
  ```ruby
82
79
  browser = Ferrum::Browser.new
83
- browser.goto("https://google.com")
80
+ browser.go_to("https://google.com")
84
81
  browser.screenshot(path: "google.png")
85
82
  browser.quit
86
83
  ```
@@ -89,7 +86,7 @@ Interact with a page:
89
86
 
90
87
  ```ruby
91
88
  browser = Ferrum::Browser.new
92
- browser.goto("https://google.com")
89
+ browser.go_to("https://google.com")
93
90
  input = browser.at_xpath("//input[@name='q']")
94
91
  input.focus.type("Ruby headless driver for Chrome", :Enter)
95
92
  browser.at_css("a > h3").text # => "rubycdp/ferrum: Ruby Chrome/Chromium driver - GitHub"
@@ -100,7 +97,7 @@ Evaluate some JavaScript and get full width/height:
100
97
 
101
98
  ```ruby
102
99
  browser = Ferrum::Browser.new
103
- browser.goto("https://www.google.com/search?q=Ruby+headless+driver+for+Capybara")
100
+ browser.go_to("https://www.google.com/search?q=Ruby+headless+driver+for+Capybara")
104
101
  width, height = browser.evaluate <<~JS
105
102
  [document.documentElement.offsetWidth,
106
103
  document.documentElement.offsetHeight]
@@ -114,7 +111,7 @@ Do any mouse movements you like:
114
111
  ```ruby
115
112
  # Trace a 100x100 square
116
113
  browser = Ferrum::Browser.new
117
- browser.goto("https://google.com")
114
+ browser.go_to("https://google.com")
118
115
  browser.mouse
119
116
  .move(x: 0, y: 0)
120
117
  .down
@@ -155,11 +152,14 @@ Ferrum::Browser.new(options)
155
152
  `["/path/to/script.js", { source: "window.secret = 'top'" }]`
156
153
  * `:logger` (Object responding to `puts`) - When present, debug output is
157
154
  written to this object.
158
- * `:slowmo` (Integer | Float) - Set a delay to wait before sending command.
155
+ * `:slowmo` (Integer | Float) - Set a delay in seconds to wait before sending command.
159
156
  Usefull companion of headless option, so that you have time to see changes.
160
157
  * `:timeout` (Numeric) - The number of seconds we'll wait for a response when
161
158
  communicating with browser. Default is 5.
162
159
  * `:js_errors` (Boolean) - When true, JavaScript errors get re-raised in Ruby.
160
+ * `:pending_connection_errors` (Boolean) - When main frame is still waiting for slow responses while timeout is
161
+ reached `PendingConnectionsError` is raised. It's better to figure out why you have slow responses and fix or
162
+ block them rather than turn this setting off. Default is true.
163
163
  * `:browser_name` (Symbol) - `:chrome` by default, only experimental support
164
164
  for `:firefox` for now.
165
165
  * `:browser_path` (String) - Path to Chrome binary, you can also set ENV
@@ -184,7 +184,7 @@ Ferrum::Browser.new(options)
184
184
 
185
185
  ## Navigation
186
186
 
187
- #### goto(url) : `String`
187
+ #### go_to(url) : `String`
188
188
 
189
189
  Navigate page to.
190
190
 
@@ -192,7 +192,7 @@ Navigate page to.
192
192
  configuring driver.
193
193
 
194
194
  ```ruby
195
- browser.goto("https://github.com/")
195
+ browser.go_to("https://github.com/")
196
196
  ```
197
197
 
198
198
  #### back
@@ -200,7 +200,7 @@ browser.goto("https://github.com/")
200
200
  Navigate to the previous page in history.
201
201
 
202
202
  ```ruby
203
- browser.goto("https://github.com/")
203
+ browser.go_to("https://github.com/")
204
204
  browser.at_xpath("//a").click
205
205
  browser.back
206
206
  ```
@@ -210,7 +210,7 @@ browser.back
210
210
  Navigate to the next page in history.
211
211
 
212
212
  ```ruby
213
- browser.goto("https://github.com/")
213
+ browser.go_to("https://github.com/")
214
214
  browser.at_xpath("//a").click
215
215
  browser.back
216
216
  browser.forward
@@ -221,7 +221,7 @@ browser.forward
221
221
  Reload current page.
222
222
 
223
223
  ```ruby
224
- browser.goto("https://github.com/")
224
+ browser.go_to("https://github.com/")
225
225
  browser.refresh
226
226
  ```
227
227
 
@@ -230,7 +230,7 @@ browser.refresh
230
230
  Stop all navigations and loading pending resources on the page
231
231
 
232
232
  ```ruby
233
- browser.goto("https://github.com/")
233
+ browser.go_to("https://github.com/")
234
234
  browser.stop
235
235
  ```
236
236
 
@@ -247,7 +247,7 @@ provided node.
247
247
  * :within `Node` | `nil`
248
248
 
249
249
  ```ruby
250
- browser.goto("https://github.com/")
250
+ browser.go_to("https://github.com/")
251
251
  browser.at_css("a[aria-label='Issues you created']") # => Node
252
252
  ```
253
253
 
@@ -262,7 +262,7 @@ document or provided node.
262
262
  * :within `Node` | `nil`
263
263
 
264
264
  ```ruby
265
- browser.goto("https://github.com/")
265
+ browser.go_to("https://github.com/")
266
266
  browser.css("a[aria-label='Issues you created']") # => [Node]
267
267
  ```
268
268
 
@@ -275,7 +275,7 @@ Find node by xpath.
275
275
  * :within `Node` | `nil`
276
276
 
277
277
  ```ruby
278
- browser.goto("https://github.com/")
278
+ browser.go_to("https://github.com/")
279
279
  browser.at_xpath("//a[@aria-label='Issues you created']") # => Node
280
280
  ```
281
281
 
@@ -288,7 +288,7 @@ Find nodes by xpath.
288
288
  * :within `Node` | `nil`
289
289
 
290
290
  ```ruby
291
- browser.goto("https://github.com/")
291
+ browser.go_to("https://github.com/")
292
292
  browser.xpath("//a[@aria-label='Issues you created']") # => [Node]
293
293
  ```
294
294
 
@@ -297,7 +297,7 @@ browser.xpath("//a[@aria-label='Issues you created']") # => [Node]
297
297
  Returns current top window location href.
298
298
 
299
299
  ```ruby
300
- browser.goto("https://google.com/")
300
+ browser.go_to("https://google.com/")
301
301
  browser.current_url # => "https://www.google.com/"
302
302
  ```
303
303
 
@@ -306,7 +306,7 @@ browser.current_url # => "https://www.google.com/"
306
306
  Returns current top window title
307
307
 
308
308
  ```ruby
309
- browser.goto("https://google.com/")
309
+ browser.go_to("https://google.com/")
310
310
  browser.current_title # => "Google"
311
311
  ```
312
312
 
@@ -315,7 +315,7 @@ browser.current_title # => "Google"
315
315
  Returns current page's html.
316
316
 
317
317
  ```ruby
318
- browser.goto("https://google.com/")
318
+ browser.go_to("https://google.com/")
319
319
  browser.body # => '<html itemscope="" itemtype="http://schema.org/WebPage" lang="ru"><head>...
320
320
  ```
321
321
 
@@ -336,18 +336,21 @@ Saves screenshot on a disk or returns it as base64.
336
336
  * :full `Boolean` whether you need full page screenshot or a viewport
337
337
  * :selector `String` css selector for given element
338
338
  * :scale `Float` zoom in/out
339
+ * :background_color `Ferrum::RGBA.new(0, 0, 0, 0.0)` to have specific background color
339
340
 
340
341
  ```ruby
341
- browser.goto("https://google.com/")
342
+ browser.go_to("https://google.com/")
342
343
  # Save on the disk in PNG
343
344
  browser.screenshot(path: "google.png") # => 134660
344
345
  # Save on the disk in JPG
345
346
  browser.screenshot(path: "google.jpg") # => 30902
346
347
  # Save to Base64 the whole page not only viewport and reduce quality
347
348
  browser.screenshot(full: true, quality: 60) # "iVBORw0KGgoAAAANSUhEUgAABAAAAAMACAYAAAC6uhUNAAAAAXNSR0IArs4c6Q...
349
+ # Save with specific background color
350
+ browser.screenshot(background_color: Ferrum::RGBA.new(0, 0, 0, 0.0))
348
351
  ```
349
352
 
350
- #### pdf(\*\*options) : `String` | `Integer`
353
+ #### pdf(\*\*options) : `String` | `Boolean`
351
354
 
352
355
  Saves PDF on a disk or returns it as base64.
353
356
 
@@ -365,9 +368,21 @@ Saves PDF on a disk or returns it as base64.
365
368
  * See other [native options](https://chromedevtools.github.io/devtools-protocol/tot/Page#method-printToPDF) you can pass
366
369
 
367
370
  ```ruby
368
- browser.goto("https://google.com/")
371
+ browser.go_to("https://google.com/")
369
372
  # Save to disk as a PDF
370
- browser.pdf(path: "google.pdf", paper_width: 1.0, paper_height: 1.0) # => 14983
373
+ browser.pdf(path: "google.pdf", paper_width: 1.0, paper_height: 1.0) # => true
374
+ ```
375
+
376
+ #### mhtml(\*\*options) : `String` | `Integer`
377
+
378
+ Saves MHTML on a disk or returns it as a string.
379
+
380
+ * options `Hash`
381
+ * :path `String` to save a file on the disk.
382
+
383
+ ```ruby
384
+ browser.go_to("https://google.com/")
385
+ browser.mhtml(path: "google.mhtml") # => 87742
371
386
  ```
372
387
 
373
388
 
@@ -381,7 +396,7 @@ Returns all information about network traffic as `Network::Exchange` instance
381
396
  which in general is a wrapper around `request`, `response` and `error`.
382
397
 
383
398
  ```ruby
384
- browser.goto("https://github.com/")
399
+ browser.go_to("https://github.com/")
385
400
  browser.network.traffic # => [#<Ferrum::Network::Exchange, ...]
386
401
  ```
387
402
 
@@ -390,7 +405,7 @@ browser.network.traffic # => [#<Ferrum::Network::Exchange, ...]
390
405
  Page request of the main frame.
391
406
 
392
407
  ```ruby
393
- browser.goto("https://github.com/")
408
+ browser.go_to("https://github.com/")
394
409
  browser.network.request # => #<Ferrum::Network::Request...
395
410
  ```
396
411
 
@@ -399,7 +414,7 @@ browser.network.request # => #<Ferrum::Network::Request...
399
414
  Page response of the main frame.
400
415
 
401
416
  ```ruby
402
- browser.goto("https://github.com/")
417
+ browser.go_to("https://github.com/")
403
418
  browser.network.response # => #<Ferrum::Network::Response...
404
419
  ```
405
420
 
@@ -409,7 +424,7 @@ Contains the status code of the main page response (e.g., 200 for a
409
424
  success). This is just a shortcut for `response.status`.
410
425
 
411
426
  ```ruby
412
- browser.goto("https://github.com/")
427
+ browser.go_to("https://github.com/")
413
428
  browser.network.status # => 200
414
429
  ```
415
430
 
@@ -426,7 +441,7 @@ Waits for network idle or raises `Ferrum::TimeoutError` error
426
441
  by default
427
442
 
428
443
  ```ruby
429
- browser.goto("https://example.com/")
444
+ browser.go_to("https://example.com/")
430
445
  browser.at_xpath("//a[text() = 'No UI changes button']").click
431
446
  browser.network.wait_for_idle
432
447
  ```
@@ -439,7 +454,7 @@ Clear browser's cache or collected traffic.
439
454
 
440
455
  ```ruby
441
456
  traffic = browser.network.traffic # => []
442
- browser.goto("https://github.com/")
457
+ browser.go_to("https://github.com/")
443
458
  traffic.size # => 51
444
459
  browser.network.clear(:traffic)
445
460
  traffic.size # => 0
@@ -467,25 +482,52 @@ browser.on(:request) do |request|
467
482
  request.continue
468
483
  end
469
484
  end
470
- browser.goto("https://google.com")
485
+ browser.go_to("https://google.com")
471
486
  ```
472
487
 
473
- #### authorize(\*\*options)
488
+ #### authorize(\*\*options, &block)
474
489
 
475
- If site uses authorization you can provide credentials using this method.
490
+ If site or proxy uses authorization you can provide credentials using this method.
476
491
 
477
492
  * options `Hash`
478
493
  * :type `Symbol` `:server` | `:proxy` site or proxy authorization
479
494
  * :user `String`
480
495
  * :password `String`
496
+ * &block accepts authenticated request, which you must subsequently allow or deny, if you don't
497
+ care about unwanted requests just call `request.continue`.
481
498
 
482
499
  ```ruby
483
- browser.network.authorize(user: "login", password: "pass")
484
- browser.goto("http://example.com/authenticated")
500
+ browser.network.authorize(user: "login", password: "pass") { |req| req.continue }
501
+ browser.go_to("http://example.com/authenticated")
485
502
  puts browser.network.status # => 200
486
503
  puts browser.body # => Welcome, authenticated client
487
504
  ```
488
505
 
506
+ Since Chrome implements authorize using request interception you must continue or abort authorized requests. If you
507
+ already have code that uses interception you can use `authorize` without block, but if not you are obliged to pass
508
+ block, so this is version doesn't pass block and can work just fine:
509
+
510
+ ```ruby
511
+ browser = Ferrum::Browser.new
512
+ browser.network.intercept
513
+ browser.on(:request) do |request|
514
+ if request.resource_type == "Image"
515
+ request.abort
516
+ else
517
+ request.continue
518
+ end
519
+ end
520
+
521
+ browser.network.authorize(user: "login", password: "pass", type: :proxy)
522
+
523
+ browser.go_to("https://google.com")
524
+
525
+ ```
526
+
527
+ You used to call `authorize` method without block, but since it's implemented using request interception there could be
528
+ a collision with another part of your code that also uses request interception, so that authorize allows the request
529
+ while your code denies but it's too late. The block is mandatory now.
530
+
489
531
 
490
532
  ### Mouse
491
533
 
@@ -501,7 +543,7 @@ Scroll page to a given x, y
501
543
  displayed in the upper left
502
544
 
503
545
  ```ruby
504
- browser.goto("https://www.google.com/search?q=Ruby+headless+driver+for+Capybara")
546
+ browser.go_to("https://www.google.com/search?q=Ruby+headless+driver+for+Capybara")
505
547
  browser.mouse.scroll_to(0, 400)
506
548
  ```
507
549
 
@@ -727,7 +769,7 @@ browser.add_style_tag(content: "h1 { font-size: 40px; }") # => true
727
769
 
728
770
  ```ruby
729
771
  browser.bypass_csp # => true
730
- browser.goto("https://github.com/ruby-concurrency/concurrent-ruby/blob/master/docs-source/promises.in.md")
772
+ browser.go_to("https://github.com/ruby-concurrency/concurrent-ruby/blob/master/docs-source/promises.in.md")
731
773
  browser.refresh
732
774
  browser.add_script_tag(content: "window.__injected = 42")
733
775
  browser.evaluate("window.__injected") # => 42
@@ -741,7 +783,7 @@ browser.evaluate("window.__injected") # => 42
741
783
  Returns all the frames current page have.
742
784
 
743
785
  ```ruby
744
- browser.goto("https://www.w3schools.com/tags/tag_frame.asp")
786
+ browser.go_to("https://www.w3schools.com/tags/tag_frame.asp")
745
787
  browser.frames # =>
746
788
  # [
747
789
  # #<Ferrum::Frame @id="C6D104CE454A025FBCF22B98DE612B12" @parent_id=nil @name=nil @state=:stopped_loading @execution_id=1>,
@@ -800,7 +842,7 @@ One of the states frame's in:
800
842
  Returns current frame's location href.
801
843
 
802
844
  ```ruby
803
- browser.goto("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe")
845
+ browser.go_to("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe")
804
846
  frame = browser.frames[1]
805
847
  frame.url # => https://interactive-examples.mdn.mozilla.net/pages/tabbed/iframe.html
806
848
  ```
@@ -810,7 +852,7 @@ frame.url # => https://interactive-examples.mdn.mozilla.net/pages/tabbed/iframe.
810
852
  Returns current frame's title.
811
853
 
812
854
  ```ruby
813
- browser.goto("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe")
855
+ browser.go_to("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe")
814
856
  frame = browser.frames[1]
815
857
  frame.title # => HTML Demo: <iframe>
816
858
  ```
@@ -820,7 +862,7 @@ frame.title # => HTML Demo: <iframe>
820
862
  If current frame is the main frame of the page (top of the tree).
821
863
 
822
864
  ```ruby
823
- browser.goto("https://www.w3schools.com/tags/tag_frame.asp")
865
+ browser.go_to("https://www.w3schools.com/tags/tag_frame.asp")
824
866
  frame = browser.frame_by(id: "C09C4E4404314AAEAE85928EAC109A93")
825
867
  frame.main? # => false
826
868
  ```
@@ -830,7 +872,7 @@ frame.main? # => false
830
872
  Returns current frame's top window location href.
831
873
 
832
874
  ```ruby
833
- browser.goto("https://www.w3schools.com/tags/tag_frame.asp")
875
+ browser.go_to("https://www.w3schools.com/tags/tag_frame.asp")
834
876
  frame = browser.frame_by(id: "C09C4E4404314AAEAE85928EAC109A93")
835
877
  frame.current_url # => "https://www.w3schools.com/tags/tag_frame.asp"
836
878
  ```
@@ -840,7 +882,7 @@ frame.current_url # => "https://www.w3schools.com/tags/tag_frame.asp"
840
882
  Returns current frame's top window title.
841
883
 
842
884
  ```ruby
843
- browser.goto("https://www.w3schools.com/tags/tag_frame.asp")
885
+ browser.go_to("https://www.w3schools.com/tags/tag_frame.asp")
844
886
  frame = browser.frame_by(id: "C09C4E4404314AAEAE85928EAC109A93")
845
887
  frame.current_title # => "HTML frame tag"
846
888
  ```
@@ -850,7 +892,7 @@ frame.current_title # => "HTML frame tag"
850
892
  Returns current frame's html.
851
893
 
852
894
  ```ruby
853
- browser.goto("https://www.w3schools.com/tags/tag_frame.asp")
895
+ browser.go_to("https://www.w3schools.com/tags/tag_frame.asp")
854
896
  frame = browser.frame_by(id: "C09C4E4404314AAEAE85928EAC109A93")
855
897
  frame.body # => "<html><head></head><body></body></html>"
856
898
  ```
@@ -860,7 +902,7 @@ frame.body # => "<html><head></head><body></body></html>"
860
902
  Returns current frame's doctype.
861
903
 
862
904
  ```ruby
863
- browser.goto("https://www.w3schools.com/tags/tag_frame.asp")
905
+ browser.go_to("https://www.w3schools.com/tags/tag_frame.asp")
864
906
  browser.main_frame.doctype # => "<!DOCTYPE html>"
865
907
  ```
866
908
 
@@ -871,7 +913,7 @@ Sets a content of a given frame.
871
913
  * html `String`
872
914
 
873
915
  ```ruby
874
- browser.goto("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe")
916
+ browser.go_to("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe")
875
917
  frame = browser.frames[1]
876
918
  frame.body # <html lang="en"><head><style>body {transition: opacity ease-in 0.2s; }...
877
919
  frame.set_content("<html><head></head><body><p>lol</p></body></html>")
@@ -900,7 +942,7 @@ browser.on(:dialog) do |dialog|
900
942
  dialog.dismiss
901
943
  end
902
944
  end
903
- browser.goto("https://google.com")
945
+ browser.go_to("https://google.com")
904
946
  ```
905
947
 
906
948
 
@@ -917,13 +959,13 @@ context = browser.contexts.create
917
959
 
918
960
  t1 = Thread.new(context) do |c|
919
961
  page = c.create_page
920
- page.goto("https://www.google.com/search?q=Ruby+headless+driver+for+Capybara")
962
+ page.go_to("https://www.google.com/search?q=Ruby+headless+driver+for+Capybara")
921
963
  page.screenshot(path: "t1.png")
922
964
  end
923
965
 
924
966
  t2 = Thread.new(context) do |c|
925
967
  page = c.create_page
926
- page.goto("https://www.google.com/search?q=Ruby+static+typing")
968
+ page.go_to("https://www.google.com/search?q=Ruby+static+typing")
927
969
  page.screenshot(path: "t2.png")
928
970
  end
929
971
 
@@ -942,7 +984,7 @@ browser = Ferrum::Browser.new
942
984
  t1 = Thread.new(browser) do |b|
943
985
  context = b.contexts.create
944
986
  page = context.create_page
945
- page.goto("https://www.google.com/search?q=Ruby+headless+driver+for+Capybara")
987
+ page.go_to("https://www.google.com/search?q=Ruby+headless+driver+for+Capybara")
946
988
  page.screenshot(path: "t1.png")
947
989
  context.dispose
948
990
  end
@@ -950,7 +992,7 @@ end
950
992
  t2 = Thread.new(browser) do |b|
951
993
  context = b.contexts.create
952
994
  page = context.create_page
953
- page.goto("https://www.google.com/search?q=Ruby+static+typing")
995
+ page.go_to("https://www.google.com/search?q=Ruby+static+typing")
954
996
  page.screenshot(path: "t2.png")
955
997
  context.dispose
956
998
  end
@@ -961,26 +1003,20 @@ t2.join
961
1003
  browser.quit
962
1004
  ```
963
1005
 
1006
+ ## Development
1007
+
1008
+ After checking out the repo, run `bundle install` to install dependencies.
1009
+
1010
+ Then, run `bundle exec rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
1011
+
1012
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
1013
+
1014
+
1015
+ ## Contributing
1016
+
1017
+ Bug reports and pull requests are welcome on [GitHub](https://github.com/rubycdp/ferrum).
964
1018
 
965
1019
  ## License
966
1020
 
967
- Copyright 2018-2020 Machinio
968
-
969
- Permission is hereby granted, free of charge, to any person obtaining
970
- a copy of this software and associated documentation files (the
971
- "Software"), to deal in the Software without restriction, including
972
- without limitation the rights to use, copy, modify, merge, publish,
973
- distribute, sublicense, and/or sell copies of the Software, and to
974
- permit persons to whom the Software is furnished to do so, subject to
975
- the following conditions:
976
-
977
- The above copyright notice and this permission notice shall be
978
- included in all copies or substantial portions of the Software.
979
-
980
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
981
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
982
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
983
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
984
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
985
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
986
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1021
+ The gem is available as open source under the terms of the
1022
+ [MIT License](https://opensource.org/licenses/MIT).