webdriver-user-agent 7.2 → 7.8

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1f103f486777f7dffc40b6177cbd52c1ed13826daf41c500f8f69f1869e71c6f
4
+ data.tar.gz: 4844156cef409e1c77d5e4610b3e51e1c995954edc3e0823fd4651255b5372fd
5
+ SHA512:
6
+ metadata.gz: 1f297ddcf8064c4c6a37c550f0bf2ea57e4d3ca6cc60856315f9656b15426ca36357173ac87b246dde72d8f9d9f05d929f35aa82ee6f72461d47409556bdfa23
7
+ data.tar.gz: 69368f91ffb7b262a7b45161dc4099fa80230d4bca0792b7d1baf80d130e1876850a970dce3b79b2dbae926eddd257dcf7a2ca0584a8cf329f27966941c1b978
@@ -1 +1 @@
1
- ruby-1.9.3-p429
1
+ ruby-2.4.1
data/ChangeLog CHANGED
@@ -1,3 +1,22 @@
1
+ === Version 7.5 / 2017-8-22
2
+ * Enhancements
3
+ * Added support for modern iPhone and iPad sizes
4
+ * Added support for driving Safari and Safari Technology Preview
5
+ * Updated to use new Watir namespace
6
+ * Updated to Ruby 2.4.1
7
+ * Updated Chrome and Firefox options configuration to use new Selenium syntax
8
+
9
+ === Version 7.4 / 2016-1-6
10
+ * Enhancements
11
+ * Added support for iPad Pro and iPhone 6/6s (Thanks samnissen)
12
+
13
+ === Version 7.3 / 2015-7-14 (Thanks samnissen)
14
+ * Enhancements
15
+ * Allow users to override the browser screensize
16
+ * Fixes
17
+ * Removed development puts commands
18
+ * Chrome no longer rejects using Javascript to rewize the window
19
+
1
20
  === Version 7.2 / 2014-12-12
2
21
  * Enhancements
3
22
  * Added iphone 5 and 6 variants (Thanks samnissen)
@@ -6,4 +25,3 @@
6
25
  === Version 7.1 / 2014-3-2
7
26
  * Enhancements
8
27
  * Added ipad 7 device support (Thanks Matthwe Fleeger)
9
-
data/README.md CHANGED
@@ -25,6 +25,7 @@ provides a UserAgent.driver method to return a new web-driver with user agent an
25
25
  * :browser
26
26
  * :firefox (default)
27
27
  * :chrome
28
+ * :safari
28
29
  * :agent
29
30
  * :iphone (default)
30
31
  * :ipad
@@ -51,9 +52,9 @@ provides a UserAgent.driver method to return a new web-driver with user agent an
51
52
  driver.execute_script('return navigator.userAgent')
52
53
  # random agent like "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1"
53
54
 
54
- ### Example using watir-webdriver
55
+ ### Example using watir
55
56
 
56
- require 'watir-webdriver'
57
+ require 'watir'
57
58
  require 'webdriver-user-agent'
58
59
  driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :iphone, :orientation => :landscape)
59
60
  browser = Watir::Browser.new(driver)
@@ -1,64 +1,173 @@
1
- :iphone:
2
- :user_agent: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B435 Safari/600.1.4"
1
+ # Desktop size sources
2
+ # - http://www.hobo-web.co.uk/best-screen-size/
3
+ # - https://en.wikipedia.org/wiki/Display_resolution#Common_display_resolutions
4
+ # - http://www.w3schools.com/browsers/browsers_display.asp
5
+
6
+ # iPhone and iPad data added by running Simulator on macOS and visiting
7
+ # https://whatismyviewport.com and
8
+ # https://www.whatismybrowser.com/detect/what-is-my-user-agent
9
+
10
+ # Android user agents and viewports from current android device specs.
11
+ # Tablet: Samsung Galaxy Tab S6; Phone: Google Pixel 4
12
+ # Determined without a simulator to account for software chrome,
13
+ # so these figures are necessarily larger than what will be true
14
+ # on those devices. Please feel free to submit a pull request
15
+ # with corrected and/or expanded device values.
16
+ :desktop:
17
+ :user_agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Safari/605.1.15
3
18
  :portrait:
4
- :width: 375
5
- :height: 559
19
+ :width: 768
20
+ :height: 1024
6
21
  :landscape:
7
- :width: 667
8
- :height: 375
9
- :iphone6plus:
10
- :user_agent: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B435 Safari/600.1.4"
22
+ :width: 1366
23
+ :height: 768
24
+ :iphone_default: &iphone_default
25
+ :user_agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1
26
+ :portrait:
27
+ :width: 414
28
+ :height: 719
29
+ :landscape:
30
+ :width: 808
31
+ :height: 414
32
+ :iphone: &iphone
33
+ <<: *iphone_default
34
+ :iphone11pro:
35
+ <<: *iphone_default
11
36
  :portrait:
12
- :width: 414
13
- :height: 628
37
+ :width: 375
38
+ :height: 635
14
39
  :landscape:
15
- :width: 736
16
- :height: 414
17
- :iphone6:
18
- :user_agent: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B435 Safari/600.1.4"
40
+ :width: 724
41
+ :height: 375
42
+ :iphone11promax:
43
+ <<: *iphone_default
44
+ :iphone11:
45
+ <<: *iphone_default
46
+ :iphonese: &iphonese
47
+ <<: *iphone_default
19
48
  :portrait:
20
49
  :width: 375
21
- :height: 559
50
+ :height: 553
22
51
  :landscape:
23
52
  :width: 667
24
53
  :height: 375
25
- :iphone5s:
26
- :user_agent: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B435 Safari/600.1.4"
54
+ :iphonexr: &iphonexr
55
+ <<: *iphone_default
56
+ :iphonexsmax:
57
+ <<: *iphonexr
58
+ :iphonexs: &iphonexs
59
+ <<: *iphone_default
60
+ :portrait:
61
+ :width: 375
62
+ :height: 635
63
+ :landscape:
64
+ :width: 724
65
+ :height: 375
66
+ :iphonex:
67
+ <<: *iphonexs
68
+ :iphone8plus: &iphone8plus
69
+ <<: *iphone_default
70
+ :portrait:
71
+ :width: 414
72
+ :height: 622
73
+ :landscape:
74
+ :width: 736
75
+ :height: 414
76
+ :iphone8: &iphone8
77
+ <<: *iphonese
78
+ :iphone7plus:
79
+ <<: *iphone8plus
80
+ :iphone7:
81
+ <<: *iphone8
82
+ :iphone6splus:
83
+ <<: *iphone8plus
84
+ :iphone6s:
85
+ <<: *iphone8
86
+ :iphone6plus:
87
+ <<: *iphone8plus
88
+ :iphone6:
89
+ <<: *iphone8
90
+ :iphone5s: &iphone5s
91
+ <<: *iphone_default
27
92
  :portrait:
28
93
  :width: 320
29
- :height: 460
94
+ :height: 454
30
95
  :landscape:
31
96
  :width: 568
32
- :height: 212
33
- :iphone4s:
34
- :user_agent: "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B435 Safari/600.1.4"
97
+ :height: 320
98
+ :iphonese_old:
99
+ <<: *iphone5s
100
+ :iphone5:
101
+ <<: *iphone5s
102
+ :iphone4s: &iphone4s
103
+ <<: *iphone_default
35
104
  :portrait:
36
105
  :width: 320
37
106
  :height: 356
38
107
  :landscape:
39
108
  :width: 480
40
109
  :height: 196
41
- :ipad:
42
- :user_agent: "Mozilla/5.0(iPad; U; CPU OS 8_1_1 like Mac OS X) AppleWebKit/600.14 (KHTML, like Gecko) Version/8.0 Mobile/12B435 Safari/9537.53"
110
+ :iphone4:
111
+ <<: *iphone4s
112
+ :ipad: &ipad
113
+ :user_agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15
114
+ :portrait:
115
+ :width: 810
116
+ :height: 1010
117
+ :landscape:
118
+ :width: 1080
119
+ :height: 740
120
+ :ipad_default:
121
+ <<: *ipad
122
+ :ipad_pro: &ipad_pro
123
+ <<: *ipad
124
+ :portrait:
125
+ :width: 1024
126
+ :height: 1292
127
+ :landscape:
128
+ :width: 1366
129
+ :height: 950
130
+ :ipad_pro_12:
131
+ <<: *ipad_pro
132
+ :ipad_pro_11:
133
+ <<: *ipad
134
+ :portrait:
135
+ :width: 834
136
+ :height: 1120
137
+ :landscape:
138
+ :width: 1194
139
+ :height: 760
140
+ :ipad_pro_9:
141
+ <<: *ipad
43
142
  :portrait:
44
143
  :width: 768
45
- :height: 960
144
+ :height: 954
46
145
  :landscape:
47
146
  :width: 1024
48
- :height: 704
147
+ :height: 698
148
+ :ipad_air: &ipad_air
149
+ <<: *ipad
150
+ :portrait:
151
+ :width: 834
152
+ :height: 1038
153
+ :landscape:
154
+ :width: 1112
155
+ :height: 760
156
+ :ipad_pro_10:
157
+ <<: *ipad_air
49
158
  :android_phone:
50
- :user_agent: "Mozilla/5.0 (Linux; U; Android 4.0.1; en-us; sdk Build/ICS_MR0) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"
159
+ :user_agent: Mozilla/5.0 (Linux; Android 10; Pixel) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Mobile Safari/537.36
51
160
  :portrait:
52
- :width: 320
53
- :height: 356
161
+ :width: 411
162
+ :height: 869
54
163
  :landscape:
55
- :width: 480
56
- :height: 196
164
+ :width: 869
165
+ :height: 411
57
166
  :android_tablet:
58
- :user_agent: "Mozilla/5.0 (Linux; U; Android 3.0; en-us; GT-P7100 Build/HRI83) AppleWebkit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13"
167
+ :user_agent: Mozilla/5.0 (Linux; Android 9; SAMSUNG SM-T865) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/10.1 Chrome/71.0.3578.99 Safari/537.36
59
168
  :portrait:
60
- :width: 768
61
- :height: 946
169
+ :width: 800
170
+ :height: 1280
62
171
  :landscape:
63
- :width: 1024
64
- :height: 690
172
+ :width: 1280
173
+ :height: 800
@@ -3,21 +3,22 @@ require 'webdriver-user-agent/driver'
3
3
 
4
4
  module Webdriver
5
5
  module UserAgent
6
- def self.driver options={}
7
- Driver.instance.for options
8
- end
6
+ class << self
7
+ def driver(options = {})
8
+ Driver.instance.for options
9
+ end
9
10
 
10
- def self.devices
11
- Driver.instance.devices
12
- end
11
+ def devices
12
+ Driver.instance.devices
13
+ end
13
14
 
14
- def self.resolution_for device_name, orientation
15
- Driver.instance.resolution_for device_name, orientation
16
- end
17
-
18
- def self.agent_string_for device
19
- Driver.instance.agent_string_for device
20
- end
15
+ def resolution_for(device_name, orientation)
16
+ Driver.instance.resolution_for device_name, orientation
17
+ end
21
18
 
19
+ def agent_string_for(device)
20
+ Driver.instance.agent_string_for device
21
+ end
22
+ end
22
23
  end
23
24
  end
@@ -2,6 +2,12 @@ require 'facets/hash/except'
2
2
 
3
3
  module Webdriver
4
4
  module UserAgent
5
+
6
+ MINIMUM_MACOS_VERSION_NUMBER = 12
7
+ DEFAULT_BROWSER = :firefox
8
+ DEFAULT_AGENT = :iphone
9
+ DEFAULT_ORIENTATION = :portrait
10
+
5
11
  class BrowserOptions
6
12
 
7
13
  def initialize(opts, user_agent_string)
@@ -9,7 +15,11 @@ module Webdriver
9
15
  options[:browser] ||= :firefox
10
16
  options[:agent] ||= :iphone
11
17
  options[:orientation] ||= :portrait
12
- initialize_for_browser(user_agent_string)
18
+ set_preview_option(options[:safari_technology_preview]) if (@options[:browser] == :safari)
19
+
20
+ options[:viewport_width], options[:viewport_height] = parse_viewport_sizes(options[:viewport_width], options[:viewport_height])
21
+
22
+ initialize_for_browser(user_agent_string, opts[:accept_language_string], opts[:options])
13
23
  end
14
24
 
15
25
  def method_missing(*args, &block)
@@ -20,7 +30,7 @@ module Webdriver
20
30
  end
21
31
 
22
32
  def browser_options
23
- options.except(:browser, :agent, :orientation, :user_agent_string)
33
+ options.except(:browser, :agent, :orientation, :user_agent_string, :accept_language_string, :viewport_width, :viewport_height, :safari_technology_preview)
24
34
  end
25
35
 
26
36
  private
@@ -29,19 +39,112 @@ module Webdriver
29
39
  @options ||= {}
30
40
  end
31
41
 
32
- def initialize_for_browser(user_agent_string)
42
+ def set_preview_option(opt)
43
+ @stp = opt
44
+ @stp = false unless @stp.is_a?(TrueClass)
45
+ end
46
+
47
+ def initialize_for_browser(user_agent_string, accept_language_string, driver_options = nil)
48
+ options[:options] ||= driver_options
49
+
33
50
  case options[:browser]
34
51
  when :firefox
35
- options[:profile] ||= Selenium::WebDriver::Firefox::Profile.new
36
- options[:profile]['general.useragent.override'] = user_agent_string
52
+ options[:options] ||= Selenium::WebDriver::Firefox::Options.new
53
+
54
+ profile ||= options[:options].profile || Selenium::WebDriver::Firefox::Profile.new
55
+ set_keys = profile.instance_variable_get(:@additional_prefs).keys
56
+
57
+ profile['general.useragent.override'] = user_agent_string if !set_keys.include?('general.useragent.override')
58
+ profile['intl.accept_languages'] = accept_language_string if accept_language_string && !set_keys.include?('intl.accept_languages')
59
+
60
+ options[:options].profile = profile
37
61
  when :chrome
38
- options[:switches] ||= []
39
- options[:switches] << "--user-agent=#{user_agent_string}"
62
+ options[:options] ||= Selenium::WebDriver::Chrome::Options.new
63
+
64
+ set_args = options[:options].args.map{|s| "#{s}"}.join(" ")
65
+ options[:options].add_argument "--user-agent=#{user_agent_string}" if !set_args.include?("--user-agent=")
66
+
67
+ set_prefs = options[:options].prefs.keys
68
+ options[:options].add_preference("intl.accept_languages", accept_language_string) if accept_language_string && !set_prefs.include?("intl.accept_languages")
69
+ when :safari
70
+ options[:options] ||= Selenium::WebDriver::Safari::Options.new
71
+ change_safari_user_agent_string(user_agent_string)
72
+ change_safari_language(accept_language_string) if accept_language_string
40
73
  else
41
- raise "WebDriver UserAgent currently only supports :firefox and :chrome."
74
+ raise "WebDriver UserAgent currently only supports :chrome, :firefox and :safari."
75
+ end
76
+ end
77
+
78
+ def parse_viewport_sizes(width, height)
79
+ return ["0","0"] unless "#{width}".to_i > 0 && "#{height}".to_i > 0
80
+
81
+ ["#{width}", "#{height}"]
82
+ end
83
+
84
+ def change_safari_user_agent_string(user_agent_string)
85
+ ua = "\"\\\"#{user_agent_string}\\\"\"" # escape for shell quoting
86
+
87
+ safari_command_runner(ua, "CustomUserAgent")
88
+ end
89
+
90
+ def change_safari_language(accept_language_string)
91
+ parsed_safari_string = prepare_safari_string(accept_language_string)
92
+
93
+ safari_command_runner(parsed_safari_string, "AppleLanguages")
94
+ end
95
+
96
+ def safari_command_runner(setting, pref)
97
+ raise "Safari requires a Mac" unless OS.mac?
98
+
99
+ cmd = "defaults write com.apple.#{safari_version} #{pref} #{setting}"
100
+ output = `#{cmd}`
101
+
102
+ raise prepare_safari_error_message(cmd, output) unless safari_command_success?(setting, safari_version, pref, $?)
103
+ end
104
+
105
+ def safari_command_success?(setting, safari_version, pref, result)
106
+ setting_chars = "#{setting}".gsub(/\W/, '')
107
+ read_chars = `defaults read com.apple.#{safari_version} #{pref}`.gsub(/\W/, '')
108
+
109
+ setting_match = (setting_chars == read_chars)
110
+ setting_match && result.success?
111
+ end
112
+
113
+ def safari_version
114
+ if @stp
115
+ Selenium::WebDriver::Safari.technology_preview!
116
+ return "SafariTechnologyPreview"
42
117
  end
43
-
118
+
119
+ "Safari"
44
120
  end
121
+
122
+ def prepare_safari_error_message(cmd, output)
123
+ error_message = "Unable to execute '#{cmd}'. "
124
+ error_message += "Error message reported: '#{output}'"
125
+ error_message += "Please execute the command manually and correct any errors."
126
+
127
+ error_message
128
+ end
129
+
130
+ def prepare_safari_string(accept_language_string)
131
+ ["'(", accept_language_string.split(",").map{|l|
132
+ "\"#{l.gsub(/\s+/,'')}\""
133
+ }.join(", "), ")'"].join('')
134
+ end
135
+
136
+ # Require a Mac at version 12 (Sierra) or greater
137
+ def require_mac_version
138
+ raise "Safari requires a Mac" unless OS.mac?
139
+ raise "Selenium only works with Safari on Sierra or newer" unless valid_mac_version?
140
+ end
141
+
142
+ def valid_mac_version?
143
+ version = "#{`defaults read loginwindow SystemVersionStampAsString`}"
144
+ version_number = "#{version.split(".")[1]}"
145
+ version_number.to_i >= MINIMUM_MACOS_VERSION_NUMBER
146
+ end
147
+
45
148
  end
46
149
  end
47
150
  end
@@ -3,12 +3,14 @@ require 'yaml'
3
3
  module Webdriver
4
4
  module UserAgent
5
5
  module Devices
6
-
6
+
7
7
  def devices
8
8
  YAML.load_file devices_file
9
9
  end
10
10
 
11
- def resolution_for(device_name, orientation)
11
+ def resolution_for(device_name, orientation, user_width, user_height)
12
+ return [user_width.to_i, user_height.to_i] if ((user_width.to_i + user_height.to_i) > 1)
13
+
12
14
  device = devices[device_name.downcase][orientation.downcase]
13
15
  [device[:width],device[:height]]
14
16
  end
@@ -21,7 +23,7 @@ module Webdriver
21
23
  end
22
24
 
23
25
  private
24
-
26
+
25
27
  def random_user_agent
26
28
  File.foreach(user_agents_file).each_with_index.reduce(nil) do |picked,pair|
27
29
  rand < 1.0/(1+pair[1]) ? pair[0] : picked
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+ require 'os'
2
3
  require 'selenium-webdriver'
3
4
  require 'webdriver-user-agent/browser_options'
4
5
  require 'webdriver-user-agent/devices'
@@ -14,27 +15,37 @@ module Webdriver
14
15
  user_agent_string ||= agent_string_for opts[:agent]
15
16
  options = BrowserOptions.new(opts, user_agent_string)
16
17
  build_driver_using options
18
+ ensure
19
+ if safari?(opts)
20
+ case
21
+ when opts[:safari_technology_preview].is_a?(TrueClass)
22
+ `defaults delete com.apple.SafariTechnologyPreview CustomUserAgent`
23
+ `defaults delete com.apple.SafariTechnologyPreview AppleLanguages`
24
+ else
25
+ `defaults delete com.apple.Safari CustomUserAgent`
26
+ `defaults delete com.apple.Safari AppleLanguages`
27
+ end
28
+ end
17
29
  end
18
30
 
19
31
  private
20
32
 
21
33
  def resize_inner_window(driver, width, height)
22
- if driver.browser == :firefox or :chrome
23
- driver.execute_script("window.open(#{driver.current_url.to_json},'_blank');")
24
- driver.close
25
- driver.switch_to.window driver.window_handles.first
26
- end
27
- driver.execute_script("window.innerWidth = #{width}; window.innerHeight = #{height};")
34
+ target_size = Selenium::WebDriver::Dimension.new(width.to_i, height.to_i)
35
+ driver.manage.window.resize_to target_size.width, target_size.height
28
36
  end
29
37
 
30
38
  def build_driver_using(options)
31
39
  driver = Selenium::WebDriver.for options.browser, options.browser_options
32
40
  unless options.agent == :random
33
- resize_inner_window(driver, *resolution_for(options.agent, options.orientation))
41
+ resize_inner_window(driver, *resolution_for(options.agent, options.orientation, options.viewport_width, options.viewport_height))
34
42
  end
35
43
  driver
36
44
  end
37
45
 
46
+ def safari?(o = {})
47
+ o[:browser] == :safari
48
+ end
38
49
  end
39
50
  end
40
51
  end
@@ -4,96 +4,385 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
4
  $LOAD_PATH.unshift(File.dirname(__FILE__))
5
5
  require 'webdriver-user-agent'
6
6
  require 'selenium-webdriver'
7
- require 'watir-webdriver'
7
+ require 'watir'
8
+ require 'webdrivers'
9
+
10
+ CHROMEBROWSER_UICHROME_HEIGHT = 123
11
+ CHROMEBROWSER_UICHROME_HEIGHT_TALL = 50
12
+ CHROMEBROWSER_UI_MINIMUM_HEIGHT = 289
13
+ FIREFOXBROWSER_UICHROME_HEIGHT = 74
14
+ FIREFOXBROWSER_MINIMUM_WIDTH = 450
15
+ SAFARIBROWSER_UICHROME_HEIGHT = 38
16
+
17
+ RSpec.shared_examples "browser driver" do
18
+ it "creates the browser driver" do
19
+ expect("#{driver.browser}").to match(/#{Regexp.quote(browser.to_s)}/i)
20
+ end
21
+
22
+ it "matches the agent partial" do
23
+ expect(driver.execute_script(agent_script)).to include agent_match
24
+ end
25
+ end
26
+
27
+ RSpec.shared_examples "random browser driver" do
28
+ it "creates the browser driver" do
29
+ expect("#{driver.browser}").to match(/#{Regexp.quote(browser.to_s)}/i)
30
+ end
31
+
32
+ it "matches the agent partial" do
33
+ expect(driver.execute_script(agent_script)).not_to be_nil
34
+ end
35
+ end
36
+
37
+ RSpec.shared_examples "firefox size" do
38
+ it "matches the expected width" do
39
+ width_expectation = device.dig(orientation, :width)
40
+ width_expectation = FIREFOXBROWSER_MINIMUM_WIDTH if width_expectation < FIREFOXBROWSER_MINIMUM_WIDTH
41
+ expect(driver.execute_script(width_script)).to eq(width_expectation)
42
+ end
43
+
44
+ it "matches the expected height" do
45
+ height_expectation = device.dig(orientation, :height) - FIREFOXBROWSER_UICHROME_HEIGHT
46
+ expect(driver.execute_script(height_script)).to eq(height_expectation)
47
+ end
48
+ end
49
+
50
+ RSpec.shared_examples "safari size" do
51
+ it "matches the expected width" do
52
+ width_expectation = device.dig(orientation, :width)
53
+ expect(driver.execute_script(width_script)).to eq(width_expectation)
54
+ end
55
+
56
+ it "matches the expected height" do
57
+ height_expectation = device.dig(orientation, :height) - SAFARIBROWSER_UICHROME_HEIGHT
58
+ expect(driver.execute_script(height_script)).to eq(height_expectation)
59
+ end
60
+ end
61
+
62
+ RSpec.shared_examples "chrome size" do
63
+ it "matches the expected width" do
64
+ width_expectation = device.dig(orientation, :width)
65
+ expect(driver.execute_script(width_script)).to eq(width_expectation)
66
+ end
67
+
68
+ it "matches the expected height" do
69
+ height_expectation = device.dig(orientation, :height) - CHROMEBROWSER_UICHROME_HEIGHT
70
+ expect(driver.execute_script(height_script)).to eq(height_expectation)
71
+ end
72
+ end
8
73
 
9
74
  describe "webdriver user agent" do
75
+ let(:devices) { Webdriver::UserAgent.devices }
76
+ let(:agent_script) { 'return navigator.userAgent' }
77
+ let(:width_script) { 'return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)' }
78
+ let(:height_script) { 'return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)' }
79
+
10
80
  after :each do
11
- @driver.quit if @driver
81
+ driver.quit if defined?(driver)
82
+ browser.close if defined?(browser) && browser&.is_a?(Watir::Browser)
83
+ sleep(0.5) # Safari needs time to shutdown
84
+ end
85
+
86
+ # window.innerWidth and window.innerHeight
87
+ # do not accurately provide
88
+ # browser widths and heights
89
+ # http://stackoverflow.com/a/8876069/1651458
90
+
91
+ context "no browser, agent or orientation set" do
92
+ let(:device) { devices[:iphone] }
93
+ let(:driver) { Webdriver::UserAgent.driver }
94
+ let(:browser) { "firefox" }
95
+ let(:orientation) { :portrait }
96
+ let(:agent_match) { 'iPhone' }
97
+
98
+ it_behaves_like "browser driver"
99
+ it_behaves_like "firefox size"
12
100
  end
13
101
 
14
- it "can create a new webdriver driver using firefox and iphone (portrait) by default" do
15
- @driver = Webdriver::UserAgent.driver
16
- expect(@driver.browser).to eq(:firefox)
17
- expect(@driver.execute_script('return navigator.userAgent')).to include 'iPhone'
18
- expect(@driver.execute_script('return window.innerWidth')).to eq(375)
19
- expect(@driver.execute_script('return window.innerHeight')).to eq(559)
102
+ context "Safari browser, iPhone 11 Pro Max agent, landscape orientation" do
103
+ let(:device) { devices[:iphone11promax] }
104
+ let(:orientation) { :landscape }
105
+ let(:driver) do
106
+ # Safari is a mess. safari_technology_preview added because
107
+ # Safari just isn't working in my environment as of 13.1 - Sam
108
+
109
+ Webdriver::UserAgent.driver(
110
+ browser: :safari,
111
+ agent: :iphone11promax,
112
+ orientation: orientation,
113
+ safari_technology_preview: true
114
+ )
115
+ end
116
+ let(:browser) { "safari" }
117
+ let(:orientation) { :landscape }
118
+ let(:agent_match) { 'iPhone' }
119
+
120
+ it_behaves_like "browser driver"
121
+ it_behaves_like "safari size"
20
122
  end
21
123
 
22
- it "can create a new webdriver driver using chrome and iphone 6 plus (landscape)" do
23
- @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :iphone6plus, :orientation => :landscape)
24
- expect(@driver.browser).to eq(:chrome)
25
- expect(@driver.execute_script('return navigator.userAgent')).to include 'iPhone'
26
- expect(@driver.execute_script('return window.innerWidth')).to eq(736)
27
- expect(@driver.execute_script('return window.innerHeight')).to eq(414)
124
+ context "Safari browser, iPhone 6 Plus agent, landscape orientation" do
125
+ let(:device) { devices[:iphone6plus] }
126
+ let(:orientation) { :landscape }
127
+ let(:driver) do
128
+ # Safari is a mess. safari_technology_preview added because
129
+ # Safari just isn't working in my environment as of 13.1 - Sam
130
+
131
+ Webdriver::UserAgent.driver(
132
+ browser: :safari,
133
+ agent: :iphone6plus,
134
+ orientation: orientation,
135
+ safari_technology_preview: true
136
+ )
137
+ end
138
+ let(:browser) { "safari" }
139
+ let(:agent_match) { 'iPhone' }
140
+
141
+ it_behaves_like "browser driver"
142
+ it_behaves_like "safari size"
28
143
  end
29
144
 
30
- it "can create a new webdriver driver using chrome and iPad (landscape)" do
31
- @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :iPad, :orientation => :landscape)
145
+ context "Chrome browser, iPhone XS agent, landscape orientation" do
146
+ let(:device_key) { :iphonexs }
147
+ let(:device) { devices[device_key] }
148
+ let(:orientation) { :landscape }
149
+ let(:driver) do
150
+ Webdriver::UserAgent.driver(
151
+ browser: :chrome,
152
+ agent: device_key,
153
+ orientation: orientation
154
+ )
155
+ end
156
+ let(:browser) { "chrome" }
157
+ let(:agent_match) { 'iPhone' }
158
+
159
+ it_behaves_like "browser driver"
160
+ it_behaves_like "chrome size"
161
+ end
162
+
163
+ context "Chrome browser, iPhone XS agent, landscape orientation" do
164
+ let(:device_key) { :ipad }
165
+ let(:device) { devices[device_key] }
166
+ let(:orientation) { :landscape }
167
+ let(:driver) do
168
+ Webdriver::UserAgent.driver(
169
+ browser: :chrome,
170
+ agent: device_key,
171
+ orientation: orientation
172
+ )
173
+ end
174
+ let(:browser) { "chrome" }
175
+ let(:agent_match) { 'Mac OS' }
176
+
177
+ it_behaves_like "browser driver"
178
+ it_behaves_like "chrome size"
179
+ end
180
+
181
+ it "can create a new webdriver driver using chrome and iPad Pro (portrait)" do
182
+ # Testing the height will fail if your monitor is not tall enough.
183
+ # For instance, a 15" MacBook Pro at default scaled resolution cannot be.
184
+ # This will determine if your monitor is tall enough.
185
+ # Optionally, you can override with an environment variable:
186
+ # `I_HAVE_A_TALL_MONITOR=true rspec spec/this_file.rb`
187
+ width = 800; height = 1302
188
+ @driver = Webdriver::UserAgent.driver(:viewport_width => "#{width}", :viewport_height => height, :agent => :desktop)
189
+ browser_max_height = @driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')
190
+ @you_have_a_tall_monitor = (browser_max_height > (1302 - CHROMEBROWSER_UICHROME_HEIGHT))
191
+ @you_have_a_tall_monitor = true if ("#{ENV['I_HAVE_A_TALL_MONITOR']}".downcase == 'true')
192
+ @driver.quit if @driver
193
+ # Back to your regularly scheduled test.
194
+
195
+ @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :ipad_pro, :orientation => :portrait)
32
196
  expect(@driver.browser).to eq(:chrome)
33
- expect(@driver.execute_script('return navigator.userAgent')).to include 'iPad'
34
- expect(@driver.execute_script('return window.innerWidth')).to eq(1024)
35
- expect(@driver.execute_script('return window.innerHeight')).to eq(704)
197
+ expect(@driver.execute_script('return navigator.userAgent')).to include 'Mac OS'
198
+ expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(1024)
199
+
200
+ # See above
201
+ if @you_have_a_tall_monitor
202
+ expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(1302 - CHROMEBROWSER_UICHROME_HEIGHT)
203
+ end
36
204
  end
37
-
38
- it "can create a new webdriver driver using firefox and android phone (landscape)" do
39
- @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :android_phone, :orientation => :landscape)
40
- expect(@driver.browser).to eq(:chrome)
41
- expect(@driver.execute_script('return navigator.userAgent')).to include 'Android'
42
- expect(@driver.execute_script('return window.innerWidth')).to eq(480)
43
- expect(@driver.execute_script('return window.innerHeight')).to eq(196)
205
+
206
+ context "Chrome browser, Android tablet agent, landscape orientation" do
207
+ let(:device_key) { :android_tablet }
208
+ let(:device) { devices[device_key] }
209
+ let(:orientation) { :landscape }
210
+ let(:driver) do
211
+ Webdriver::UserAgent.driver(
212
+ browser: :chrome,
213
+ agent: device_key,
214
+ orientation: orientation
215
+ )
216
+ end
217
+ let(:browser) { "chrome" }
218
+ let(:agent_match) { 'Android' }
219
+
220
+ it_behaves_like "browser driver"
221
+ it_behaves_like "chrome size"
44
222
  end
45
223
 
46
- it "can create a new webdriver driver using firefox and android tablet (portrait)" do
47
- @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :android_tablet, :orientation => :portrait)
48
- expect(@driver.browser).to eq(:chrome)
49
- expect(@driver.execute_script('return navigator.userAgent')).to include 'Android'
50
- expect(@driver.execute_script('return window.innerWidth')).to eq(768)
51
- expect(@driver.execute_script('return window.innerHeight')).to eq(946)
224
+ context "Firefox browser, desktop agent, landscape orientation" do
225
+ let(:device_key) { :desktop }
226
+ let(:device) { devices[device_key] }
227
+ let(:orientation) { :landscape }
228
+ let(:driver) do
229
+ Webdriver::UserAgent.driver(
230
+ browser: :firefox,
231
+ agent: device_key,
232
+ orientation: orientation
233
+ )
234
+ end
235
+ let(:browser) { "firefox" }
236
+ let(:agent_match) { 'Mac OS' }
237
+
238
+ it_behaves_like "browser driver"
239
+ it_behaves_like "firefox size"
52
240
  end
53
241
 
54
- it "can create a new webdriver driver using firefox and random user agent" do
55
- @driver = Webdriver::UserAgent.driver(:agent => :random)
56
- expect(@driver.browser).to eq(:firefox)
57
- expect(@driver.execute_script('return navigator.userAgent')).not_to be_nil
58
- expect(@driver.execute_script('return window.innerWidth')).not_to eq(320)
59
- expect(@driver.execute_script('return window.innerHeight')).not_to eq(356)
242
+ context "random agent" do
243
+ context "no specified browser" do
244
+ let(:device_key) { :random }
245
+ let(:driver) { Webdriver::UserAgent.driver(agent: device_key) }
246
+ let(:browser) { :firefox }
247
+
248
+ it_behaves_like "random browser driver"
249
+ end
250
+
251
+ context "chrome browser" do
252
+ let(:device_key) { :random }
253
+ let(:browser) { :chrome }
254
+ let(:driver) do
255
+ Webdriver::UserAgent.driver(browser: browser, agent: device_key)
256
+ end
257
+
258
+ it_behaves_like "random browser driver"
259
+ end
60
260
  end
61
261
 
62
- it "can create a new webdriver driver using chrome and random user agent" do
63
- @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :random)
64
- expect(@driver.browser).to eq(:chrome)
65
- expect(@driver.execute_script('return navigator.userAgent')).not_to be_nil
66
- expect(@driver.execute_script('return window.innerWidth')).not_to eq(320)
67
- expect(@driver.execute_script('return window.innerHeight')).not_to eq(356)
262
+ context "existing firefox profile" do
263
+ let(:device) { devices[:iphone] }
264
+ let(:profile) do
265
+ profile = Selenium::WebDriver::Firefox::Profile.new
266
+ profile["intl.accept_languages"] = "es-MX"
267
+ profile
268
+ end
269
+ let(:options) { Selenium::WebDriver::Firefox::Options.new(profile: profile) }
270
+ let(:browser) { :firefox }
271
+ let(:agent_match) { 'iPhone' }
272
+ let(:orientation) { :portrait }
273
+ let(:driver) { Webdriver::UserAgent.driver(browser: browser, options: options) }
274
+
275
+ it_behaves_like "browser driver"
276
+ it_behaves_like "firefox size"
277
+
278
+ it "absorbs the options' profile" do
279
+ expect(driver.execute_script("return (navigator.language || navigator.userLanguage)")).to include("es-MX")
280
+ end
68
281
  end
69
282
 
70
- it "can create a new webdriver driver using an existing firefox profile" do
71
- profile = Selenium::WebDriver::Firefox::Profile.new
72
- profile['browser.startup.homepage'] = "data:text/html,<title>hello</title>"
73
- @driver = Webdriver::UserAgent.driver(:browser => :firefox, :profile => profile)
74
- expect(@driver.browser).to eq(:firefox)
75
- expect(@driver.execute_script('return navigator.userAgent')).to include 'iPhone'
76
- expect(@driver.execute_script('return window.innerWidth')).to eq(375)
77
- expect(@driver.execute_script('return window.innerHeight')).to eq(559)
78
- expect(@driver.title).to eq('hello')
283
+ context "user-provided user agent string for firefox" do
284
+ let(:browser) { :firefox }
285
+ let(:user_agent) { "Mozilla/4.0 (compatible; MSIE 5.5b1; Mac_PowerPC)" }
286
+ let(:driver) { Webdriver::UserAgent.driver(user_agent_string: user_agent) }
287
+
288
+ it "can create a new webdriver driver" do
289
+ expect("#{driver.browser}").to match(/#{Regexp.quote(browser.to_s)}/i)
290
+
291
+ expect(driver.execute_script("return navigator.userAgent")).to include("Mac_PowerPC")
292
+ end
79
293
  end
80
-
81
- it "can create a new webdriver driver using firefox and user-specified user agent" do
82
- @driver = Webdriver::UserAgent.driver(:user_agent_string => "Mozilla/4.0 (compatible; MSIE 5.5b1; Mac_PowerPC)")
83
- expect(@driver.browser).to eq(:firefox)
84
- expect(@driver.execute_script('return navigator.userAgent')).not_to be_nil
85
-
86
- @browser = Watir::Browser.new @driver
87
- expect(@browser.url).to eq("about:blank")
88
- end
89
294
 
90
- it "can allow using selenium driver for watir browser" do
91
- @driver = Webdriver::UserAgent.driver(:browser => :firefox, :agent => :iphone, :orientation => :portrait)
92
- @browser = Watir::Browser.new @driver
93
- expect(@browser.url).to eq("about:blank")
295
+ context "user-provided accept language string for firefox" do
296
+ let(:browser) { :firefox }
297
+ let(:language) { "es-ES, es-MX;q=0.9, es;q=0.5, *;0.4" }
298
+ let(:driver) { Webdriver::UserAgent.driver(accept_language_string: language) }
299
+
300
+ it "can create a new webdriver driver" do
301
+ expect("#{driver.browser}").to match(/#{Regexp.quote(browser.to_s)}/i)
302
+
303
+ expect(driver.execute_script("return (navigator.language || navigator.userLanguage)")).to include("es-ES")
304
+ end
94
305
  end
95
306
 
307
+ context "user-provided accept language string for safari" do
308
+ let(:browser) { :safari }
309
+ let(:language) { "es-ES, es-MX;q=0.9, es;q=0.5, *;0.4" }
310
+ let(:driver) {
311
+ Webdriver::UserAgent.driver(
312
+ browser: browser,
313
+ accept_language_string: language,
314
+ safari_technology_preview: true
315
+ )
316
+ }
317
+
318
+ it "can create a new webdriver driver" do
319
+ expect("#{driver.browser}").to match(/#{Regexp.quote(browser.to_s)}/i)
96
320
 
321
+ expect(driver.execute_script("return (navigator.language || navigator.userLanguage)")).to include("es-es")
322
+ end
323
+ end
97
324
 
325
+ context "user-provided viewport size and agent for firefox" do
326
+ let(:browser) { :firefox }
327
+ let(:device_key) { :iphone11 }
328
+ let(:device) { devices[device_key] }
329
+ let(:width) { 800 }
330
+ let(:height) { 600 }
331
+ let(:agent_match) { 'iPhone' }
332
+ let(:orientation) { :portrait }
333
+ let(:driver) {
334
+ Webdriver::UserAgent.driver(
335
+ viewport_width: "#{width}",
336
+ viewport_height: height,
337
+ agent: device_key
338
+ )
339
+ }
98
340
 
99
- end
341
+ it_behaves_like "browser driver"
342
+ it "uses user-provided dimensions" do
343
+ expect(driver.execute_script(width_script)).to eq(width)
344
+ expect(driver.execute_script(height_script)).to eq(height - FIREFOXBROWSER_UICHROME_HEIGHT)
345
+ end
346
+ end
347
+
348
+ context "user-provided nonsense viewport size for firefox" do
349
+ let(:browser) { :firefox }
350
+ let(:device_key) { :iphone8 }
351
+ let(:device) { devices[device_key] }
352
+ let(:width) { "xyz" }
353
+ let(:agent_match) { 'iPhone' }
354
+ let(:orientation) { :portrait }
355
+ let(:driver) {
356
+ Webdriver::UserAgent.driver(
357
+ viewport_width: "#{width}",
358
+ agent: device_key
359
+ )
360
+ }
361
+
362
+ it_behaves_like "browser driver"
363
+ it_behaves_like "firefox size"
364
+ end
365
+
366
+ context "portrait firefox iphone" do
367
+ let(:browser) { :firefox }
368
+ let(:device_key) { :iphone }
369
+ let(:device) { devices[device_key] }
370
+ let(:width) { "xyz" }
371
+ let(:agent_match) { 'iPhone' }
372
+ let(:orientation) { :portrait }
373
+ let(:driver) {
374
+ Webdriver::UserAgent.driver(
375
+ agent: device_key,
376
+ browser: browser,
377
+ orientation: orientation
378
+ )
379
+ }
380
+
381
+ it "can create a browser using the driver" do
382
+ browser = Watir::Browser.new(driver)
383
+
384
+ expect(browser).to be_a(Watir::Browser)
385
+ expect(browser.url).to be_a(String)
386
+ end
387
+ end
388
+ end
@@ -1,8 +1,8 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  Gem::Specification.new do |gem|
4
- gem.authors = ["Alister Scott", "Jeff Morgan"]
5
- gem.email = ["alister.scott@gmail.com", "jeff.morgan@leandog.com"]
4
+ gem.authors = ["Alister Scott", "Jeff Morgan", "Sandeep Singh", "Sam Nissen"]
5
+ gem.email = ["alister.scott@gmail.com", "jeff.morgan@leandog.com", "sandeepnagra@gmail.com", "scnissen@gmail.com"]
6
6
  gem.description = %q{A helper gem to emulate populate device user agents and resolutions when using webdriver}
7
7
  gem.summary = %q{A helper gem to emulate populate device user agents and resolutions when using webdriver}
8
8
  gem.homepage = "https://github.com/alisterscott/webdriver-user-agent"
@@ -12,11 +12,16 @@ Gem::Specification.new do |gem|
12
12
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
13
  gem.name = "webdriver-user-agent"
14
14
  gem.require_paths = ["lib"]
15
- gem.version = "7.2"
16
- gem.add_dependency 'selenium-webdriver'
15
+ gem.version = "7.8"
16
+ gem.requirements << 'chromedriver, v2.20'
17
+ # chromedriver v2.19 causes
18
+ # Selenium::WebDriver::Error::NoSuchDriverError: no such session errors
19
+ gem.add_dependency 'selenium-webdriver', '>= 3.4.0'
20
+ gem.add_dependency 'os'
17
21
  gem.add_dependency 'facets'
18
22
  gem.add_dependency 'json'
23
+ gem.add_dependency 'psych'
19
24
  gem.add_development_dependency 'rspec'
20
- gem.add_development_dependency 'watir-webdriver'
21
-
25
+ gem.add_development_dependency 'watir'
26
+ gem.add_development_dependency 'webdrivers'
22
27
  end
metadata CHANGED
@@ -1,95 +1,128 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webdriver-user-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: '7.2'
5
- prerelease:
4
+ version: '7.8'
6
5
  platform: ruby
7
6
  authors:
8
7
  - Alister Scott
9
8
  - Jeff Morgan
9
+ - Sandeep Singh
10
+ - Sam Nissen
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2014-12-12 00:00:00.000000000 Z
14
+ date: 2020-07-10 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: selenium-webdriver
17
18
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
19
  requirements:
20
- - - ! '>='
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 3.4.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 3.4.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: os
32
+ requirement: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
21
35
  - !ruby/object:Gem::Version
22
36
  version: '0'
23
37
  type: :runtime
24
38
  prerelease: false
25
39
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
40
  requirements:
28
- - - ! '>='
41
+ - - ">="
29
42
  - !ruby/object:Gem::Version
30
43
  version: '0'
31
44
  - !ruby/object:Gem::Dependency
32
45
  name: facets
33
46
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
47
  requirements:
36
- - - ! '>='
48
+ - - ">="
37
49
  - !ruby/object:Gem::Version
38
50
  version: '0'
39
51
  type: :runtime
40
52
  prerelease: false
41
53
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
54
  requirements:
44
- - - ! '>='
55
+ - - ">="
45
56
  - !ruby/object:Gem::Version
46
57
  version: '0'
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: json
49
60
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
61
  requirements:
52
- - - ! '>='
62
+ - - ">="
53
63
  - !ruby/object:Gem::Version
54
64
  version: '0'
55
65
  type: :runtime
56
66
  prerelease: false
57
67
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
68
  requirements:
60
- - - ! '>='
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ - !ruby/object:Gem::Dependency
73
+ name: psych
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
61
84
  - !ruby/object:Gem::Version
62
85
  version: '0'
63
86
  - !ruby/object:Gem::Dependency
64
87
  name: rspec
65
88
  requirement: !ruby/object:Gem::Requirement
66
- none: false
67
89
  requirements:
68
- - - ! '>='
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ type: :development
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ - !ruby/object:Gem::Dependency
101
+ name: watir
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
69
105
  - !ruby/object:Gem::Version
70
106
  version: '0'
71
107
  type: :development
72
108
  prerelease: false
73
109
  version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
110
  requirements:
76
- - - ! '>='
111
+ - - ">="
77
112
  - !ruby/object:Gem::Version
78
113
  version: '0'
79
114
  - !ruby/object:Gem::Dependency
80
- name: watir-webdriver
115
+ name: webdrivers
81
116
  requirement: !ruby/object:Gem::Requirement
82
- none: false
83
117
  requirements:
84
- - - ! '>='
118
+ - - ">="
85
119
  - !ruby/object:Gem::Version
86
120
  version: '0'
87
121
  type: :development
88
122
  prerelease: false
89
123
  version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
124
  requirements:
92
- - - ! '>='
125
+ - - ">="
93
126
  - !ruby/object:Gem::Version
94
127
  version: '0'
95
128
  description: A helper gem to emulate populate device user agents and resolutions when
@@ -97,14 +130,16 @@ description: A helper gem to emulate populate device user agents and resolutions
97
130
  email:
98
131
  - alister.scott@gmail.com
99
132
  - jeff.morgan@leandog.com
133
+ - sandeepnagra@gmail.com
134
+ - scnissen@gmail.com
100
135
  executables: []
101
136
  extensions: []
102
137
  extra_rdoc_files: []
103
138
  files:
104
- - .gitignore
105
- - .rspec
106
- - .ruby-gemset
107
- - .ruby-version
139
+ - ".gitignore"
140
+ - ".rspec"
141
+ - ".ruby-gemset"
142
+ - ".ruby-version"
108
143
  - ChangeLog
109
144
  - Gemfile
110
145
  - HISTORY.md
@@ -122,27 +157,26 @@ files:
122
157
  - webdriver-user-agent.gemspec
123
158
  homepage: https://github.com/alisterscott/webdriver-user-agent
124
159
  licenses: []
160
+ metadata: {}
125
161
  post_install_message:
126
162
  rdoc_options: []
127
163
  require_paths:
128
164
  - lib
129
165
  required_ruby_version: !ruby/object:Gem::Requirement
130
- none: false
131
166
  requirements:
132
- - - ! '>='
167
+ - - ">="
133
168
  - !ruby/object:Gem::Version
134
169
  version: '0'
135
170
  required_rubygems_version: !ruby/object:Gem::Requirement
136
- none: false
137
171
  requirements:
138
- - - ! '>='
172
+ - - ">="
139
173
  - !ruby/object:Gem::Version
140
174
  version: '0'
141
- requirements: []
142
- rubyforge_project:
143
- rubygems_version: 1.8.25
175
+ requirements:
176
+ - chromedriver, v2.20
177
+ rubygems_version: 3.1.2
144
178
  signing_key:
145
- specification_version: 3
179
+ specification_version: 4
146
180
  summary: A helper gem to emulate populate device user agents and resolutions when
147
181
  using webdriver
148
182
  test_files: