Skip to content
This repository was archived by the owner on Jul 29, 2024. It is now read-only.

deps(selenium): upgrade to selenium 4 #5095

Merged
merged 3 commits into from
Dec 19, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions lib/browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const DEFER_LABEL = 'NG_DEFER_BOOTSTRAP!';
const DEFAULT_RESET_URL = 'data:text/html,<html></html>';
const DEFAULT_GET_PAGE_TIMEOUT = 10000;

let logger = new Logger('protractor');
let logger = new Logger('browser');

// TODO(cnishina): either remove for loop entirely since this does not export anything
// the user might need since everything is composed (with caveat that this could be a
Expand Down Expand Up @@ -489,12 +489,11 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
script = 'return (' + script + ').apply(null, arguments);';
}

// TODO(selenium4): fix promise cast.
return this.driver.schedule(
new Command(CommandName.EXECUTE_SCRIPT)
.setParameter('script', script)
.setParameter('args', scriptArgs),
description) as Promise<any>;
// TODO(selenium4): schedule does not exist on driver. Should use execute instead.
return (this.driver as any)
.execute(new Command(CommandName.EXECUTE_SCRIPT)
.setParameter('script', script)
.setParameter('args', scriptArgs));
}

/**
Expand All @@ -512,14 +511,15 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
*/
private executeAsyncScript_(script: string|Function, description: string, ...scriptArgs: any[]):
Promise<any> {
// TODO(selenium4): decide what to do with description.
if (typeof script === 'function') {
script = 'return (' + script + ').apply(null, arguments);';
}
return this.driver.schedule(
new Command(CommandName.EXECUTE_ASYNC_SCRIPT)
.setParameter('script', script)
.setParameter('args', scriptArgs),
description) as Promise<any>;
// TODO(selenium4): fix typings. driver.execute should exist
return (this.driver as any)
.execute(new Command(CommandName.EXECUTE_ASYNC_SCRIPT)
.setParameter('script', script)
.setParameter('args', scriptArgs));
}

/**
Expand Down
7 changes: 4 additions & 3 deletions lib/driverProviders/attachSession.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* It is responsible for setting up the account object, tearing
* it down, and setting up the driver correctly.
*/
import {WebDriver} from 'selenium-webdriver';
import {Session, WebDriver} from 'selenium-webdriver';

import {Config} from '../config';
import {Logger} from '../logger';
Expand Down Expand Up @@ -38,8 +38,9 @@ export class AttachSession extends DriverProvider {
async getNewDriver(): Promise<WebDriver> {
const httpClient = new http.HttpClient(this.config_.seleniumAddress);
const executor = new http.Executor(httpClient);
const newDriver =
await WebDriver.attachToSession(executor, this.config_.seleniumSessionId, null);
const session = new Session(this.config_.seleniumSessionId, null);

const newDriver = new WebDriver(session, executor);
this.drivers_.push(newDriver);
return newDriver;
}
Expand Down
12 changes: 7 additions & 5 deletions lib/element.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1124,11 +1124,13 @@ export class ElementFinder extends WebdriverWebElement {
* @returns {!Promise<boolean>} A promise that will be
* resolved to whether the two WebElements are equal.
*/
equals(element: ElementFinder|WebElement): Promise<any> {
return WebElement.equals(
this.getWebElement(),
(element as any).getWebElement ? (element as ElementFinder).getWebElement() :
element as WebElement) as Promise<any>;
async equals(element: ElementFinder|WebElement): Promise<boolean> {
const a = await this.getWebElement();
const b = (element as any).getWebElement ? await(element as ElementFinder).getWebElement() :
element as WebElement;
// TODO(selenium4): Use `return WebElement.equals(a, b);` when
// https://github.com/SeleniumHQ/selenium/pull/6749 is fixed.
return a.getDriver().executeScript('return arguments[0] === arguments[1]', a, b);
}
}

Expand Down
59 changes: 0 additions & 59 deletions lib/frameworks/mocha.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,65 +13,6 @@ exports.run = (runner, specs) => {
require('./setupAfterEach').setup(runner, specs);

return new Promise(async (resolve, reject) => {
// Mocha doesn't set up the ui until the pre-require event, so
// wait until then to load mocha-webdriver adapters as well.
mocha.suite.on('pre-require', () => {
try {
// We need to re-wrap all of the global functions, which `selenium-webdriver/testing` only
// does when it is required. So first we must remove it from the cache.
delete require.cache[require.resolve('selenium-webdriver/testing')];
const seleniumAdapter = require('selenium-webdriver/testing');

// Save unwrapped version
let unwrappedFns = {};
['after', 'afterEach', 'before', 'beforeEach', 'it', 'xit', 'iit'].forEach((fnName) => {
unwrappedFns[fnName] = global[fnName] || Mocha[fnName];
});

const wrapFn = (seleniumWrappedFn, opt_fnName) => {
// This does not work on functions that can be nested (e.g. `describe`)
return function() {
// Set globals to unwrapped version to avoid circular reference
let wrappedFns = {};
for (let fnName in unwrappedFns) {
wrappedFns[fnName] = global[fnName];
global[fnName] = unwrappedFns[fnName];
}

let args = arguments;
// Allow before/after hooks to use names
if (opt_fnName && (arguments.length > 1) && (seleniumWrappedFn.length < 2)) {
global[opt_fnName] = global[opt_fnName].bind(this, args[0]);
args = Array.prototype.slice.call(arguments, 1);
}

try {
seleniumWrappedFn.apply(this, args);
} finally {
// Restore wrapped version
for (fnName in wrappedFns) {
global[fnName] = wrappedFns[fnName];
}
}
};
};

// Wrap functions
global.after = wrapFn(seleniumAdapter.after, 'after');
global.afterEach = wrapFn(seleniumAdapter.afterEach, 'afterEach');
global.before = wrapFn(seleniumAdapter.before, 'before');
global.beforeEach = wrapFn(seleniumAdapter.beforeEach, 'beforeEach');

global.it = wrapFn(seleniumAdapter.it);
global.iit = wrapFn(seleniumAdapter.it.only);
global.xit = wrapFn(seleniumAdapter.xit);
global.it.only = wrapFn(seleniumAdapter.it.only);
global.it.skip = wrapFn(seleniumAdapter.it.skip);
} catch (err) {
reject(err);
}
});

mocha.loadFiles();

try {
Expand Down
3 changes: 2 additions & 1 deletion lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import {PluginConfig, ProtractorPlugin} from './plugins';
import {Ptor} from './ptor';

// Re-export selenium-webdriver types.
export {ActionSequence, Browser, Builder, Button, Capabilities, Capability, error, EventEmitter, FileDetector, Key, logging, promise, Session, until, WebDriver, WebElement, WebElementPromise} from 'selenium-webdriver';
// TODO(selenium4): Actions class typings missing. ActionSequence is deprecated.
export {/*Actions,*/ Browser, Builder, Button, Capabilities, Capability, error, EventEmitter, FileDetector, Key, logging, promise, Session, until, WebDriver, WebElement, WebElementPromise} from 'selenium-webdriver';
// Re-export public types.
export {ElementHelper, ProtractorBrowser} from './browser';
export {Config} from './config';
Expand Down
9 changes: 8 additions & 1 deletion lib/launcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,14 @@ let initFn = async function(configFile: string, additionalConfig: Config) {
});

process.on('unhandledRejection', (reason: Error | any, p: Promise<any>) => {
logger.warn('Unhandled rejection at:', p, 'reason:', reason);
if (reason.stack.match('angular testability are undefined') ||
reason.stack.match('angular is not defined')) {
logger.warn(
'Unhandled promise rejection error: This is usually occurs ' +
'when a browser.get call is made and a previous async call was ' +
'not awaited');
}
logger.warn(p);
});

process.on('exit', (code: number) => {
Expand Down
4 changes: 3 additions & 1 deletion lib/runner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,9 @@ export class Runner extends EventEmitter {
}

await browser_.waitForAngularEnabled(initProperties.waitForAngularEnabled);
await driver.manage().timeouts().setScriptTimeout(initProperties.allScriptsTimeout || 0);
// TODO(selenium4): Options does not have a setScriptTimeout method.
await(driver.manage() as any).setTimeouts({script: initProperties.allScriptsTimeout || 0});


browser_.getProcessedConfig = () => {
return Promise.resolve(config);
Expand Down
Loading