webdriver-user-agent 7.6 → 7.8

Sign up to get free protection for your applications and to get access to all the features.
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