capybara-headless_chrome 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/README.md +26 -8
- data/capybara-headless_chrome.gemspec +2 -2
- data/lib/capybara/headless_chrome/cucumber.rb +1 -1
- data/lib/capybara/headless_chrome/downloads.rb +44 -0
- data/lib/capybara/headless_chrome/driver.rb +66 -0
- data/lib/capybara/headless_chrome/session_dsl.rb +10 -0
- data/lib/capybara/headless_chrome/version.rb +1 -1
- data/lib/capybara/headless_chrome.rb +6 -88
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 072a6982915af40cdbd5b6c8141dd6cbb78e81c2
|
4
|
+
data.tar.gz: c9f75a5a769c27861f5f93775c6a11f3be0d1894
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3e174527bdf32088f5980f02aa8354dc3890b310575385ceea692bae5db45ab663605c719a5fa8469846d4cbb6ed0b5e6e58a0143ad22c882cfe7fa4f7b8521
|
7
|
+
data.tar.gz: e6b9b81bbdadec609b7b4bdb79ffd9c1b98b1538794c4d11b11d4d22b57995b1781a89f8f02bb350f0457ad2f1917a01e3424c48d0c3dbe5b0a5f1c22f4b8666
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,15 +1,37 @@
|
|
1
1
|
# Capybara::HeadlessChrome
|
2
2
|
|
3
|
-
|
3
|
+
A nice and tidy Capybara driver for headless Chrome. Even supports file downloads!
|
4
4
|
|
5
|
-
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
### Capybara Setup
|
8
|
+
|
9
|
+
Just `require "capybara/headless_chrome"` somewhere in your test setup. This will register the `:chrome` driver, and make it Capybara's default.
|
10
|
+
|
11
|
+
### Working with Downloaded Files
|
12
|
+
|
13
|
+
The Capybara session is extended with a single `#downloads` method that provides access to files downloaded during the session.
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
page.click_link "Download Report"
|
17
|
+
page.downloads.filenames # => ["report.csv"]
|
18
|
+
page.downloads["report.csv"] # => #<File:report.csv>
|
19
|
+
```
|
20
|
+
|
21
|
+
Note that the `#[]` method is wrapped with Capybara's synchronize, so it will keep trying to find the file for up to `Capybara.default_max_wait_time` seconds.
|
22
|
+
|
23
|
+
Be sure to run `page.downloads.reset` at the beginning of every test run to empty the downloaded files list.
|
24
|
+
|
25
|
+
If you're using Cucumber, you can `require "capybara/headless_chrome/cucumber"` somewhere in your cucumber configuration to set this up for you.
|
6
26
|
|
7
27
|
## Installation
|
8
28
|
|
9
|
-
Add this
|
29
|
+
Add this to your application's Gemfile:
|
10
30
|
|
11
31
|
```ruby
|
12
|
-
|
32
|
+
group :test do
|
33
|
+
gem 'capybara-headless_chrome'
|
34
|
+
end
|
13
35
|
```
|
14
36
|
|
15
37
|
And then execute:
|
@@ -20,10 +42,6 @@ Or install it yourself as:
|
|
20
42
|
|
21
43
|
$ gem install capybara-headless_chrome
|
22
44
|
|
23
|
-
## Usage
|
24
|
-
|
25
|
-
TODO: Write usage instructions here
|
26
|
-
|
27
45
|
## Development
|
28
46
|
|
29
47
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Micah Geisel"]
|
10
10
|
spec.email = ["micah@botandrose.com"]
|
11
11
|
|
12
|
-
spec.summary = "
|
13
|
-
spec.description = "
|
12
|
+
spec.summary = "A nice and tidy Capybara driver for headless Chrome"
|
13
|
+
spec.description = "A nice and tidy Capybara driver for headless Chrome. Even supports file downloads!"
|
14
14
|
spec.homepage = "https://github.com/botandrose/capybara-headless_chrome"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
require "capybara"
|
3
|
+
|
4
|
+
module Capybara
|
5
|
+
module HeadlessChrome
|
6
|
+
class Downloads
|
7
|
+
class NotFound < Capybara::ExpectationNotMet; end
|
8
|
+
|
9
|
+
def dir
|
10
|
+
pathname.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
def reset
|
14
|
+
FileUtils.rm_rf(dir)
|
15
|
+
FileUtils.mkdir_p(dir)
|
16
|
+
end
|
17
|
+
|
18
|
+
def filenames
|
19
|
+
pathname.entries.reject(&:directory?).map(&:to_s)
|
20
|
+
end
|
21
|
+
|
22
|
+
def [] filename
|
23
|
+
Capybara.current_session.document.synchronize do
|
24
|
+
begin
|
25
|
+
File.open(pathname.join(filename))
|
26
|
+
rescue Errno::ENOENT
|
27
|
+
raise NotFound.new("Couldn't find #{filename} in #{filenames}")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def pathname
|
35
|
+
@pathname ||= Capybara.save_path.join(unique_id, "downloads")
|
36
|
+
end
|
37
|
+
|
38
|
+
def unique_id
|
39
|
+
Time.now.strftime('%s%L')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "selenium/webdriver"
|
2
|
+
require "chromedriver/helper"
|
3
|
+
require "capybara"
|
4
|
+
require "capybara/headless_chrome/downloads"
|
5
|
+
|
6
|
+
module Capybara
|
7
|
+
module HeadlessChrome
|
8
|
+
class Driver < Capybara::Selenium::Driver
|
9
|
+
def initialize app
|
10
|
+
super(app, browser: :chrome, desired_capabilities: chrome_capabilities)
|
11
|
+
configure_downloads
|
12
|
+
end
|
13
|
+
|
14
|
+
def downloads
|
15
|
+
@downloads ||= Downloads.new
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def chrome_capabilities
|
21
|
+
::Selenium::WebDriver::Remote::Capabilities.chrome(
|
22
|
+
chromeOptions: {
|
23
|
+
args: chrome_arguments,
|
24
|
+
prefs: chrome_preferences
|
25
|
+
}
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def chrome_arguments
|
30
|
+
[
|
31
|
+
"no-sandbox",
|
32
|
+
"headless",
|
33
|
+
"disable-infobars",
|
34
|
+
"disable-popup-blocking",
|
35
|
+
"disable-gpu",
|
36
|
+
"window-size=1280,1024",
|
37
|
+
]
|
38
|
+
end
|
39
|
+
|
40
|
+
def chrome_preferences
|
41
|
+
{
|
42
|
+
"download.default_directory" => downloads.dir,
|
43
|
+
"download.directory_upgrade": "true",
|
44
|
+
"download.prompt_for_download": "false",
|
45
|
+
"browser.set_download_behavior": "{ behavior: 'allow' }",
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
def configure_downloads
|
50
|
+
bridge = browser.send(:bridge)
|
51
|
+
path = '/session/:session_id/chromium/send_command'
|
52
|
+
path[':session_id'] = bridge.session_id
|
53
|
+
|
54
|
+
bridge.http.call(:post,
|
55
|
+
path,
|
56
|
+
cmd: 'Page.setDownloadBehavior',
|
57
|
+
params: {
|
58
|
+
behavior: 'allow',
|
59
|
+
downloadPath: downloads.dir,
|
60
|
+
}
|
61
|
+
)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
@@ -1,94 +1,12 @@
|
|
1
1
|
require "capybara/headless_chrome/version"
|
2
|
-
require "capybara"
|
3
|
-
require "
|
4
|
-
require "selenium/webdriver"
|
5
|
-
|
6
|
-
module Capybara
|
7
|
-
module HeadlessChrome
|
8
|
-
class DownloadNotFound < Capybara::ExpectationNotMet; end
|
9
|
-
|
10
|
-
class Downloads
|
11
|
-
class << self
|
12
|
-
def setup
|
13
|
-
FileUtils.rm_rf dir
|
14
|
-
FileUtils.mkdir_p dir
|
15
|
-
end
|
16
|
-
|
17
|
-
def configure_driver driver
|
18
|
-
bridge = driver.browser.send(:bridge)
|
19
|
-
path = '/session/:session_id/chromium/send_command'
|
20
|
-
path[':session_id'] = bridge.session_id
|
21
|
-
|
22
|
-
bridge.http.call(:post,
|
23
|
-
path,
|
24
|
-
cmd: 'Page.setDownloadBehavior',
|
25
|
-
params: {
|
26
|
-
behavior: 'allow',
|
27
|
-
downloadPath: dir,
|
28
|
-
}
|
29
|
-
)
|
30
|
-
end
|
31
|
-
|
32
|
-
def chrome_prefs
|
33
|
-
{
|
34
|
-
"download.default_directory" => dir,
|
35
|
-
"download.directory_upgrade": "true",
|
36
|
-
"download.prompt_for_download": "false",
|
37
|
-
"browser.set_download_behavior": "{ behavior: 'allow' }",
|
38
|
-
}
|
39
|
-
end
|
40
|
-
|
41
|
-
def dir
|
42
|
-
pathname.to_s
|
43
|
-
end
|
44
|
-
|
45
|
-
def pathname
|
46
|
-
Capybara.save_path.join("downloads")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def filenames
|
51
|
-
self.class.pathname.entries.reject(&:directory?).map(&:to_s)
|
52
|
-
end
|
53
|
-
|
54
|
-
def [] filename
|
55
|
-
path = self.class.pathname.join(filename)
|
56
|
-
Capybara.current_session.document.synchronize do
|
57
|
-
begin
|
58
|
-
File.open(path)
|
59
|
-
rescue Errno::ENOENT
|
60
|
-
raise DownloadNotFound.new("Couldn't find #{filename} in #{filenames}")
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
2
|
+
require "capybara/headless_chrome/driver"
|
3
|
+
require "capybara/headless_chrome/session_dsl"
|
67
4
|
|
68
5
|
Capybara.register_driver :chrome do |app|
|
69
|
-
|
70
|
-
chromeOptions: {
|
71
|
-
args: [
|
72
|
-
"no-sandbox",
|
73
|
-
"headless",
|
74
|
-
"disable-infobars",
|
75
|
-
"disable-popup-blocking",
|
76
|
-
"disable-gpu",
|
77
|
-
"window-size=1280,1024",
|
78
|
-
],
|
79
|
-
prefs: {}.merge(Capybara::HeadlessChrome::Downloads.chrome_prefs),
|
80
|
-
}
|
81
|
-
)
|
82
|
-
Capybara::Selenium::Driver.new(app, browser: :chrome, desired_capabilities: capabilities).tap do |driver|
|
83
|
-
Capybara::HeadlessChrome::Downloads.configure_driver driver
|
84
|
-
end
|
6
|
+
Capybara::HeadlessChrome::Driver.new(app)
|
85
7
|
end
|
86
8
|
|
87
|
-
Capybara.javascript_driver = :chrome
|
88
|
-
|
9
|
+
Capybara.default_driver = Capybara.javascript_driver = :chrome
|
10
|
+
|
11
|
+
Capybara::Session.include Capybara::HeadlessChrome::SessionDSL
|
89
12
|
|
90
|
-
Capybara::Session.class_eval do
|
91
|
-
def downloads
|
92
|
-
Capybara::HeadlessChrome::Downloads.new
|
93
|
-
end
|
94
|
-
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara-headless_chrome
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Micah Geisel
|
@@ -94,7 +94,8 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '3.0'
|
97
|
-
description:
|
97
|
+
description: A nice and tidy Capybara driver for headless Chrome. Even supports file
|
98
|
+
downloads!
|
98
99
|
email:
|
99
100
|
- micah@botandrose.com
|
100
101
|
executables: []
|
@@ -113,6 +114,9 @@ files:
|
|
113
114
|
- capybara-headless_chrome.gemspec
|
114
115
|
- lib/capybara/headless_chrome.rb
|
115
116
|
- lib/capybara/headless_chrome/cucumber.rb
|
117
|
+
- lib/capybara/headless_chrome/downloads.rb
|
118
|
+
- lib/capybara/headless_chrome/driver.rb
|
119
|
+
- lib/capybara/headless_chrome/session_dsl.rb
|
116
120
|
- lib/capybara/headless_chrome/version.rb
|
117
121
|
homepage: https://github.com/botandrose/capybara-headless_chrome
|
118
122
|
licenses:
|
@@ -137,5 +141,5 @@ rubyforge_project:
|
|
137
141
|
rubygems_version: 2.6.14
|
138
142
|
signing_key:
|
139
143
|
specification_version: 4
|
140
|
-
summary:
|
144
|
+
summary: A nice and tidy Capybara driver for headless Chrome
|
141
145
|
test_files: []
|