protractor
Advanced tools
Comparing version 4.0.9 to 4.0.10
/// <reference types="selenium-webdriver" /> | ||
import { ActionSequence, Capabilities, Command as WdCommand, FileDetector, Options, promise as wdpromise, Session, TargetLocator, TouchSequence, until, WebDriver, WebElement } from 'selenium-webdriver'; | ||
import { DebugHelper } from './debugger'; | ||
import { ElementArrayFinder, ElementFinder } from './element'; | ||
@@ -33,3 +34,3 @@ import { ProtractorExpectedConditions } from './expectedConditions'; | ||
(locator: Locator): ElementFinder; | ||
all?: (locator: Locator) => ElementArrayFinder; | ||
all: (locator: Locator) => ElementArrayFinder; | ||
} | ||
@@ -153,12 +154,6 @@ /** | ||
* when running element explorer. | ||
* @private {number} | ||
* @public {number} | ||
*/ | ||
debuggerServerPort_: number; | ||
debuggerServerPort: number; | ||
/** | ||
* Set to true when we validate that the debug port is open. Since the debug | ||
* port is held open forever once the debugger is attached, it's important | ||
* we only do validation once. | ||
*/ | ||
debuggerValidated_: boolean; | ||
/** | ||
* If true, Protractor will interpret any angular apps it comes across as | ||
@@ -170,2 +165,6 @@ * hybrid angular1/angular2 apps. | ||
ng12Hybrid: boolean; | ||
/** | ||
* A helper that manages debugging tests. | ||
*/ | ||
debugHelper: DebugHelper; | ||
[key: string]: any; | ||
@@ -217,7 +216,6 @@ constructor(webdriverInstance: WebDriver, opt_baseUrl?: string, opt_rootElement?: string, opt_untrackOutstandingTimeouts?: boolean); | ||
* @returns {!webdriver.promise.Promise.<T>} A promise that will resolve to | ||
* the | ||
* scripts return value. | ||
* the scripts return value. | ||
* @template T | ||
*/ | ||
private executeScript_(script, description, ...scriptArgs); | ||
executeScriptWithDescription(script: string | Function, description: string, ...scriptArgs: any[]): wdpromise.Promise<any>; | ||
/** | ||
@@ -395,30 +393,2 @@ * The same as {@code webdriver.WebDriver.prototype.executeAsyncScript}, | ||
/** | ||
* Validates that the port is free to use. This will only validate the first | ||
* time it is called. The reason is that on subsequent calls, the port will | ||
* already be bound to the debugger, so it will not be available, but that is | ||
* okay. | ||
* | ||
* @returns {Promise<boolean>} A promise that becomes ready when the | ||
* validation | ||
* is done. The promise will resolve to a boolean which represents whether | ||
* this is the first time that the debugger is called. | ||
*/ | ||
private validatePortAvailability_(port); | ||
private dbgCodeExecutor_; | ||
/** | ||
* Helper function to: | ||
* 1) Set up helper functions for debugger clients to call on (e.g. | ||
* getControlFlowText, execute code, get autocompletion). | ||
* 2) Enter process into debugger mode. (i.e. process._debugProcess). | ||
* 3) Invoke the debugger client specified by debuggerClientPath. | ||
* | ||
* @param {string} debuggerClientPath Absolute path of debugger client to use | ||
* @param {Function} onStartFn Function to call when the debugger starts. The | ||
* function takes a single parameter, which represents whether this is the | ||
* first time that the debugger is called. | ||
* @param {number=} opt_debugPort Optional port to use for the debugging | ||
* process | ||
*/ | ||
private initDebugger_(debuggerClientPath, onStartFn, opt_debugPort?); | ||
/** | ||
* Beta (unstable) enterRepl function for entering the repl loop from | ||
@@ -462,4 +432,6 @@ * any point in the control flow. Use browser.enterRepl() in your test. | ||
* @param {webdriver.WebDriver} webdriver The configured webdriver instance. | ||
* @param {string=} opt_baseUrl A URL to prepend to relative gets. | ||
* @param {boolean=} opt_untrackOutstandingTimeouts Whether Browser should | ||
* @param {string=} baseUrl A URL to prepend to relative gets. | ||
* @param {string=} rootElement The css selector for the element which is the | ||
* root of the Angular app. | ||
* @param {boolean=} untrackOutstandingTimeouts Whether Browser should | ||
* stop tracking outstanding $timeouts. | ||
@@ -466,0 +438,0 @@ * @returns {Browser} a new Browser instance |
@@ -7,7 +7,5 @@ "use strict"; | ||
}; | ||
// Util from NodeJs | ||
var net = require('net'); | ||
var selenium_webdriver_1 = require('selenium-webdriver'); | ||
var url = require('url'); | ||
var util = require('util'); | ||
var debugger_1 = require('./debugger'); | ||
var element_1 = require('./element'); | ||
@@ -18,3 +16,2 @@ var expectedConditions_1 = require('./expectedConditions'); | ||
var plugins_1 = require('./plugins'); | ||
var helper = require('./util'); | ||
var clientSideScripts = require('./clientsidescripts'); | ||
@@ -76,5 +73,5 @@ var webdriver = require('selenium-webdriver'); | ||
function buildElementHelper(browser) { | ||
var element = function (locator) { | ||
var element = (function (locator) { | ||
return new element_1.ElementArrayFinder(browser).all(locator).toElementFinder_(); | ||
}; | ||
}); | ||
element.all = | ||
@@ -133,2 +130,3 @@ function (locator) { | ||
this.ng12Hybrid = false; | ||
this.debugHelper = new debugger_1.DebugHelper(this); | ||
this.driver.getCapabilities().then(function (caps) { | ||
@@ -203,7 +201,6 @@ // Internet Explorer does not accept data URLs, which are the default | ||
* @returns {!webdriver.promise.Promise.<T>} A promise that will resolve to | ||
* the | ||
* scripts return value. | ||
* the scripts return value. | ||
* @template T | ||
*/ | ||
ProtractorBrowser.prototype.executeScript_ = function (script, description) { | ||
ProtractorBrowser.prototype.executeScriptWithDescription = function (script, description) { | ||
var scriptArgs = []; | ||
@@ -320,3 +317,3 @@ for (var _i = 2; _i < arguments.length; _i++) { | ||
if (_this.trackOutstandingTimeouts_) { | ||
pendingTimeoutsPromise = _this.executeScript_('return window.NG_PENDING_TIMEOUTS', 'Protractor.waitForAngular() - getting pending timeouts' + | ||
pendingTimeoutsPromise = _this.executeScriptWithDescription('return window.NG_PENDING_TIMEOUTS', 'Protractor.waitForAngular() - getting pending timeouts' + | ||
description); | ||
@@ -327,3 +324,3 @@ } | ||
} | ||
var pendingHttpsPromise = _this.executeScript_(clientSideScripts.getPendingHttpRequests, 'Protractor.waitForAngular() - getting pending https' + | ||
var pendingHttpsPromise = _this.executeScriptWithDescription(clientSideScripts.getPendingHttpRequests, 'Protractor.waitForAngular() - getting pending https' + | ||
description, _this.rootEl); | ||
@@ -490,3 +487,3 @@ return selenium_webdriver_1.promise | ||
this.driver.get(this.resetUrl).then(null, deferred.reject); | ||
this.executeScript_('window.name = "' + DEFER_LABEL + '" + window.name;' + | ||
this.executeScriptWithDescription('window.name = "' + DEFER_LABEL + '" + window.name;' + | ||
'window.location.replace("' + destination + '");', msg('reset url')) | ||
@@ -499,3 +496,3 @@ .then(null, deferred.reject); | ||
return _this | ||
.executeScript_('return window.location.href;', msg('get url')) | ||
.executeScriptWithDescription('return window.location.href;', msg('get url')) | ||
.then(function (url) { | ||
@@ -550,3 +547,3 @@ return url !== _this.resetUrl; | ||
].concat(mockModule.args); | ||
self.executeScript_.apply(self, executeScriptArgs) | ||
self.executeScriptWithDescription.apply(self, executeScriptArgs) | ||
.then(null, function (err) { | ||
@@ -561,3 +558,3 @@ throw new Error('Error while running module script ' + name_1 + ': ' + | ||
} | ||
self.executeScript_('angular.resumeBootstrap(arguments[0]);', msg('resume bootstrap'), moduleNames) | ||
self.executeScriptWithDescription('angular.resumeBootstrap(arguments[0]);', msg('resume bootstrap'), moduleNames) | ||
.then(null, deferred.reject); | ||
@@ -599,3 +596,3 @@ } | ||
return this | ||
.executeScript_('return window.location.href', 'Protractor.refresh() - getUrl') | ||
.executeScriptWithDescription('return window.location.href', 'Protractor.refresh() - getUrl') | ||
.then(function (href) { | ||
@@ -630,3 +627,3 @@ return _this.get(href, opt_timeout); | ||
return this | ||
.executeScript_(clientSideScripts.setLocation, 'Protractor.setLocation()', this.rootEl, url) | ||
.executeScriptWithDescription(clientSideScripts.setLocation, 'Protractor.setLocation()', this.rootEl, url) | ||
.then(function (browserErr) { | ||
@@ -651,3 +648,3 @@ if (browserErr) { | ||
this.waitForAngular(); | ||
return this.executeScript_(clientSideScripts.getLocationAbsUrl, 'Protractor.getLocationAbsUrl()', this.rootEl); | ||
return this.executeScriptWithDescription(clientSideScripts.getLocationAbsUrl, 'Protractor.getLocationAbsUrl()', this.rootEl); | ||
}; | ||
@@ -682,227 +679,2 @@ /** | ||
/** | ||
* Validates that the port is free to use. This will only validate the first | ||
* time it is called. The reason is that on subsequent calls, the port will | ||
* already be bound to the debugger, so it will not be available, but that is | ||
* okay. | ||
* | ||
* @returns {Promise<boolean>} A promise that becomes ready when the | ||
* validation | ||
* is done. The promise will resolve to a boolean which represents whether | ||
* this is the first time that the debugger is called. | ||
*/ | ||
ProtractorBrowser.prototype.validatePortAvailability_ = function (port) { | ||
var _this = this; | ||
if (this.debuggerValidated_) { | ||
return webdriver.promise.fulfilled(false); | ||
} | ||
var doneDeferred = webdriver.promise.defer(); | ||
// Resolve doneDeferred if port is available. | ||
var tester = net.connect({ port: port }, function () { | ||
doneDeferred.reject('Port ' + port + ' is already in use. Please specify ' + | ||
'another port to debug.'); | ||
}); | ||
tester.once('error', function (err) { | ||
if (err.code === 'ECONNREFUSED') { | ||
tester | ||
.once('close', function () { | ||
doneDeferred.fulfill(true); | ||
}) | ||
.end(); | ||
} | ||
else { | ||
doneDeferred.reject('Unexpected failure testing for port ' + port + ': ' + | ||
JSON.stringify(err)); | ||
} | ||
}); | ||
return doneDeferred.then(function () { | ||
_this.debuggerValidated_ = true; | ||
}, function (err) { | ||
console.error(err); | ||
process.exit(1); | ||
}); | ||
}; | ||
/** | ||
* Helper function to: | ||
* 1) Set up helper functions for debugger clients to call on (e.g. | ||
* getControlFlowText, execute code, get autocompletion). | ||
* 2) Enter process into debugger mode. (i.e. process._debugProcess). | ||
* 3) Invoke the debugger client specified by debuggerClientPath. | ||
* | ||
* @param {string} debuggerClientPath Absolute path of debugger client to use | ||
* @param {Function} onStartFn Function to call when the debugger starts. The | ||
* function takes a single parameter, which represents whether this is the | ||
* first time that the debugger is called. | ||
* @param {number=} opt_debugPort Optional port to use for the debugging | ||
* process | ||
*/ | ||
ProtractorBrowser.prototype.initDebugger_ = function (debuggerClientPath, onStartFn, opt_debugPort) { | ||
var _this = this; | ||
// Patch in a function to help us visualize what's going on in the control | ||
// flow. | ||
webdriver.promise.ControlFlow.prototype.getControlFlowText = function () { | ||
var controlFlowText = this.getSchedule(/* opt_includeStackTraces */ true); | ||
// This filters the entire control flow text, not just the stack trace, so | ||
// unless we maintain a good (i.e. non-generic) set of keywords in | ||
// STACK_SUBSTRINGS_TO_FILTER, we run the risk of filtering out non stack | ||
// trace. The alternative though, which is to reimplement | ||
// webdriver.promise.ControlFlow.prototype.getSchedule() here is much | ||
// hackier, and involves messing with the control flow's internals / | ||
// private | ||
// variables. | ||
return helper.filterStackTrace(controlFlowText); | ||
}; | ||
var vm_ = require('vm'); | ||
var flow = webdriver.promise.controlFlow(); | ||
var context = { require: require }; | ||
global.list = function (locator) { | ||
return global.protractor | ||
.browser.findElements(locator) | ||
.then(function (arr) { | ||
var found = []; | ||
for (var i = 0; i < arr.length; ++i) { | ||
arr[i].getText().then(function (text) { | ||
found.push(text); | ||
}); | ||
} | ||
return found; | ||
}); | ||
}; | ||
for (var key in global) { | ||
context[key] = global[key]; | ||
} | ||
var sandbox = vm_.createContext(context); | ||
var browserUnderDebug = this; | ||
var debuggerReadyPromise = webdriver.promise.defer(); | ||
flow.execute(function () { | ||
process['debugPort'] = opt_debugPort || process['debugPort']; | ||
browserUnderDebug.validatePortAvailability_(process['debugPort']) | ||
.then(function (firstTime) { | ||
onStartFn(firstTime); | ||
var args = [process.pid, process['debugPort']]; | ||
if (browserUnderDebug.debuggerServerPort_) { | ||
args.push(browserUnderDebug.debuggerServerPort_); | ||
} | ||
var nodedebug = require('child_process').fork(debuggerClientPath, args); | ||
process.on('exit', function () { | ||
nodedebug.kill('SIGTERM'); | ||
}); | ||
nodedebug | ||
.on('message', function (m) { | ||
if (m === 'ready') { | ||
debuggerReadyPromise.fulfill(); | ||
} | ||
}) | ||
.on('exit', function () { | ||
logger.info('Debugger exiting'); | ||
// Clear this so that we know it's ok to attach a debugger | ||
// again. | ||
_this.dbgCodeExecutor_ = null; | ||
}); | ||
}); | ||
}); | ||
var pausePromise = flow.execute(function () { | ||
return debuggerReadyPromise.then(function () { | ||
// Necessary for backward compatibility with node < 0.12.0 | ||
return browserUnderDebug.executeScript_('', 'empty debugger hook'); | ||
}); | ||
}); | ||
// Helper used only by debuggers at './debugger/modes/*.js' to insert code | ||
// into the control flow. | ||
// In order to achieve this, we maintain a promise at the top of the control | ||
// flow, so that we can insert frames into it. | ||
// To be able to simulate callback/asynchronous code, we poll this object | ||
// for an result at every run of DeferredExecutor.execute. | ||
this.dbgCodeExecutor_ = { | ||
execPromise_: pausePromise, | ||
execPromiseResult_: undefined, | ||
execPromiseError_: undefined, | ||
// A dummy repl server to make use of its completion function. | ||
replServer_: require('repl').start({ | ||
input: { | ||
on: function () { }, | ||
resume: function () { } | ||
}, | ||
output: { write: function () { } }, | ||
useGlobal: true | ||
}), | ||
// Execute a function, which could yield a value or a promise, | ||
// and allow its result to be accessed synchronously | ||
execute_: function (execFn_) { | ||
var _this = this; | ||
this.execPromiseResult_ = this.execPromiseError_ = undefined; | ||
this.execPromise_ = this.execPromise_.then(execFn_).then(function (result) { | ||
_this.execPromiseResult_ = result; | ||
}, function (err) { | ||
_this.execPromiseError_ = err; | ||
}); | ||
// This dummy command is necessary so that the DeferredExecutor.execute | ||
// break point can find something to stop at instead of moving on to the | ||
// next real command. | ||
this.execPromise_.then(function () { | ||
return browserUnderDebug.executeScript_('', 'empty debugger hook'); | ||
}); | ||
}, | ||
// Execute a piece of code. | ||
// Result is a string representation of the evaluation. | ||
execute: function (code) { | ||
var _this = this; | ||
var execFn_ = function () { | ||
// Run code through vm so that we can maintain a local scope which is | ||
// isolated from the rest of the execution. | ||
var res = vm_.runInContext(code, sandbox); | ||
if (!webdriver.promise.isPromise(res)) { | ||
res = webdriver.promise.fulfilled(res); | ||
} | ||
return res.then(function (res) { | ||
if (res === undefined) { | ||
return undefined; | ||
} | ||
else { | ||
// The '' forces res to be expanded into a string instead of just | ||
// '[Object]'. Then we remove the extra space caused by the '' | ||
// using | ||
// substring. | ||
return util.format.apply(_this, ['', res]).substring(1); | ||
} | ||
}); | ||
}; | ||
this.execute_(execFn_); | ||
}, | ||
// Autocomplete for a line. | ||
// Result is a JSON representation of the autocomplete response. | ||
complete: function (line) { | ||
var _this = this; | ||
var execFn_ = function () { | ||
var deferred = webdriver.promise.defer(); | ||
_this.replServer_.complete(line, function (err, res) { | ||
if (err) { | ||
deferred.reject(err); | ||
} | ||
else { | ||
deferred.fulfill(JSON.stringify(res)); | ||
} | ||
}); | ||
return deferred; | ||
}; | ||
this.execute_(execFn_); | ||
}, | ||
// Code finished executing. | ||
resultReady: function () { | ||
return !this.execPromise_.isPending(); | ||
}, | ||
// Get asynchronous results synchronously. | ||
// This will throw if result is not ready. | ||
getResult: function () { | ||
if (!this.resultReady()) { | ||
throw new Error('Result not ready'); | ||
} | ||
if (this.execPromiseError_) { | ||
throw this.execPromiseError_; | ||
} | ||
return this.execPromiseResult_; | ||
} | ||
}; | ||
return pausePromise; | ||
}; | ||
/** | ||
* Beta (unstable) enterRepl function for entering the repl loop from | ||
@@ -937,3 +709,3 @@ * any point in the control flow. Use browser.enterRepl() in your test. | ||
}; | ||
this.initDebugger_(debuggerClientPath, onStartFn, opt_debugPort); | ||
this.debugHelper.init(debuggerClientPath, onStartFn, opt_debugPort); | ||
}; | ||
@@ -958,3 +730,3 @@ /** | ||
ProtractorBrowser.prototype.pause = function (opt_debugPort) { | ||
if (this.dbgCodeExecutor_) { | ||
if (this.debugHelper.isAttached()) { | ||
logger.info('Encountered browser.pause(), but debugger already attached.'); | ||
@@ -980,3 +752,3 @@ return webdriver.promise.fulfilled(true); | ||
}; | ||
return this.initDebugger_(debuggerClientPath, onStartFn, opt_debugPort); | ||
this.debugHelper.init(debuggerClientPath, onStartFn, opt_debugPort); | ||
}; | ||
@@ -987,4 +759,6 @@ /** | ||
* @param {webdriver.WebDriver} webdriver The configured webdriver instance. | ||
* @param {string=} opt_baseUrl A URL to prepend to relative gets. | ||
* @param {boolean=} opt_untrackOutstandingTimeouts Whether Browser should | ||
* @param {string=} baseUrl A URL to prepend to relative gets. | ||
* @param {string=} rootElement The css selector for the element which is the | ||
* root of the Angular app. | ||
* @param {boolean=} untrackOutstandingTimeouts Whether Browser should | ||
* stop tracking outstanding $timeouts. | ||
@@ -991,0 +765,0 @@ * @returns {Browser} a new Browser instance |
@@ -381,2 +381,7 @@ export interface Config { | ||
/** | ||
* If set, Protractor will ignore uncaught exceptions instead of exiting | ||
* without an error code. The exceptions will still be logged as warnings. | ||
*/ | ||
ignoreUncaughtExceptions?: boolean; | ||
/** | ||
* Test framework to use. This may be one of: jasmine, mocha or custom. | ||
@@ -476,2 +481,10 @@ * Default value is 'jasmine' | ||
disableEnvironmentOverrides?: boolean; | ||
/** | ||
* Tells Protractor to interpret any angular apps it comes across as hybrid | ||
* angular1/angular2 apps (i.e. apps using ngUpgrade) | ||
* Defaults to `false` | ||
* | ||
* @type {boolean} | ||
*/ | ||
ng12Hybrid?: boolean; | ||
seleniumArgs?: Array<any>; | ||
@@ -478,0 +491,0 @@ configDir?: string; |
@@ -38,2 +38,3 @@ "use strict"; | ||
skipSourceMapSupport: false, | ||
ng12Hybrid: false | ||
}; | ||
@@ -40,0 +41,0 @@ } |
@@ -33,3 +33,3 @@ var REPL_INITIAL_SUGGESTIONS = [ | ||
var expr = 'browser.dbgCodeExecutor_.execute("' + expression + '")'; | ||
var expr = 'browser.debugHelper.dbgCodeExecutor.execute("' + expression + '")'; | ||
this.evaluate_(expr, callback); | ||
@@ -51,3 +51,3 @@ }; | ||
line = line.replace(/"/g, '\\\"'); | ||
var expr = 'browser.dbgCodeExecutor_.complete("' + line + '")'; | ||
var expr = 'browser.debugHelper.dbgCodeExecutor.complete("' + line + '")'; | ||
this.evaluate_(expr, function(err, res) { | ||
@@ -78,3 +78,3 @@ // Result is a JSON representation of the autocomplete response. | ||
maxStringLength: 1000, | ||
expression: 'browser.dbgCodeExecutor_.resultReady()' | ||
expression: 'browser.debugHelper.dbgCodeExecutor.resultReady()' | ||
} | ||
@@ -89,3 +89,3 @@ }, function(err, res) { | ||
maxStringLength: -1, | ||
expression: 'browser.dbgCodeExecutor_.getResult()' | ||
expression: 'browser.debugHelper.dbgCodeExecutor.getResult()' | ||
} | ||
@@ -92,0 +92,0 @@ }, function(err, res) { |
@@ -311,3 +311,3 @@ /// <reference types="selenium-webdriver" /> | ||
*/ | ||
then(fn?: Function, errorFn?: Function): wdpromise.Promise<any[]>; | ||
then(fn?: (value: any) => {} | wdpromise.IThenable<{}>, errorFn?: (error: any) => any): wdpromise.Promise<any[]>; | ||
/** | ||
@@ -488,3 +488,3 @@ * Calls the input function on each ElementFinder represented by the | ||
elementArrayFinder_: ElementArrayFinder; | ||
then: (fn: Function, errorFn: Function) => wdpromise.Promise<any>; | ||
then: (fn: Function, errorFn?: Function) => wdpromise.Promise<any>; | ||
constructor(browser_: ProtractorBrowser, elementArrayFinder: ElementArrayFinder); | ||
@@ -491,0 +491,0 @@ [key: string]: any; |
@@ -168,4 +168,3 @@ "use strict"; | ||
// For each parent web element, find their children and construct | ||
// a | ||
// list of Promise<List<child_web_element>> | ||
// a list of Promise<List<child_web_element>> | ||
var childrenPromiseList = parentWebElements.map(function (parentWebElement) { | ||
@@ -177,6 +176,4 @@ return locator.findElementsOverride ? | ||
// Resolve the list of Promise<List<child_web_elements>> and merge | ||
// into | ||
// a single list | ||
return selenium_webdriver_1.promise.all(childrenPromiseList) | ||
.then(function (resolved) { | ||
// into a single list | ||
return selenium_webdriver_1.promise.all(childrenPromiseList).then(function (resolved) { | ||
return resolved.reduce(function (childrenList, resolvedE) { | ||
@@ -706,10 +703,11 @@ return childrenList.concat(resolvedE); | ||
*/ | ||
this.then = function (fn, errorFn) { | ||
return _this.elementArrayFinder_.then(function (actionResults) { | ||
if (!fn) { | ||
return actionResults[0]; | ||
} | ||
return fn(actionResults[0]); | ||
}, errorFn); | ||
}; | ||
this.then = | ||
function (fn, errorFn) { | ||
return _this.elementArrayFinder_.then(function (actionResults) { | ||
if (!fn) { | ||
return actionResults[0]; | ||
} | ||
return fn(actionResults[0]); | ||
}, errorFn); | ||
}; | ||
} | ||
@@ -716,0 +714,0 @@ // This filter verifies that there is only 1 element returned by the |
@@ -212,3 +212,5 @@ "use strict"; | ||
return elementFinder.getText().then(function (actualText) { | ||
return actualText.indexOf(text) > -1; | ||
// MSEdge does not properly remove newlines, which causes false | ||
// negatives | ||
return actualText.replace(/\r?\n|\r/g, '').indexOf(text) > -1; | ||
}); | ||
@@ -215,0 +217,0 @@ }; |
@@ -17,3 +17,3 @@ var q = require('q'); | ||
browser.enterRepl(); | ||
browser.executeScript_('', 'empty debugger hook').then(function() { | ||
browser.executeScriptWithDescription('', 'empty debugger hook').then(function() { | ||
resolve({ | ||
@@ -20,0 +20,0 @@ failedCount: 0 |
@@ -175,2 +175,9 @@ "use strict"; | ||
var e = (exc instanceof Error) ? exc : new Error(exc); | ||
if (config.ignoreUncaughtExceptions) { | ||
// This can be a sign of a bug in the test framework, that it may | ||
// not be handling WebDriver errors properly. However, we don't | ||
// want these errors to prevent running the tests. | ||
logger.warn('Ignoring uncaught error ' + exc); | ||
return; | ||
} | ||
var errorCode = exitCodes_1.ErrorHandler.parseError(e); | ||
@@ -177,0 +184,0 @@ if (errorCode) { |
@@ -211,3 +211,3 @@ "use strict"; | ||
if (config.debuggerServerPort) { | ||
browser_.debuggerServerPort_ = config.debuggerServerPort; | ||
browser_.debuggerServerPort = config.debuggerServerPort; | ||
} | ||
@@ -217,2 +217,5 @@ if (config.useAllAngular2AppRoots) { | ||
} | ||
if (config.ng12Hybrid) { | ||
browser_.ng12Hybrid = config.ng12Hybrid; | ||
} | ||
browser_.ready = | ||
@@ -241,3 +244,8 @@ driver.manage().timeouts().setScriptTimeout(config.allScriptsTimeout); | ||
// Copy mock modules, but do not navigate to previous URL. | ||
browser_ = browser_.forkNewDriverInstance(false, true); | ||
var forkBrowser = browser_.forkNewDriverInstance(false, true); | ||
// Replace the items in browser_ but do not create a new object | ||
// since this will break typescript imports | ||
for (var item in forkBrowser) { | ||
browser_[item] = forkBrowser[item]; | ||
} | ||
_this.setupGlobals_(browser_); | ||
@@ -244,0 +252,0 @@ }; |
@@ -308,3 +308,3 @@ // Used to provide better protractor documentation for webdriver. These files | ||
* Used to switch WebDriver's focus to a frame or window (e.g. an alert, an | ||
* iframe, another window). | ||
* iframe, another window). | ||
* | ||
@@ -557,3 +557,3 @@ * See [WebDriver's TargetLocator Docs](http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_TargetLocator.html) | ||
* var foo = element(by.id('foo')); | ||
* expect(foo.getAttribute(class)).toEqual('bar'); | ||
* expect(foo.getAttribute('class')).toEqual('bar'); | ||
* | ||
@@ -560,0 +560,0 @@ * @param {string} attributeName The name of the attribute to query. |
// Same process for importing and compiling at ../spec.ts, except you need to | ||
// pass the `-t ES2015` flag to `tsc`. | ||
import {browser, element, by, By, $, $$, ExpectedConditions} from 'protractor/globals'; | ||
import {browser, element, by, By, $, $$, ExpectedConditions} from 'protractor'; | ||
@@ -10,5 +10,5 @@ describe('async function', function() { | ||
if ((await todoList.count()) > 1) { | ||
expect(todoList.get(1).getText()).toEqual('build an angular app'); | ||
expect((await todoList.get(1).getText())).toEqual('build an angular app'); | ||
} | ||
}); | ||
}); |
@@ -15,6 +15,6 @@ { | ||
"dependencies": { | ||
"@types/jasmine": "^2.2.31", | ||
"@types/node": "^6.0.35", | ||
"@types/q": "^0.0.30", | ||
"@types/selenium-webdriver": "~2.53.30", | ||
"@types/jasmine": "^2.5.36", | ||
"@types/node": "^6.0.46", | ||
"@types/q": "^0.0.32", | ||
"@types/selenium-webdriver": "~2.53.31", | ||
"adm-zip": "0.4.7", | ||
@@ -30,3 +30,3 @@ "chalk": "^1.1.3", | ||
"source-map-support": "~0.4.0", | ||
"webdriver-manager": "^10.2.2" | ||
"webdriver-manager": "^10.2.6" | ||
}, | ||
@@ -38,3 +38,3 @@ "devDependencies": { | ||
"@types/minimist": "^1.1.28", | ||
"@types/optimist": "0.0.28", | ||
"@types/optimist": "^0.0.29", | ||
"body-parser": "~1.15.2", | ||
@@ -80,3 +80,3 @@ "chai": "~3.5.0", | ||
}, | ||
"version": "4.0.9" | ||
"version": "4.0.10" | ||
} |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
601903
95
11978
+ Added@types/q@0.0.32(transitive)
- Removed@types/q@0.0.30(transitive)
Updated@types/jasmine@^2.5.36
Updated@types/node@^6.0.46
Updated@types/q@^0.0.32
Updatedwebdriver-manager@^10.2.6