webdriver-user-agent 7.6 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9589c34ef3fbb25e386f2c5b654f21564afe66a47c89dec46f78dff7cadb70e2
4
- data.tar.gz: 44f41c6fabde58f65d1598813fe63ed659b5b430972b23fd9f08349251780f0a
3
+ metadata.gz: 1f103f486777f7dffc40b6177cbd52c1ed13826daf41c500f8f69f1869e71c6f
4
+ data.tar.gz: 4844156cef409e1c77d5e4610b3e51e1c995954edc3e0823fd4651255b5372fd
5
5
  SHA512:
6
- metadata.gz: c07dacc751fdb9793a8d932d3fa11e468d2c10b940f52d0b3c9569fc3dec97b827012ae515ffc7c0c90b3b5d45ec76630cdd7464c14c3e7e8fde3d7fe921c1be
7
- data.tar.gz: 8045ac3e0b908bb49609aa31ae7d00c7c98c5d8f8c59edfb8cfa92a1171df4906749255726c36446ab3e2e3f3e01013c10d1e9624968baab503ea917c610ef11
6
+ metadata.gz: 1f297ddcf8064c4c6a37c550f0bf2ea57e4d3ca6cc60856315f9656b15426ca36357173ac87b246dde72d8f9d9f05d929f35aa82ee6f72461d47409556bdfa23
7
+ data.tar.gz: 69368f91ffb7b262a7b45161dc4099fa80230d4bca0792b7d1baf80d130e1876850a970dce3b79b2dbae926eddd257dcf7a2ca0584a8cf329f27966941c1b978
@@ -1,9 +1,20 @@
1
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
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.
5
16
  :desktop:
6
- :user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Version/8.0.8 Safari/600.8.9"
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
7
18
  :portrait:
8
19
  :width: 768
9
20
  :height: 1024
@@ -11,26 +22,28 @@
11
22
  :width: 1366
12
23
  :height: 768
13
24
  :iphone_default: &iphone_default
14
- :user_agent: "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1"
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
15
26
  :portrait:
16
- :width: 375
17
- :height: 635
27
+ :width: 414
28
+ :height: 719
18
29
  :landscape:
19
- :width: 724
20
- :height: 375
30
+ :width: 808
31
+ :height: 414
21
32
  :iphone: &iphone
22
- <<: *iphone_default
23
- :iphonex:
24
33
  <<: *iphone_default
25
- :iphone8plus: &iphone8plus
34
+ :iphone11pro:
26
35
  <<: *iphone_default
27
36
  :portrait:
28
- :width: 414
29
- :height: 622
37
+ :width: 375
38
+ :height: 635
30
39
  :landscape:
31
- :width: 736
32
- :height: 414
33
- :iphone8: &iphone8
40
+ :width: 724
41
+ :height: 375
42
+ :iphone11promax:
43
+ <<: *iphone_default
44
+ :iphone11:
45
+ <<: *iphone_default
46
+ :iphonese: &iphonese
34
47
  <<: *iphone_default
35
48
  :portrait:
36
49
  :width: 375
@@ -38,11 +51,34 @@
38
51
  :landscape:
39
52
  :width: 667
40
53
  :height: 375
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
41
78
  :iphone7plus:
42
79
  <<: *iphone8plus
43
80
  :iphone7:
44
81
  <<: *iphone8
45
- :portrait:
46
82
  :iphone6splus:
47
83
  <<: *iphone8plus
48
84
  :iphone6s:
@@ -59,7 +95,7 @@
59
95
  :landscape:
60
96
  :width: 568
61
97
  :height: 320
62
- :iphonese:
98
+ :iphonese_old:
63
99
  <<: *iphone5s
64
100
  :iphone5:
65
101
  <<: *iphone5s
@@ -74,33 +110,33 @@
74
110
  :iphone4:
75
111
  <<: *iphone4s
76
112
  :ipad: &ipad
77
- :user_agent: "Mozilla/5.0 (iPad; CPU OS 11_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1"
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
78
114
  :portrait:
79
- :width: 768
80
- :height: 954
115
+ :width: 810
116
+ :height: 1010
81
117
  :landscape:
82
- :width: 1024
83
- :height: 698
118
+ :width: 1080
119
+ :height: 740
84
120
  :ipad_default:
85
121
  <<: *ipad
86
122
  :ipad_pro: &ipad_pro
87
123
  <<: *ipad
88
124
  :portrait:
89
125
  :width: 1024
90
- :height: 1296
126
+ :height: 1292
91
127
  :landscape:
92
128
  :width: 1366
93
- :height: 954
129
+ :height: 950
94
130
  :ipad_pro_12:
95
131
  <<: *ipad_pro
96
- :ipad_pro_10:
132
+ :ipad_pro_11:
97
133
  <<: *ipad
98
134
  :portrait:
99
135
  :width: 834
100
- :height: 1042
136
+ :height: 1120
101
137
  :landscape:
102
- :width: 1112
103
- :height: 764
138
+ :width: 1194
139
+ :height: 760
104
140
  :ipad_pro_9:
105
141
  <<: *ipad
106
142
  :portrait:
@@ -109,19 +145,29 @@
109
145
  :landscape:
110
146
  :width: 1024
111
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
112
158
  :android_phone:
113
- :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
114
160
  :portrait:
115
- :width: 320
116
- :height: 356
161
+ :width: 411
162
+ :height: 869
117
163
  :landscape:
118
- :width: 480
119
- :height: 196
164
+ :width: 869
165
+ :height: 411
120
166
  :android_tablet:
121
- :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
122
168
  :portrait:
123
- :width: 768
124
- :height: 946
169
+ :width: 800
170
+ :height: 1280
125
171
  :landscape:
126
- :width: 1024
127
- :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
@@ -19,7 +19,7 @@ module Webdriver
19
19
 
20
20
  options[:viewport_width], options[:viewport_height] = parse_viewport_sizes(options[:viewport_width], options[:viewport_height])
21
21
 
22
- initialize_for_browser(user_agent_string, opts[:accept_language_string])
22
+ initialize_for_browser(user_agent_string, opts[:accept_language_string], opts[:options])
23
23
  end
24
24
 
25
25
  def method_missing(*args, &block)
@@ -44,23 +44,32 @@ module Webdriver
44
44
  @stp = false unless @stp.is_a?(TrueClass)
45
45
  end
46
46
 
47
- def initialize_for_browser(user_agent_string, accept_language_string)
47
+ def initialize_for_browser(user_agent_string, accept_language_string, driver_options = nil)
48
+ options[:options] ||= driver_options
49
+
48
50
  case options[:browser]
49
51
  when :firefox
50
- profile ||= Selenium::WebDriver::Firefox::Profile.new
51
- profile['general.useragent.override'] = user_agent_string
52
- profile['intl.accept_languages'] = accept_language_string if accept_language_string
53
-
54
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
+
55
60
  options[:options].profile = profile
56
61
  when :chrome
57
62
  options[:options] ||= Selenium::WebDriver::Chrome::Options.new
58
- options[:options].add_argument "--user-agent=#{user_agent_string}"
59
- options[:options].add_preference("intl.accept_languages", accept_language_string) if accept_language_string
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")
60
69
  when :safari
70
+ options[:options] ||= Selenium::WebDriver::Safari::Options.new
61
71
  change_safari_user_agent_string(user_agent_string)
62
72
  change_safari_language(accept_language_string) if accept_language_string
63
- options
64
73
  else
65
74
  raise "WebDriver UserAgent currently only supports :chrome, :firefox and :safari."
66
75
  end
@@ -88,10 +97,17 @@ module Webdriver
88
97
  raise "Safari requires a Mac" unless OS.mac?
89
98
 
90
99
  cmd = "defaults write com.apple.#{safari_version} #{pref} #{setting}"
91
-
92
100
  output = `#{cmd}`
93
101
 
94
- raise prepare_safari_error_message(cmd, output) unless $?.success?
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?
95
111
  end
96
112
 
97
113
  def safari_version
@@ -9,14 +9,78 @@ require 'webdrivers'
9
9
 
10
10
  CHROMEBROWSER_UICHROME_HEIGHT = 123
11
11
  CHROMEBROWSER_UICHROME_HEIGHT_TALL = 50
12
- CHROMEBROWSER_UI_MINIMUM_HEIGHT = 149
12
+ CHROMEBROWSER_UI_MINIMUM_HEIGHT = 289
13
13
  FIREFOXBROWSER_UICHROME_HEIGHT = 74
14
+ FIREFOXBROWSER_MINIMUM_WIDTH = 450
14
15
  SAFARIBROWSER_UICHROME_HEIGHT = 38
15
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
73
+
16
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
+
17
80
  after :each do
18
- @browser.close if @browser rescue nil
19
- @driver.quit if @driver rescue nil
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
20
84
  end
21
85
 
22
86
  # window.innerWidth and window.innerHeight
@@ -24,37 +88,94 @@ describe "webdriver user agent" do
24
88
  # browser widths and heights
25
89
  # http://stackoverflow.com/a/8876069/1651458
26
90
 
27
- it "can create a new webdriver driver using firefox and iphone (portrait) by default" do
28
- @driver = Webdriver::UserAgent.driver
29
- expect(@driver.browser).to eq(:firefox)
30
- expect(@driver.execute_script('return navigator.userAgent')).to include 'iPhone'
31
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(375)
32
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(635 - FIREFOXBROWSER_UICHROME_HEIGHT)
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"
33
100
  end
34
101
 
35
- it "can create a new webdriver driver using safari and iphone 6 plus, and landscape" do
36
- @driver = Webdriver::UserAgent.driver(:browser => :safari, :agent => :iphone6plus, :orientation => :landscape)
37
- expect("#{@driver.browser}").to match(/safari/i)
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"
122
+ end
38
123
 
39
- expect(@driver.execute_script('return navigator.userAgent')).to include 'iPhone'
40
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(736)
41
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(414 - SAFARIBROWSER_UICHROME_HEIGHT)
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"
42
143
  end
43
144
 
44
- it "can create a new webdriver driver using chrome and iphone 6 plus (landscape)" do
45
- @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :iphone6plus, :orientation => :landscape)
46
- expect(@driver.browser).to eq(:chrome)
47
- expect(@driver.execute_script('return navigator.userAgent')).to include 'iPhone'
48
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(736)
49
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(414 - CHROMEBROWSER_UICHROME_HEIGHT)
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"
50
161
  end
51
162
 
52
- it "can create a new webdriver driver using chrome and iPad (landscape)" do
53
- @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :ipad, :orientation => :landscape)
54
- expect(@driver.browser).to eq(:chrome)
55
- expect(@driver.execute_script('return navigator.userAgent')).to include 'iPad'
56
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(1024)
57
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(698 - CHROMEBROWSER_UICHROME_HEIGHT)
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"
58
179
  end
59
180
 
60
181
  it "can create a new webdriver driver using chrome and iPad Pro (portrait)" do
@@ -73,124 +194,195 @@ describe "webdriver user agent" do
73
194
 
74
195
  @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :ipad_pro, :orientation => :portrait)
75
196
  expect(@driver.browser).to eq(:chrome)
76
- expect(@driver.execute_script('return navigator.userAgent')).to include 'iPad'
197
+ expect(@driver.execute_script('return navigator.userAgent')).to include 'Mac OS'
77
198
  expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(1024)
78
199
 
79
200
  # See above
80
201
  if @you_have_a_tall_monitor
81
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(1302 - CHROMEBROWSER_UICHROME_HEIGHT)
82
- end
83
- end
84
-
85
- it "can create a new webdriver driver using firefox and android phone (landscape)" do
86
- @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :android_phone, :orientation => :landscape)
87
- expect(@driver.browser).to eq(:chrome)
88
- expect(@driver.execute_script('return navigator.userAgent')).to include 'Android'
89
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(480)
90
-
91
- # Chrome is apparently setting some kind of minimum height
92
- # As seen on Chrome v42 on OS X Yosimite
93
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(CHROMEBROWSER_UI_MINIMUM_HEIGHT)
94
-
202
+ expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(1302 - CHROMEBROWSER_UICHROME_HEIGHT)
203
+ end
95
204
  end
96
205
 
97
- it "can create a new webdriver driver using chrome and android tablet (portrait)" do
98
- @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :android_tablet, :orientation => :portrait)
99
- expect(@driver.browser).to eq(:chrome)
100
- expect(@driver.execute_script('return navigator.userAgent')).to include 'Android'
101
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(768)
102
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(873 - CHROMEBROWSER_UICHROME_HEIGHT_TALL)
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"
103
222
  end
104
223
 
105
- it "can create a new webdriver driver using firefox and desktop (landscape)" do
106
- @driver = Webdriver::UserAgent.driver(:browser => :firefox, :agent => :desktop, :orientation => :landscape)
107
- expect(@driver.browser).to eq(:firefox)
108
- expect(@driver.execute_script('return navigator.userAgent')).to include 'Mac OS X'
109
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(1366)
110
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(768 - FIREFOXBROWSER_UICHROME_HEIGHT)
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"
111
240
  end
112
241
 
113
- it "can create a new webdriver driver using firefox and random user agent" do
114
- @driver = Webdriver::UserAgent.driver(:agent => :random)
115
- expect(@driver.browser).to eq(:firefox)
116
- expect(@driver.execute_script('return navigator.userAgent')).not_to be_nil
117
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).not_to eq(320)
118
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).not_to eq(356 - FIREFOXBROWSER_UICHROME_HEIGHT)
119
- end
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 }
120
247
 
121
- it "can create a new webdriver driver using chrome and random user agent" do
122
- @driver = Webdriver::UserAgent.driver(:browser => :chrome, :agent => :random)
123
- expect(@driver.browser).to eq(:chrome)
124
- expect(@driver.execute_script('return navigator.userAgent')).not_to be_nil
125
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).not_to eq(320)
126
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).not_to eq(356 - CHROMEBROWSER_UICHROME_HEIGHT)
127
- end
248
+ it_behaves_like "random browser driver"
249
+ end
128
250
 
129
- it "can create a new webdriver driver using an existing firefox profile" do
130
- profile = Selenium::WebDriver::Firefox::Profile.new
131
- profile['browser.startup.homepage'] = "data:text/html,<title>hello</title>"
132
- options = Selenium::WebDriver::Firefox::Options.new
133
- options.profile = profile
134
- @driver = Webdriver::UserAgent.driver(:browser => :firefox, options: options)
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
135
257
 
136
- expect(@driver.browser).to eq(:firefox)
137
- expect(@driver.execute_script('return navigator.userAgent')).to include 'iPhone'
138
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(375)
139
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(635 - FIREFOXBROWSER_UICHROME_HEIGHT)
258
+ it_behaves_like "random browser driver"
259
+ end
140
260
  end
141
261
 
142
- it "can create a new webdriver driver using firefox and user-specified user agent" do
143
- @driver = Webdriver::UserAgent.driver(:user_agent_string => "Mozilla/4.0 (compatible; MSIE 5.5b1; Mac_PowerPC)")
144
- expect(@driver.browser).to eq(:firefox)
145
- expect(@driver.execute_script('return navigator.userAgent')).to include 'Mac_PowerPC'
146
-
147
- @browser = Watir::Browser.new @driver
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
148
281
  end
149
282
 
150
- it "can create a new webdriver driver using firefox and user-specified language" do
151
- @driver = Webdriver::UserAgent.driver(accept_language_string: "es-ES, es-MX;q=0.9, es;q=0.5, *;0.4")
152
- expect(@driver.browser).to eq(:firefox)
153
- expect(@driver.execute_script('return navigator.language')).to include 'es-ES'
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) }
154
287
 
155
- @browser = Watir::Browser.new @driver
156
- end
288
+ it "can create a new webdriver driver" do
289
+ expect("#{driver.browser}").to match(/#{Regexp.quote(browser.to_s)}/i)
157
290
 
158
- it "can create a new webdriver driver using firefox and user-specified language" do
159
- @driver = Webdriver::UserAgent.driver(browser: :chrome, accept_language_string: "es-ES, es-MX;q=0.9, es;q=0.5, *;0.4")
160
- expect(@driver.browser).to eq(:chrome)
161
- expect(@driver.execute_script('return navigator.language')).to include 'es-ES'
162
-
163
- @browser = Watir::Browser.new @driver
291
+ expect(driver.execute_script("return navigator.userAgent")).to include("Mac_PowerPC")
292
+ end
164
293
  end
165
294
 
166
- it "can create a new webdriver driver using firefox and user-specified language" do
167
- @driver = Webdriver::UserAgent.driver(browser: :safari, accept_language_string: "es-ES, es-MX;q=0.9, es;q=0.5, *;0.4", safari_technology_preview: true)
168
- expect(@driver.browser).to match(/safari/i)
169
- expect(@driver.execute_script('return navigator.language')).to include 'es-ES'
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) }
170
299
 
171
- @browser = Watir::Browser.new @driver
172
- end
300
+ it "can create a new webdriver driver" do
301
+ expect("#{driver.browser}").to match(/#{Regexp.quote(browser.to_s)}/i)
173
302
 
174
- it "can create a new webdriver driver using firefox and user-specified viewport sizes (string or int)" do
175
- width = 800
176
- height = 600
303
+ expect(driver.execute_script("return (navigator.language || navigator.userLanguage)")).to include("es-ES")
304
+ end
305
+ end
177
306
 
178
- @driver = Webdriver::UserAgent.driver(:viewport_width => "#{width}", :viewport_height => height, :agent => :iphone6)
179
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(800)
180
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(600 - FIREFOXBROWSER_UICHROME_HEIGHT)
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)
320
+
321
+ expect(driver.execute_script("return (navigator.language || navigator.userLanguage)")).to include("es-es")
322
+ end
181
323
  end
182
324
 
183
- it "can create a new webdriver driver, handling for nonsense height and widths" do
184
- @driver = Webdriver::UserAgent.driver(:viewport_width => "abc", :agent => :iphone8)
185
- expect(@driver.execute_script('return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)')).to eq(375)
186
- expect(@driver.execute_script('return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)')).to eq(553 - FIREFOXBROWSER_UICHROME_HEIGHT)
187
- end
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
+ }
340
+
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
188
347
 
189
- it "can allow using selenium driver for watir browser" do
190
- @driver = Webdriver::UserAgent.driver(:browser => :firefox, :agent => :iphone, :orientation => :portrait)
191
- @browser = Watir::Browser.new @driver
192
- expect(@browser).to be_a(Watir::Browser)
193
- expect(@browser.url).to be_a(String)
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"
194
364
  end
195
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
196
388
  end
@@ -12,7 +12,7 @@ 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.6"
15
+ gem.version = "7.8"
16
16
  gem.requirements << 'chromedriver, v2.20'
17
17
  # chromedriver v2.19 causes
18
18
  # Selenium::WebDriver::Error::NoSuchDriverError: no such session errors
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webdriver-user-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: '7.6'
4
+ version: '7.8'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alister Scott
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2019-02-11 00:00:00.000000000 Z
14
+ date: 2020-07-10 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: selenium-webdriver
@@ -174,8 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
174
174
  version: '0'
175
175
  requirements:
176
176
  - chromedriver, v2.20
177
- rubyforge_project:
178
- rubygems_version: 2.7.7
177
+ rubygems_version: 3.1.2
179
178
  signing_key:
180
179
  specification_version: 4
181
180
  summary: A helper gem to emulate populate device user agents and resolutions when