dvla-browser-drivers 3.1.2 → 3.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be6fbb0dea13bdb8c0cffdf3c2e865a707792e92ad0779d27ee9e9ca69c31d37
4
- data.tar.gz: f17d454ef4b54fcf99adffa8bb9d62872a03740bf54671923183245b33bad027
3
+ metadata.gz: 9747c432022ec4874a84b5fdd9017b2486c4d37c07a9fe4353828c8bf1771e75
4
+ data.tar.gz: 0b93b0c90fbe2465ac1e613a6f9afba628b3230aa39d51f5d75d794292bb4e8e
5
5
  SHA512:
6
- metadata.gz: 41730ce1a0217eb34d5ae46722d6387bac90dbbfe869bce8a9ba5f60f32a54290cab759327fdb870da109d8e5c8daa1eb4c4e730b98190c261d3b40904775ba2
7
- data.tar.gz: 16988c0eb23835442a45f68f07d9d2c0132980888b4cc983600d33e34ea654a0a4c57df7bde4b41a1ebb0f241e5f1422d066584da93a5da0f09ecd9956219f4f
6
+ metadata.gz: b385a43c98778ae9ec72b12ae004c1a95c175ee6d37491c054d83200e5220023053b518b51ffa8ad18cbcc1297a8fa792a9f521cc343fb1e68a3e5d8fb759ed9
7
+ data.tar.gz: 532414c16d438e444ffab734ce98e04aad0d487572b53948cb30d2006e0fd4c532625575ef55123397269c65f189cd6b9654c5322468e89289e3755bb46a2d89
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.3.0
1
+ 4.0.1
data/Gemfile CHANGED
@@ -5,6 +5,7 @@ source 'https://rubygems.org'
5
5
  # Specify your gem's dependencies in dvla-browser-drivers.gemspec
6
6
  gemspec
7
7
 
8
+ gem "ostruct", "~> 0.6.3"
8
9
  gem 'bundler-audit', '~> 0.9.3'
9
10
  gem 'dvla-lint', '~> 1.7'
10
11
  gem 'pry', '~> 0.14'
data/README.md CHANGED
@@ -25,25 +25,33 @@ Once installed, you are able to use any pre-configured browser driver from the l
25
25
 
26
26
  ### Selenium drivers
27
27
 
28
- | Driver | Usage |
29
- |---------------------------|----------------------------------------------------|
30
- | selenium_chrome | `DVLA::Browser::Drivers.selenium_chrome` |
31
- | headless_selenium_chrome | `DVLA::Browser::Drivers.headless_selenium_chrome` |
32
- | selenium_firefox | `DVLA::Browser::Drivers.selenium_firefox` |
33
- | headless_selenium_firefox | `DVLA::Browser::Drivers.headless_selenium_firefox` |
34
- | selenium_edge | `DVLA::Browser::Drivers.selenium_edge` |
35
- | selenium_safari | `DVLA::Browser::Drivers.selenium_safari` |
28
+ | Driver | Usage |
29
+ |------------------|-----------------------------------------------|
30
+ | selenium_chrome | `DVLA::Browser::Drivers.selenium_chrome` |
31
+ | selenium_firefox | `DVLA::Browser::Drivers.selenium_firefox` |
32
+ | selenium_edge | `DVLA::Browser::Drivers.selenium_edge` |
33
+ | selenium_safari | `DVLA::Browser::Drivers.selenium_safari` |
36
34
 
37
35
  ### Non-selenium drivers
38
36
 
39
- | Driver | Usage |
40
- |---------------------|----------------------------------------------|
41
- | cuprite | `DVLA::Browser::Drivers.cuprite` |
42
- | headless_cuprite | `DVLA::Browser::Drivers.headless_cuprite` |
43
- | apparition | `DVLA::Browser::Drivers.apparition` |
44
- | headless_apparition | `DVLA::Browser::Drivers.headless_apparition` |
37
+ | Driver | Usage |
38
+ |------------|-------------------------------------|
39
+ | cuprite | `DVLA::Browser::Drivers.cuprite` |
40
+ | apparition | `DVLA::Browser::Drivers.apparition` |
45
41
 
46
- **Note:** Safari and Edge do not support headless mode.
42
+ ### Driver modifiers
43
+
44
+ The following modifiers can be applied to any driver above (except selenium_safari):
45
+
46
+ | Modifier | Example | Description |
47
+ |-------------|-----------------------------------------------------|-------------------------------------------------------------------------------|
48
+ | headless_ | `headless_selenium_chrome` | Runs the browser in headless mode |
49
+ | _no_js | `selenium_chrome_no_js` | Disables JavaScript in the browser |
50
+ | _proxied | `selenium_firefox_proxied(proxy: 'http://foo.bar')` | Routes traffic through a proxy, requires a url passed as the `proxy` argument |
51
+
52
+ Modifiers can be combined, e.g. `headless_selenium_firefox_no_js_proxied`
53
+
54
+ **Note:** selenium_safari does not support any modifiers.
47
55
 
48
56
  ---
49
57
 
@@ -69,6 +77,7 @@ Once installed, you are able to use any pre-configured browser driver from the l
69
77
  | remote | Selenium, Cuprite, Apparition | `selenium_chrome(remote: 'http://localhost:4444/wd/hub')` | Allows you to talk to a remote browser |
70
78
  | additional_arguments | Selenium | `selenium_chrome(additional_arguments: ['window-size=1400,1920'] ` | Pass additional arguments to the driver |
71
79
  | additional_preferences | Selenium | `selenium_chrome(additional_preferences: [{'download.default_directory': '<download_path>'}] )` | Pass additional preferences to the driver |
80
+ | proxy | Selenium, Cuprite | `selenium_firefox_proxied(proxy: 'http://proxy:8080')` | Sets the proxy URL for proxied drivers |
72
81
  | timeout | Cuprite, Apparition | `cuprite(timeout: 60 )` | Sets the default timeout for the driver |
73
82
  | save_path | Cuprite, Apparition | `cuprite(save_path: 'File.expand_path('./somewhere')' )` | Tells the browser where to store downloads |
74
83
  | browser_options | Cuprite, Apparition | `cuprite(browser_options: { option: value, option: value })` | Pass additional options to the browser |
@@ -1,11 +1,11 @@
1
1
  module DVLA
2
2
  module Browser
3
3
  module Drivers
4
- DRIVER_REGEX = /^(?:(?<headless>headless_)(?<driver>selenium_(?<browser>chrome|firefox)|cuprite|apparition)|(?<driver_no_headless>selenium_(?<browser_no_headless>chrome|firefox|edge|safari)|cuprite|apparition))$/
4
+ DRIVER_REGEX = /^(?:(?<headless>headless_)(?<driver>selenium_(?<browser>chrome|firefox|edge)|cuprite|apparition)(?<no_js>_no_js)?(?<proxied>_proxied)?|(?<driver_no_headless>selenium_(?<browser_no_headless>chrome|firefox|edge|safari)|cuprite|apparition)(?<no_js_no_headless>_no_js)?(?<proxied_no_headless>_proxied)?)$/
5
5
 
6
- OTHER_ACCEPTED_PARAMS = %i[timeout browser_options save_path remote].freeze
6
+ OTHER_ACCEPTED_PARAMS = %i[timeout browser_options save_path remote proxy].freeze
7
7
  OTHER_DRIVERS = %i[cuprite apparition].freeze
8
- SELENIUM_ACCEPTED_PARAMS = %i[remote additional_arguments additional_preferences binary].freeze
8
+ SELENIUM_ACCEPTED_PARAMS = %i[remote additional_arguments additional_preferences binary proxy].freeze
9
9
  SELENIUM_DRIVERS = %i[selenium_chrome selenium_firefox selenium_edge selenium_safari].freeze
10
10
 
11
11
  # Creates methods in the Drivers module that matches the DRIVER_REGEX
@@ -19,9 +19,15 @@ module DVLA
19
19
  def self.method_missing(method, *args, **kwargs, &)
20
20
  if (matches = method.match(DRIVER_REGEX))
21
21
  headless = matches[:headless].is_a? String
22
+ no_js = matches[:no_js].is_a?(String) || matches[:no_js_no_headless].is_a?(String)
23
+ proxied = matches[:proxied].is_a?(String) || matches[:proxied_no_headless].is_a?(String)
22
24
  driver = matches[:driver]&.to_sym || matches[:driver_no_headless]&.to_sym
23
25
  browser_match = matches[:browser] || matches[:browser_no_headless]
24
26
 
27
+ if proxied && !kwargs[:proxy]
28
+ raise ArgumentError, "Method '#{method}' requires proxy parameter"
29
+ end
30
+
25
31
  case driver
26
32
  when *SELENIUM_DRIVERS
27
33
  browser = browser_match.to_sym
@@ -43,6 +49,24 @@ module DVLA
43
49
  options.add_argument('--no-sandbox')
44
50
  end
45
51
 
52
+ if kwargs[:proxy]
53
+ if browser == :firefox
54
+ proxy_uri = URI.parse(kwargs[:proxy])
55
+ proxy_host = proxy_uri.host == '0.0.0.0' ? '127.0.0.1' : proxy_uri.host
56
+ options.add_preference('network.proxy.type', 1)
57
+ options.add_preference('network.proxy.http', proxy_host)
58
+ options.add_preference('network.proxy.http_port', proxy_uri.port)
59
+ options.add_preference('network.proxy.ssl', proxy_host)
60
+ options.add_preference('network.proxy.ssl_port', proxy_uri.port)
61
+ options.add_preference('network.proxy.no_proxies_on', '')
62
+ options.add_preference('security.cert_pinning.enforcement_level', 0)
63
+ options.add_preference('security.enterprise_roots.enabled', true)
64
+ else
65
+ options.add_argument("--proxy-server=#{kwargs[:proxy]}")
66
+ options.add_argument('--ignore-certificate-errors')
67
+ end
68
+ end
69
+
46
70
  kwargs[:additional_arguments] && kwargs[:additional_arguments].each do |argument|
47
71
  argument.prepend('--') unless argument.start_with?('--')
48
72
  options.add_argument(argument)
@@ -52,13 +76,23 @@ module DVLA
52
76
  key, value = preference.first
53
77
  options.add_preference(key, value)
54
78
  end
79
+
80
+ if no_js
81
+ if browser == :chrome
82
+ options.add_preference('profile.managed_default_content_settings.javascript', 2)
83
+ elsif browser == :firefox
84
+ options.add_preference('javascript.enabled', false)
85
+ end
86
+ end
55
87
  end
56
88
 
57
89
  driver_browser = kwargs[:remote] ? :remote : browser
58
90
  driver_options = { browser: driver_browser, options: }
59
91
  driver_options[:url] = kwargs[:remote] if kwargs[:remote]
60
92
 
61
- ::Capybara::Selenium::Driver.new(app, **driver_options)
93
+ ::Capybara::Selenium::Driver.new(app, **driver_options).tap do |driver|
94
+ driver.browser.execute_cdp('Emulation.setScriptExecutionDisabled', value: true) if no_js && browser == :edge
95
+ end
62
96
  end
63
97
  else
64
98
  kwargs.each do |key, _value|
@@ -66,8 +100,12 @@ module DVLA
66
100
  end
67
101
 
68
102
  browser_options = { 'no-sandbox': nil, 'disable-smooth-scrolling': true }
69
- kwargs[:browser_options] && kwargs[:browser_options].each do |key, value|
70
- browser_options[key] = value
103
+ browser_options = browser_options.merge(kwargs[:browser_options]) if kwargs[:browser_options]
104
+ browser_options[:'blink-settings'] = 'scriptEnabled=false' if no_js
105
+
106
+ if kwargs[:proxy]
107
+ browser_options[:'proxy-server'] = kwargs[:proxy]
108
+ browser_options[:'ignore-certificate-errors'] = nil
71
109
  end
72
110
 
73
111
  ::Capybara.register_driver method do |app|
@@ -78,11 +116,11 @@ module DVLA
78
116
  browser_options:,
79
117
  save_path: kwargs[:save_path],
80
118
  url: kwargs[:remote],
81
- )
119
+ )
82
120
  end
83
121
  end
84
122
 
85
- puts "Driver set to: '#{method}'"
123
+ puts "Driver set to: '#{method}'"
86
124
 
87
125
  ::Capybara.javascript_driver = method
88
126
  ::Capybara.default_driver = method
@@ -3,7 +3,7 @@
3
3
  module DVLA
4
4
  module Browser
5
5
  module Drivers
6
- VERSION = '3.1.2'
6
+ VERSION = '3.2.0'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dvla-browser-drivers
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.2
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Driver and Vehicle Licensing Agency (DVLA)
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2026-01-22 00:00:00.000000000 Z
12
+ date: 2026-04-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: apparition