diff --git a/lib/config.ts b/lib/config.ts index 26e465230..36d2d4f1a 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -526,7 +526,7 @@ export interface Config { /** * Set the randomization seed if randomization is turned on */ - seed?: string, + seed?: string, }; /** diff --git a/lib/index.ts b/lib/index.ts index 8be1973d2..2ddebccb3 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -23,7 +23,7 @@ export let utils = { firefox: require('selenium-webdriver/firefox'), http: require('selenium-webdriver/http'), remote: require('selenium-webdriver/remote') -} +}; export let Command = require('selenium-webdriver/lib/command').Command; export let CommandName = require('selenium-webdriver/lib/command').Name; @@ -32,12 +32,30 @@ export let CommandName = require('selenium-webdriver/lib/command').Name; // We base this on NodeJS `global` because we do not want to mask // with a different instance of Protractor if the module is // installed both globally and locally. -export let protractor: Ptor = (global as any)['protractor']; -export let browser: ProtractorBrowser = protractor ? protractor.browser : undefined; -export let $: (search: string) => ElementFinder = protractor ? protractor.$ : undefined; -export let $$: (search: string) => ElementArrayFinder = protractor ? protractor.$$ : undefined; -export let element: ElementHelper = protractor ? protractor.element : undefined; -export let By: ProtractorBy = protractor ? protractor.By : undefined; -export let by: ProtractorBy = protractor ? protractor.by : undefined; -export let ExpectedConditions: ProtractorExpectedConditions = - protractor ? protractor.ExpectedConditions : undefined; + +// Because these properties are set dynamically by the runner in setupGlobals_, they are not +// guaranteed to be created at import time. Also, the browser object can change if browser.reset() +// is called. Thus, we export these as properties so they will be resolved dynamically. +export declare let protractor: Ptor; +Object.defineProperty(exports, 'protractor', {get: () => (global as any)['protractor']}); + +function registerGlobal(name: string) { + Object.defineProperty( + exports, name, {get: () => exports.protractor ? exports.protractor[name] : undefined}); +} + +export declare let browser: ProtractorBrowser; +export declare let $: (search: string) => ElementFinder; +export declare let $$: (search: string) => ElementArrayFinder; +export declare let element: ElementHelper; +export declare let By: ProtractorBy; +export declare let by: ProtractorBy; +export declare let ExpectedConditions: ProtractorExpectedConditions; + +registerGlobal('browser'); +registerGlobal('$'); +registerGlobal('$$'); +registerGlobal('element'); +registerGlobal('By'); +registerGlobal('by'); +registerGlobal('ExpectedConditions'); diff --git a/lib/runner.ts b/lib/runner.ts index e52934b41..e73e96d54 100644 --- a/lib/runner.ts +++ b/lib/runner.ts @@ -254,14 +254,7 @@ export class Runner extends EventEmitter { // Note: because tests are not paused at this point, any async // calls here are not guaranteed to complete before the tests resume. this.driverprovider_.quitDriver(browser_.driver); - // Copy mock modules, but do not navigate to previous URL. - let forkBrowser = browser_.forkNewDriverInstance(false, true); - - // Replace the items in browser_ but do not create a new object - // since this will break typescript imports - for (let item in forkBrowser) { - browser_[item] = forkBrowser[item]; - } + browser_ = browser_.forkNewDriverInstance(false, true); this.setupGlobals_(browser_); }; diff --git a/spec/basic/restart_spec.js b/spec/basic/restart_spec.js new file mode 100644 index 000000000..ebeb2a23e --- /dev/null +++ b/spec/basic/restart_spec.js @@ -0,0 +1,14 @@ +describe('browser.restart', function() { + it('doesn\'t break ignoreSynchronization', function() { + browser.get('index.html#/polling'); + browser.restart(); + + browser.ignoreSynchronization = true; + // Get a non-angular page. It shouldn't fail if ignoreSynchronization is on. + browser.get('https://google.com/'); + }); + + afterAll(() => { + browser.ignoreSynchronization = false; + }); +});