Skip to content

Commit 7e229b9

Browse files
committed
[rb] move browser-specific web extension tests into per-browser driver specs
1 parent 4e525ad commit 7e229b9

7 files changed

Lines changed: 183 additions & 90 deletions

File tree

rb/spec/integration/selenium/webdriver/chrome/BUILD.bazel

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,24 @@ filegroup(
1919
)
2020
for file in glob(
2121
["*_spec.rb"],
22-
exclude = ["service_spec.rb"],
22+
exclude = [
23+
"driver_spec.rb",
24+
"service_spec.rb",
25+
],
2326
)
2427
]
2528

29+
rb_integration_test(
30+
name = "driver",
31+
srcs = ["driver_spec.rb"],
32+
bidi = True,
33+
browsers = [
34+
"chrome",
35+
"chrome-beta",
36+
],
37+
data = ["//common/extensions"],
38+
)
39+
2640
rb_integration_test(
2741
name = "service",
2842
srcs = ["service_spec.rb"],

rb/spec/integration/selenium/webdriver/chrome/driver_spec.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
# specific language governing permissions and limitations
1818
# under the License.
1919

20+
require 'tmpdir'
21+
2022
require_relative '../spec_helper'
2123

2224
module Selenium
@@ -184,6 +186,36 @@ def get_permission(name)
184186
expect(get_permission('clipboard-write')).to eq('prompt')
185187
end
186188
end
189+
190+
describe Driver, skip_unless: [{bidi: true, reason: 'web extensions install over the webExtension BiDi command'},
191+
{browser: :chrome}] do
192+
let(:directory) do
193+
File.expand_path('../../../../../../common/extensions/webextensions-selenium-example', __dir__)
194+
end
195+
196+
describe '#install_web_extension' do
197+
it 'installs a packed archive',
198+
pending_if: {exception: {class: Error::UnsupportedOperationError},
199+
reason: 'chromium-bidi installs only unpacked directories (SeleniumHQ/selenium#16541)'} do
200+
Dir.mktmpdir do |dir|
201+
archive = File.join(dir, 'extension.zip')
202+
File.binwrite(archive, Base64.decode64(Zipper.zip_root(directory)))
203+
204+
extension = driver.install_web_extension(archive)
205+
expect(extension.id).not_to be_empty
206+
driver.uninstall_web_extension(extension)
207+
end
208+
end
209+
210+
it 'installs base64-encoded bytes',
211+
pending_if: {exception: {class: Error::UnsupportedOperationError},
212+
reason: 'chromium-bidi installs only unpacked directories (SeleniumHQ/selenium#16541)'} do
213+
extension = driver.install_web_extension(Zipper.zip_root(directory))
214+
expect(extension.id).not_to be_empty
215+
driver.uninstall_web_extension(extension)
216+
end
217+
end
218+
end
187219
end # Chrome
188220
end # WebDriver
189221
end # Selenium

rb/spec/integration/selenium/webdriver/driver_spec.rb

Lines changed: 12 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -370,91 +370,18 @@ module WebDriver
370370
after { |example| reset_driver!(example: example) }
371371

372372
describe '#install_web_extension' do
373-
context 'with an unpacked directory' do
374-
it 'installs and removes the extension on any browser' do
375-
ext = File.expand_path("#{extensions}/webextensions-selenium-example-signed", __dir__)
376-
extension = driver.install_web_extension(ext)
377-
expect(extension.id).not_to be_empty
378-
379-
driver.navigate.to url_for('blank.html')
380-
injected = driver.find_element(id: 'webextensions-selenium-example')
381-
expect(injected.text).to eq 'Content injected by webextensions-selenium-example'
382-
383-
driver.uninstall_web_extension(extension)
384-
driver.navigate.refresh
385-
expect(driver.find_elements(id: 'webextensions-selenium-example')).to be_empty
386-
end
387-
end
388-
389-
context 'with a packed archive' do
390-
it 'installs and removes an xpi file',
391-
pending_if: {browser_family: :chromium,
392-
exception: {class: Error::UnsupportedOperationError},
393-
reason: 'chromium-bidi installs only unpacked directories (SeleniumHQ/selenium#16541)'} do
394-
ext = File.expand_path("#{extensions}/webextensions-selenium-example.xpi", __dir__)
395-
extension = driver.install_web_extension(ext)
396-
expect(extension.id).to eq 'webextensions-selenium-example-v3@example.com'
397-
398-
driver.navigate.to url_for('blank.html')
399-
injected = driver.find_element(id: 'webextensions-selenium-example')
400-
expect(injected.text).to eq 'Content injected by webextensions-selenium-example'
401-
402-
driver.uninstall_web_extension(extension)
403-
end
404-
end
405-
406-
context 'with base64-encoded bytes' do
407-
it 'installs and removes base64-encoded bytes',
408-
pending_if: {browser_family: :chromium,
409-
exception: {class: Error::UnsupportedOperationError},
410-
reason: 'chromium-bidi installs only unpacked directories (SeleniumHQ/selenium#16541)'} do
411-
xpi = File.expand_path("#{extensions}/webextensions-selenium-example.xpi", __dir__)
412-
extension = driver.install_web_extension(Base64.strict_encode64(File.binread(xpi)))
413-
expect(extension.id).to eq 'webextensions-selenium-example-v3@example.com'
414-
415-
driver.navigate.to url_for('blank.html')
416-
injected = driver.find_element(id: 'webextensions-selenium-example')
417-
expect(injected.text).to eq 'Content injected by webextensions-selenium-example'
418-
419-
driver.uninstall_web_extension(extension)
420-
end
421-
end
422-
423-
context 'when the browser is Firefox', skip_unless: {browser: :firefox} do
424-
it 'installs an unsigned directory with permanent: false' do
425-
ext = File.expand_path("#{extensions}/webextensions-selenium-example", __dir__)
426-
extension = driver.install_web_extension(ext, permanent: false)
427-
expect(extension.id).to eq 'webextensions-selenium-example-v3@example.com'
428-
429-
driver.navigate.to url_for('blank.html')
430-
injected = driver.find_element(id: 'webextensions-selenium-example')
431-
expect(injected.text).to eq 'Content injected by webextensions-selenium-example'
432-
433-
driver.uninstall_web_extension(extension)
434-
end
435-
436-
context 'with allow_private_browsing enabled' do
437-
let(:ext) { File.expand_path("#{extensions}/webextensions-selenium-example-signed", __dir__) }
438-
439-
it 'runs in a private window when allowed' do
440-
reset_driver!(prefs: {'browser.privatebrowsing.autostart': true}) do |driver|
441-
driver.install_web_extension(ext, allow_private_browsing: true)
442-
driver.navigate.to url_for('blank.html')
443-
444-
injected = driver.find_element(id: 'webextensions-selenium-example')
445-
expect(injected.text).to eq 'Content injected by webextensions-selenium-example'
446-
end
447-
end
448-
449-
it 'does not run in a private window by default' do
450-
reset_driver!(prefs: {'browser.privatebrowsing.autostart': true}) do |driver|
451-
driver.install_web_extension(ext)
452-
driver.navigate.to url_for('blank.html')
453-
454-
expect(driver.find_elements(id: 'webextensions-selenium-example')).to be_empty
455-
end
456-
end
457-
end
373+
it 'installs and removes an unpacked directory on any browser' do
374+
ext = File.expand_path("#{extensions}/webextensions-selenium-example-signed", __dir__)
375+
extension = driver.install_web_extension(ext)
376+
expect(extension.id).not_to be_empty
377+
378+
driver.navigate.to url_for('blank.html')
379+
injected = driver.find_element(id: 'webextensions-selenium-example')
380+
expect(injected.text).to eq 'Content injected by webextensions-selenium-example'
381+
382+
driver.uninstall_web_extension(extension)
383+
driver.navigate.refresh
384+
expect(driver.find_elements(id: 'webextensions-selenium-example')).to be_empty
458385
end
459386
end
460387
end

rb/spec/integration/selenium/webdriver/edge/BUILD.bazel

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,21 @@ filegroup(
1616
)
1717
for file in glob(
1818
["*_spec.rb"],
19-
exclude = ["service_spec.rb"],
19+
exclude = [
20+
"driver_spec.rb",
21+
"service_spec.rb",
22+
],
2023
)
2124
]
2225

26+
rb_integration_test(
27+
name = "driver",
28+
srcs = ["driver_spec.rb"],
29+
bidi = True,
30+
browsers = ["edge"],
31+
data = ["//common/extensions"],
32+
)
33+
2334
rb_integration_test(
2435
name = "service",
2536
srcs = ["service_spec.rb"],

rb/spec/integration/selenium/webdriver/edge/driver_spec.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
# specific language governing permissions and limitations
1818
# under the License.
1919

20+
require 'tmpdir'
21+
2022
require_relative '../spec_helper'
2123

2224
module Selenium
@@ -114,6 +116,36 @@ module Edge
114116
end
115117
end
116118
end
119+
120+
describe Driver, skip_unless: [{bidi: true, reason: 'web extensions install over the webExtension BiDi command'},
121+
{browser: :edge}] do
122+
let(:directory) do
123+
File.expand_path('../../../../../../common/extensions/webextensions-selenium-example', __dir__)
124+
end
125+
126+
describe '#install_web_extension' do
127+
it 'installs a packed archive',
128+
pending_if: {exception: {class: Error::UnsupportedOperationError},
129+
reason: 'chromium-bidi installs only unpacked directories (SeleniumHQ/selenium#16541)'} do
130+
Dir.mktmpdir do |dir|
131+
archive = File.join(dir, 'extension.zip')
132+
File.binwrite(archive, Base64.decode64(Zipper.zip_root(directory)))
133+
134+
extension = driver.install_web_extension(archive)
135+
expect(extension.id).not_to be_empty
136+
driver.uninstall_web_extension(extension)
137+
end
138+
end
139+
140+
it 'installs base64-encoded bytes',
141+
pending_if: {exception: {class: Error::UnsupportedOperationError},
142+
reason: 'chromium-bidi installs only unpacked directories (SeleniumHQ/selenium#16541)'} do
143+
extension = driver.install_web_extension(Zipper.zip_root(directory))
144+
expect(extension.id).not_to be_empty
145+
driver.uninstall_web_extension(extension)
146+
end
147+
end
148+
end
117149
end # Edge
118150
end # WebDriver
119151
end # Selenium

rb/spec/integration/selenium/webdriver/firefox/BUILD.bazel

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,24 @@ filegroup(
1919
)
2020
for file in glob(
2121
["*_spec.rb"],
22-
exclude = ["service_spec.rb"],
22+
exclude = [
23+
"driver_spec.rb",
24+
"service_spec.rb",
25+
],
2326
)
2427
]
2528

29+
rb_integration_test(
30+
name = "driver",
31+
srcs = ["driver_spec.rb"],
32+
bidi = True,
33+
browsers = [
34+
"firefox",
35+
"firefox-beta",
36+
],
37+
data = ["//common/extensions"],
38+
)
39+
2640
rb_integration_test(
2741
name = "service",
2842
srcs = ["service_spec.rb"],

rb/spec/integration/selenium/webdriver/firefox/driver_spec.rb

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ module Firefox
7777
end
7878
end
7979

80-
describe '#install_addon' do
80+
describe '#install_addon', skip_unless: {bidi: false, reason: 'classic moz/addon endpoint'} do
8181
it 'install and uninstall xpi file' do
8282
ext = File.expand_path("#{extensions}/webextensions-selenium-example.xpi", __dir__)
8383
id = nil
@@ -158,7 +158,7 @@ module Firefox
158158
end
159159
end
160160

161-
describe '#install_web_extension' do
161+
describe '#install_web_extension', skip_unless: {bidi: false, reason: 'classic moz/addon fallback'} do
162162
it 'installs and uninstalls without BiDi enabled' do
163163
ext = File.expand_path("#{extensions}/webextensions-selenium-example.xpi", __dir__)
164164
extension = driver.install_web_extension(ext)
@@ -207,6 +207,69 @@ module Firefox
207207
end
208208
end
209209
end
210+
211+
describe '#install_web_extension', skip_unless: {bidi: true, reason: 'moz webExtension BiDi command'} do
212+
after { |example| reset_driver!(example: example) }
213+
214+
it 'installs and removes an xpi file' do
215+
ext = File.expand_path("#{extensions}/webextensions-selenium-example.xpi", __dir__)
216+
extension = driver.install_web_extension(ext)
217+
expect(extension.id).to eq 'webextensions-selenium-example-v3@example.com'
218+
219+
driver.navigate.to url_for('blank.html')
220+
injected = driver.find_element(id: 'webextensions-selenium-example')
221+
expect(injected.text).to eq 'Content injected by webextensions-selenium-example'
222+
223+
driver.uninstall_web_extension(extension)
224+
end
225+
226+
it 'installs and removes base64-encoded bytes' do
227+
xpi = File.expand_path("#{extensions}/webextensions-selenium-example.xpi", __dir__)
228+
extension = driver.install_web_extension(Base64.strict_encode64(File.binread(xpi)))
229+
expect(extension.id).to eq 'webextensions-selenium-example-v3@example.com'
230+
231+
driver.navigate.to url_for('blank.html')
232+
injected = driver.find_element(id: 'webextensions-selenium-example')
233+
expect(injected.text).to eq 'Content injected by webextensions-selenium-example'
234+
235+
driver.uninstall_web_extension(extension)
236+
end
237+
238+
it 'installs an unsigned directory with permanent: false' do
239+
ext = File.expand_path("#{extensions}/webextensions-selenium-example", __dir__)
240+
extension = driver.install_web_extension(ext, permanent: false)
241+
expect(extension.id).to eq 'webextensions-selenium-example-v3@example.com'
242+
243+
driver.navigate.to url_for('blank.html')
244+
injected = driver.find_element(id: 'webextensions-selenium-example')
245+
expect(injected.text).to eq 'Content injected by webextensions-selenium-example'
246+
247+
driver.uninstall_web_extension(extension)
248+
end
249+
250+
context 'with allow_private_browsing enabled' do
251+
let(:ext) { File.expand_path("#{extensions}/webextensions-selenium-example-signed", __dir__) }
252+
253+
it 'runs in a private window when allowed' do
254+
reset_driver!(prefs: {'browser.privatebrowsing.autostart': true}) do |driver|
255+
driver.install_web_extension(ext, allow_private_browsing: true)
256+
driver.navigate.to url_for('blank.html')
257+
258+
injected = driver.find_element(id: 'webextensions-selenium-example')
259+
expect(injected.text).to eq 'Content injected by webextensions-selenium-example'
260+
end
261+
end
262+
263+
it 'does not run in a private window by default' do
264+
reset_driver!(prefs: {'browser.privatebrowsing.autostart': true}) do |driver|
265+
driver.install_web_extension(ext)
266+
driver.navigate.to url_for('blank.html')
267+
268+
expect(driver.find_elements(id: 'webextensions-selenium-example')).to be_empty
269+
end
270+
end
271+
end
272+
end
210273
end
211274
end # Firefox
212275
end # WebDriver

0 commit comments

Comments
 (0)