123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- // Licensed to the Software Freedom Conservancy (SFC) under one
- // or more contributor license agreements. See the NOTICE file
- // distributed with this work for additional information
- // regarding copyright ownership. The SFC licenses this file
- // to you under the Apache License, Version 2.0 (the
- // "License"); you may not use this file except in compliance
- // with the License. You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing,
- // software distributed under the License is distributed on an
- // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- // KIND, either express or implied. See the License for the
- // specific language governing permissions and limitations
- // under the License.
- 'use strict';
- var path = require('path');
- var firefox = require('../../firefox'),
- io = require('../../io'),
- test = require('../../lib/test'),
- assert = require('../../testing/assert'),
- Context = require('../../firefox').Context,
- error = require('../..').error;
- var {consume} = require('../../lib/promise');
- var JETPACK_EXTENSION = path.join(__dirname,
- '../../lib/test/data/firefox/jetpack-sample.xpi');
- var NORMAL_EXTENSION = path.join(__dirname,
- '../../lib/test/data/firefox/sample.xpi');
- var WEBEXTENSION_EXTENSION = path.join(__dirname,
- '../../lib/test/data/firefox/webextension.xpi');
- test.suite(function(env) {
- describe('firefox', function() {
- describe('Options', function() {
- let driver;
- beforeEach(function() {
- driver = null;
- });
- afterEach(function() {
- if (driver) {
- return driver.quit();
- }
- });
- /**
- * @param {...string} extensions the extensions to install.
- * @return {!firefox.Profile} a new profile.
- */
- function profileWithExtensions(...extensions) {
- let profile = new firefox.Profile();
- profile.setPreference('xpinstall.signatures.required', false);
- extensions.forEach(ext => profile.addExtension(ext));
- return profile;
- }
- /**
- * Runs a test that requires Firefox Developer Edition. The test will be
- * skipped if dev cannot be found on the current system.
- */
- function runWithFirefoxDev(options, testFn) {
- return firefox.Channel.AURORA.locate().then(exe => {
- options.setBinary(exe);
- driver = env.builder()
- .setFirefoxOptions(options)
- .build();
- return driver.call(testFn);
- }, err => {
- console.warn(
- 'Skipping test: could not find Firefox Dev Edition: ' + err);
- });
- }
- describe('can start Firefox with custom preferences', function() {
- function runTest(opt_dir) {
- return consume(function*() {
- let profile = new firefox.Profile(opt_dir);
- profile.setPreference('general.useragent.override', 'foo;bar');
- let options = new firefox.Options().setProfile(profile);
- driver = env.builder().
- setFirefoxOptions(options).
- build();
- yield driver.get('data:text/html,<html><div>content</div></html>');
- var userAgent = yield driver.executeScript(
- 'return window.navigator.userAgent');
- assert(userAgent).equalTo('foo;bar');
- });
- }
- test.it('profile created from scratch', function() {
- return runTest();
- });
- test.it('profile created from template', function() {
- return io.tmpDir().then(runTest);
- });
- });
- test.it('can start Firefox with a jetpack extension', function() {
- let profile = profileWithExtensions(JETPACK_EXTENSION);
- let options = new firefox.Options().setProfile(profile);
- return runWithFirefoxDev(options, function*() {
- yield loadJetpackPage(driver,
- 'data:text/html;charset=UTF-8,<html><div>content</div></html>');
- let text =
- yield driver.findElement({id: 'jetpack-sample-banner'}).getText();
- assert(text).equalTo('Hello, world!');
- });
- });
- test.it('can start Firefox with a normal extension', function() {
- let profile = profileWithExtensions(NORMAL_EXTENSION);
- let options = new firefox.Options().setProfile(profile);
- return runWithFirefoxDev(options, function*() {
- yield driver.get('data:text/html,<html><div>content</div></html>');
- let footer =
- yield driver.findElement({id: 'sample-extension-footer'});
- let text = yield footer.getText();
- assert(text).equalTo('Goodbye');
- });
- });
- test.it('can start Firefox with a webextension extension', function() {
- let profile = profileWithExtensions(WEBEXTENSION_EXTENSION);
- let options = new firefox.Options().setProfile(profile);
- return runWithFirefoxDev(options, function*() {
- yield driver.get(test.Pages.echoPage);
- let footer =
- yield driver.findElement({id: 'webextensions-selenium-example'});
- let text = yield footer.getText();
- assert(text).equalTo('Content injected by webextensions-selenium-example');
- });
- });
- test.it('can start Firefox with multiple extensions', function() {
- let profile =
- profileWithExtensions(JETPACK_EXTENSION, NORMAL_EXTENSION);
- let options = new firefox.Options().setProfile(profile);
- return runWithFirefoxDev(options, function*() {
- yield loadJetpackPage(driver,
- 'data:text/html;charset=UTF-8,<html><div>content</div></html>');
- let banner =
- yield driver.findElement({id: 'jetpack-sample-banner'}).getText();
- assert(banner).equalTo('Hello, world!');
- let footer =
- yield driver.findElement({id: 'sample-extension-footer'})
- .getText();
- assert(footer).equalTo('Goodbye');
- });
- });
- function loadJetpackPage(driver, url) {
- // On linux the jetpack extension does not always run the first time
- // we load a page. If this happens, just reload the page (a simple
- // refresh doesn't appear to work).
- return driver.wait(function() {
- driver.get(url);
- return driver.findElements({id: 'jetpack-sample-banner'})
- .then(found => found.length > 0);
- }, 3000);
- }
- });
- describe('binary management', function() {
- var driver1, driver2;
- test.ignore(env.isRemote).
- it('can start multiple sessions with single binary instance', function*() {
- var options = new firefox.Options().setBinary(new firefox.Binary);
- env.builder().setFirefoxOptions(options);
- driver1 = yield env.builder().build();
- driver2 = yield env.builder().build();
- // Ok if this doesn't fail.
- });
- test.afterEach(function*() {
- if (driver1) {
- yield driver1.quit();
- }
- if (driver2) {
- yield driver2.quit();
- }
- });
- });
- describe('context switching', function() {
- var driver;
- test.beforeEach(function*() {
- driver = yield env.builder().build();
- });
- test.afterEach(function() {
- if (driver) {
- return driver.quit();
- }
- });
- test.it('can get context', function() {
- return assert(driver.getContext()).equalTo(Context.CONTENT);
- });
- test.it('can set context', function*() {
- yield driver.setContext(Context.CHROME);
- let ctxt = yield driver.getContext();
- assert(ctxt).equalTo(Context.CHROME);
- yield driver.setContext(Context.CONTENT);
- ctxt = yield driver.getContext();
- assert(ctxt).equalTo(Context.CONTENT);
- });
- test.it('throws on unknown context', function() {
- return driver.setContext("foo").then(assert.fail, function(e) {
- assert(e).instanceOf(error.InvalidArgumentError);
- });
- });
- });
- });
- }, {browsers: ['firefox']});
|