11import { BPClient } from 'blocking-proxy' ;
22import { ActionSequence , By , Capabilities , Command as WdCommand , FileDetector , ICommandName , Options , promise as wdpromise , Session , TargetLocator , TouchSequence , until , WebDriver , WebElement } from 'selenium-webdriver' ;
33import * as url from 'url' ;
4+ import { extend as extendWD , ExtendedWebDriver } from 'webdriver-js-extender' ;
45
56import { DebugHelper } from './debugger' ;
67import { build$ , build$$ , ElementArrayFinder , ElementFinder } from './element' ;
@@ -35,7 +36,7 @@ for (let foo in require('selenium-webdriver')) {
3536
3637// Explicitly define webdriver.WebDriver
3738// TODO: extend WebDriver from selenium-webdriver typings
38- export class Webdriver {
39+ export class AbstractWebDriver {
3940 actions : ( ) => ActionSequence ;
4041 call :
4142 ( fn : ( ...var_args : any [ ] ) => any , opt_scope ?: any ,
@@ -64,6 +65,11 @@ export class Webdriver {
6465 opt_message ?: string ) => wdpromise . Promise < any > ;
6566}
6667
68+ export class AbstractExtendedWebDriver extends AbstractWebDriver {
69+ getNetworkConnection : ( ) => wdpromise . Promise < number > ;
70+ setNetworkConnection : ( type : number ) => wdpromise . Promise < void > ;
71+ }
72+
6773/**
6874 * Mix a function from one object onto another. The function will still be
6975 * called in the context of the original object. Any arguments of type
@@ -116,15 +122,15 @@ function buildElementHelper(browser: ProtractorBrowser): ElementHelper {
116122/**
117123 * @alias browser
118124 * @constructor
119- * @extends {webdriver.WebDriver }
125+ * @extends {webdriver_extensions.ExtendedWebDriver }
120126 * @param {webdriver.WebDriver } webdriver
121127 * @param {string= } opt_baseUrl A base URL to run get requests against.
122128 * @param {string= } opt_rootElement Selector element that has an ng-app in
123129 * scope.
124130 * @param {boolean= } opt_untrackOutstandingTimeouts Whether Protractor should
125131 * stop tracking outstanding $timeouts.
126132 */
127- export class ProtractorBrowser extends Webdriver {
133+ export class ProtractorBrowser extends AbstractExtendedWebDriver {
128134 /**
129135 * @type {ProtractorBy }
130136 */
@@ -139,9 +145,9 @@ export class ProtractorBrowser extends Webdriver {
139145 * The wrapped webdriver instance. Use this to interact with pages that do
140146 * not contain Angular (such as a log-in screen).
141147 *
142- * @type {webdriver.WebDriver }
148+ * @type {webdriver_extensions.ExtendedWebDriver }
143149 */
144- driver : WebDriver ;
150+ driver : ExtendedWebDriver ;
145151
146152 /**
147153 * The client used to control the BlockingProxy. If unset, BlockingProxy is
@@ -303,19 +309,27 @@ export class ProtractorBrowser extends Webdriver {
303309 // wait for Angular to sync up before performing the action. This does not
304310 // include functions which are overridden by protractor below.
305311 let methodsToSync = [ 'getCurrentUrl' , 'getPageSource' , 'getTitle' ] ;
312+ let extendWDInstance : ExtendedWebDriver ;
313+ try {
314+ extendWDInstance = extendWD ( webdriverInstance ) ;
315+ } catch ( e ) {
316+ // Probably not a driver that can be extended (e.g. gotten using
317+ // `directConnect: true` in the config)
318+ extendWDInstance = webdriverInstance as ExtendedWebDriver ;
319+ }
306320
307321 // Mix all other driver functionality into Protractor.
308322 Object . getOwnPropertyNames ( WebDriver . prototype ) . forEach ( method => {
309- if ( ! this [ method ] && typeof ( webdriverInstance as any ) [ method ] === 'function' ) {
323+ if ( ! this [ method ] && typeof ( extendWDInstance as any ) [ method ] === 'function' ) {
310324 if ( methodsToSync . indexOf ( method ) !== - 1 ) {
311- ptorMixin ( this , webdriverInstance , method , this . waitForAngular . bind ( this ) ) ;
325+ ptorMixin ( this , extendWDInstance , method , this . waitForAngular . bind ( this ) ) ;
312326 } else {
313- ptorMixin ( this , webdriverInstance , method ) ;
327+ ptorMixin ( this , extendWDInstance , method ) ;
314328 }
315329 }
316330 } ) ;
317331
318- this . driver = webdriverInstance ;
332+ this . driver = extendWDInstance ;
319333 if ( opt_blockingProxyUrl ) {
320334 logger . info ( 'Starting BP client for ' + opt_blockingProxyUrl ) ;
321335 this . bpClient = new BPClient ( opt_blockingProxyUrl ) ;
0 commit comments