cuprite 0.18 → 0.20

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,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Capybara
4
+ module Cuprite
5
+ module Devices
6
+ IPHONE_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1"
7
+ SAMSUNG_GALAXY_S8_PLUS_USER_AGENT = "Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
8
+ WINDOWS_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Safari/537.36"
9
+
10
+ LIST = {
11
+ iphone_se: {
12
+ window_size: [375, 667], scale_factor: 2, mobile: true,
13
+ user_agent: IPHONE_USER_AGENT
14
+ },
15
+ iphone_xr: {
16
+ window_size: [414, 896], scale_factor: 2, mobile: true,
17
+ user_agent: IPHONE_USER_AGENT
18
+ },
19
+ iphone_12_pro: {
20
+ window_size: [390, 844], scale_factor: 3, mobile: true,
21
+ user_agent: IPHONE_USER_AGENT
22
+ },
23
+ iphone_14: {
24
+ window_size: [390, 844], scale_factor: 3, mobile: true,
25
+ user_agent: IPHONE_USER_AGENT
26
+ },
27
+ iphone_14_plus: {
28
+ window_size: [428, 926], scale_factor: 3, mobile: true,
29
+ user_agent: IPHONE_USER_AGENT
30
+ },
31
+ iphone_14_pro: {
32
+ window_size: [393, 852], scale_factor: 3, mobile: true,
33
+ user_agent: IPHONE_USER_AGENT
34
+ },
35
+ iphone_14_pro_max: {
36
+ window_size: [430, 932], scale_factor: 3, mobile: true,
37
+ user_agent: IPHONE_USER_AGENT
38
+ },
39
+ iphone_15: {
40
+ window_size: [393, 852], scale_factor: 3, mobile: true,
41
+ user_agent: IPHONE_USER_AGENT
42
+ },
43
+ iphone_15_plus: {
44
+ window_size: [430, 932], scale_factor: 3, mobile: true,
45
+ user_agent: IPHONE_USER_AGENT
46
+ },
47
+ iphone_15_pro: {
48
+ window_size: [393, 852], scale_factor: 3, mobile: true,
49
+ user_agent: IPHONE_USER_AGENT
50
+ },
51
+ iphone_15_pro_max: {
52
+ window_size: [430, 932], scale_factor: 3, mobile: true,
53
+ user_agent: IPHONE_USER_AGENT
54
+ },
55
+ iphone_16e: {
56
+ window_size: [390, 844], scale_factor: 3, mobile: true,
57
+ user_agent: IPHONE_USER_AGENT
58
+ },
59
+ iphone_16: {
60
+ window_size: [393, 852], scale_factor: 3, mobile: true,
61
+ user_agent: IPHONE_USER_AGENT
62
+ },
63
+ iphone_16_plus: {
64
+ window_size: [430, 932], scale_factor: 3, mobile: true,
65
+ user_agent: IPHONE_USER_AGENT
66
+ },
67
+ iphone_16_pro: {
68
+ window_size: [402, 874], scale_factor: 3, mobile: true,
69
+ user_agent: IPHONE_USER_AGENT
70
+ },
71
+ iphone_16_pro_max: {
72
+ window_size: [440, 956], scale_factor: 3, mobile: true,
73
+ user_agent: IPHONE_USER_AGENT
74
+ },
75
+ ipad_mini: {
76
+ window_size: [768, 1024], scale_factor: 2, mobile: true,
77
+ user_agent: "Mozilla/5.0 (iPad; CPU OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1"
78
+ },
79
+ ipad_pro_13: {
80
+ window_size: [1032, 1376], scale_factor: 2, mobile: true,
81
+ user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Safari/605.1.15"
82
+ },
83
+
84
+ pixel_7: {
85
+ window_size: [412, 915], scale_factor: 2.625, mobile: true,
86
+ user_agent: "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
87
+ },
88
+ pixel_8: {
89
+ window_size: [412, 915], scale_factor: 2.625, mobile: true,
90
+ user_agent: "Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
91
+ },
92
+ pixel_8_pro: {
93
+ window_size: [448, 997], scale_factor: 3, mobile: true,
94
+ user_agent: "Mozilla/5.0 (Linux; Android 14; Pixel 8 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
95
+ },
96
+ pixel_8a: {
97
+ window_size: [412, 915], scale_factor: 2.625, mobile: true,
98
+ user_agent: "Mozilla/5.0 (Linux; Android 14; Pixel 8a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
99
+ },
100
+ pixel_9: {
101
+ window_size: [412, 924], scale_factor: 2.625, mobile: true,
102
+ user_agent: "Mozilla/5.0 (Linux; Android 14; Pixel 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
103
+ },
104
+ pixel_9_pro: {
105
+ window_size: [427, 952], scale_factor: 3, mobile: true,
106
+ user_agent: "Mozilla/5.0 (Linux; Android 14; Pixel 9 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
107
+ },
108
+ pixel_9_pro_xl: {
109
+ window_size: [448, 997], scale_factor: 3, mobile: true,
110
+ user_agent: "Mozilla/5.0 (Linux; Android 14; Pixel 9 Pro XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
111
+ },
112
+ pixel_10: {
113
+ window_size: [412, 924], scale_factor: 2.625, mobile: true,
114
+ user_agent: "Mozilla/5.0 (Linux; Android 16; Pixel 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
115
+ },
116
+ pixel_9_pro_fold: {
117
+ window_size: [412, 922], scale_factor: 2.625, mobile: true,
118
+ user_agent: "Mozilla/5.0 (Linux; Android 14; Pixel 9 Pro Fold) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
119
+ },
120
+
121
+ samsung_galaxy_s8_plus: {
122
+ window_size: [360, 740], scale_factor: 4, mobile: true,
123
+ user_agent: SAMSUNG_GALAXY_S8_PLUS_USER_AGENT
124
+ },
125
+ samsung_galaxy_s20_ultra: {
126
+ window_size: [412, 915], scale_factor: 3.5, mobile: true,
127
+ user_agent: "Mozilla/5.0 (Linux; Android 13; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
128
+ },
129
+ samsung_galaxy_a55: {
130
+ window_size: [360, 800], scale_factor: 2.25, mobile: true,
131
+ user_agent: "Mozilla/5.0 (Linux; Android 14; SM-A556B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
132
+ },
133
+ galaxy_z_fold_6: {
134
+ window_size: [412, 968], scale_factor: 2.625, mobile: true,
135
+ user_agent: "Mozilla/5.0 (Linux; Android 14; SM-F956U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
136
+ },
137
+ galaxy_z_fold_5: {
138
+ window_size: [344, 882], scale_factor: 2.625, mobile: true,
139
+ user_agent: "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
140
+ },
141
+ samsung_galaxy_a51_71: {
142
+ window_size: [412, 914], scale_factor: 2.625, mobile: true,
143
+ user_agent: SAMSUNG_GALAXY_S8_PLUS_USER_AGENT
144
+ },
145
+ galaxy_tab_s4: {
146
+ window_size: [712, 1138], scale_factor: 2.25, mobile: true,
147
+ user_agent: "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Safari/537.36"
148
+ },
149
+
150
+ surface_pro_7: {
151
+ window_size: [912, 1368], scale_factor: 2, mobile: true,
152
+ user_agent: WINDOWS_USER_AGENT
153
+ },
154
+ surface_pro_10: {
155
+ window_size: [960, 1440], scale_factor: 2, mobile: true,
156
+ user_agent: WINDOWS_USER_AGENT
157
+ },
158
+ surface_duo: {
159
+ window_size: [540, 720], scale_factor: 2.5, mobile: true,
160
+ user_agent: "Mozilla/5.0 (Linux; Android 11.0; Surface Duo) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
161
+ },
162
+
163
+ nest_hub_max: {
164
+ window_size: [1280, 800], scale_factor: 2, mobile: true,
165
+ user_agent: "Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Safari/537.36 CrKey/1.54.250320"
166
+ },
167
+ jiophone_2: {
168
+ window_size: [240, 320], scale_factor: 1, mobile: true,
169
+ user_agent: "Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5"
170
+ },
171
+ moto_g4: {
172
+ window_size: [360, 640], scale_factor: 3, mobile: true,
173
+ user_agent: "Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
174
+ },
175
+ moto_g_power: {
176
+ window_size: [412, 823], scale_factor: 1.75, mobile: true,
177
+ user_agent: "Mozilla/5.0 (Linux; Android 11; moto g power (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%<version>s Mobile Safari/537.36"
178
+ }
179
+ }.freeze
180
+
181
+ def self.fetch(name)
182
+ LIST.fetch(name.to_sym) do
183
+ raise ArgumentError, "Unknown device to emulate: #{name.inspect}, use one of #{LIST.keys.join(', ')}"
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,198 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
4
+ require "capybara/cuprite/deprecation"
5
+
6
+ module Capybara
7
+ module Cuprite
8
+ class Driver < Capybara::Driver::Base
9
+ module Deprecations
10
+ def self.deprecate(name, replacement)
11
+ define_method(name) do |*args, **kwargs, &block|
12
+ Cuprite.deprecation_warning("#{self.class}##{name}", "use ##{replacement}")
13
+ public_send(replacement, *args, **kwargs, &block)
14
+ end
15
+ end
16
+ private_class_method :deprecate
17
+
18
+ deprecate :body, :html
19
+ deprecate :window_handle, :current_window_handle
20
+ deprecate :back, :go_back
21
+ deprecate :forward, :go_forward
22
+ deprecate :render, :save_screenshot
23
+
24
+ def render_base64(format = :png, options = {})
25
+ Cuprite.deprecation_warning("#{self.class}#render_base64", "use page.driver.browser.screenshot or .pdf")
26
+ browser.screenshot(format: format, encoding: :base64, **options)
27
+ end
28
+
29
+ def zoom_factor=(value)
30
+ Cuprite.deprecation_warning("#{self.class}#zoom_factor=", "pass scale: to save_screenshot")
31
+ @zoom_factor = value.to_f
32
+ end
33
+
34
+ def paper_size=(value)
35
+ Cuprite.deprecation_warning("#{self.class}#paper_size=",
36
+ "pass paper_width: and paper_height: to save_screenshot")
37
+ @paper_size = value
38
+ end
39
+
40
+ def resize(width, height)
41
+ Cuprite.deprecation_warning("#{self.class}##{__callee__}", "use page.current_window.resize_to")
42
+ resize_window_to(current_window_handle, width, height)
43
+ end
44
+ alias resize_window resize
45
+
46
+ def click(x, y)
47
+ Cuprite.deprecation_warning("#{self.class}#click", "use page.driver.browser.mouse.click")
48
+ browser.mouse.click(x: x, y: y)
49
+ end
50
+
51
+ def scroll_to(left, top)
52
+ Cuprite.deprecation_warning("#{self.class}#scroll_to", "use page.scroll_to")
53
+ browser.mouse.scroll_to(left, top)
54
+ end
55
+
56
+ def set_proxy(host, port, user = nil, password = nil, bypass = nil)
57
+ Cuprite.deprecation_warning("#{self.class}#set_proxy", "pass the :proxy option to the driver")
58
+ @options.merge!(proxy: { host: host, port: port, user: user, password: password, bypass: bypass })
59
+ end
60
+
61
+ def restart
62
+ Cuprite.deprecation_warning("#{self.class}#restart", "use page.driver.browser.restart")
63
+ browser.restart
64
+ end
65
+
66
+ def wait_for_reload(timeout = 1)
67
+ Cuprite.deprecation_warning("#{self.class}#wait_for_reload", "use page.driver.browser.wait_for_reload")
68
+ browser.wait_for_reload(timeout)
69
+ end
70
+
71
+ def timeout
72
+ Cuprite.deprecation_warning("#{self.class}#timeout", "use page.driver.browser.timeout")
73
+ browser.timeout
74
+ end
75
+
76
+ def timeout=(value)
77
+ Cuprite.deprecation_warning("#{self.class}#timeout=", "use page.driver.browser.timeout=")
78
+ browser.timeout = value
79
+ end
80
+
81
+ def device_pixel_ratio
82
+ Cuprite.deprecation_warning("#{self.class}#device_pixel_ratio", "use page.driver.browser.device_pixel_ratio")
83
+ browser.device_pixel_ratio
84
+ end
85
+
86
+ def viewport_size
87
+ Cuprite.deprecation_warning("#{self.class}#viewport_size", "use page.driver.browser.viewport_size")
88
+ browser.viewport_size
89
+ end
90
+
91
+ def authorize(user, password)
92
+ Cuprite.deprecation_warning("#{self.class}##{__callee__}", "use page.driver.browser.network.authorize")
93
+ browser.network.authorize(user: user, password: password) do |request, _index, _total|
94
+ request.continue
95
+ end
96
+ end
97
+ alias basic_authorize authorize
98
+
99
+ def headers
100
+ Cuprite.deprecation_warning("#{self.class}#headers", "use page.driver.browser.headers.get")
101
+ browser.headers.get
102
+ end
103
+
104
+ def headers=(headers)
105
+ Cuprite.deprecation_warning("#{self.class}#headers=", "use page.driver.browser.headers.set")
106
+ browser.headers.set(headers)
107
+ end
108
+
109
+ def add_headers(headers)
110
+ Cuprite.deprecation_warning("#{self.class}#add_headers", "use page.driver.browser.headers.add")
111
+ browser.headers.add(headers)
112
+ end
113
+
114
+ def add_header(name, value, permanent: true)
115
+ Cuprite.deprecation_warning("#{self.class}#add_header", "use page.driver.browser.headers.add")
116
+ browser.headers.add({ name => value }, permanent: permanent)
117
+ end
118
+
119
+ def cookies
120
+ Cuprite.deprecation_warning("#{self.class}#cookies", "use page.driver.browser.cookies.all")
121
+ browser.cookies.all
122
+ end
123
+
124
+ def set_cookie(name, value, options = {})
125
+ Cuprite.deprecation_warning("#{self.class}#set_cookie", "use page.driver.browser.cookies.set")
126
+ options = options.dup
127
+ options[:name] ||= name
128
+ options[:value] ||= value
129
+ options[:domain] ||= default_domain
130
+ browser.cookies.set(**options)
131
+ end
132
+
133
+ def remove_cookie(name, **options)
134
+ Cuprite.deprecation_warning("#{self.class}#remove_cookie", "use page.driver.browser.cookies.remove")
135
+ options[:domain] = default_domain if options.empty?
136
+ options = options.merge(name: name)
137
+ browser.cookies.remove(**options)
138
+ end
139
+
140
+ def clear_cookies
141
+ Cuprite.deprecation_warning("#{self.class}#clear_cookies", "use page.driver.browser.cookies.clear")
142
+ browser.cookies.clear
143
+ end
144
+
145
+ def network_traffic(type = nil)
146
+ Cuprite.deprecation_warning("#{self.class}#network_traffic", "use page.driver.browser.network.traffic")
147
+ traffic = browser.network.traffic
148
+
149
+ case type.to_s
150
+ when "all"
151
+ traffic
152
+ when "blocked"
153
+ traffic.select(&:blocked?)
154
+ else
155
+ # when request isn't blocked
156
+ traffic.reject(&:blocked?)
157
+ end
158
+ end
159
+
160
+ def clear_network_traffic
161
+ Cuprite.deprecation_warning("#{self.class}#clear_network_traffic",
162
+ "use page.driver.browser.network.clear(:traffic)")
163
+ browser.network.clear(:traffic)
164
+ end
165
+
166
+ def wait_for_network_idle(**options)
167
+ Cuprite.deprecation_warning("#{self.class}#wait_for_network_idle",
168
+ "use page.driver.browser.network.wait_for_idle")
169
+ browser.network.wait_for_idle(**options)
170
+ end
171
+
172
+ def clear_memory_cache
173
+ Cuprite.deprecation_warning("#{self.class}#clear_memory_cache",
174
+ "use page.driver.browser.network.clear(:cache)")
175
+ browser.network.clear(:cache)
176
+ end
177
+
178
+ private
179
+
180
+ def default_domain
181
+ if @started
182
+ URI.parse(browser.current_url).host
183
+ else
184
+ URI.parse(default_cookie_host).host || "127.0.0.1"
185
+ end
186
+ end
187
+
188
+ def default_cookie_host
189
+ if respond_to?(:session_options)
190
+ session_options.app_host
191
+ else
192
+ Capybara.app_host
193
+ end || ""
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Capybara
4
+ module Cuprite
5
+ class Driver < Capybara::Driver::Base
6
+ module Extensions
7
+ def debug(...)
8
+ browser.debug(...)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end