@@ -282,11 +282,16 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
282
282
params : any ;
283
283
284
284
/**
285
+ * Resolved when the browser is ready for use. Resolves to the browser, so
286
+ * you can do:
287
+ *
288
+ * forkedBrowser = await browser.forkNewDriverInstance().ready;
289
+ *
285
290
* Set by the runner.
286
291
*
287
- * @type {q. Promise} Done when the new browser is ready for use
292
+ * @type {webdriver.promise. Promise.<ProtractorBrowser> }
288
293
*/
289
- ready : wdpromise . Promise < any > ;
294
+ ready : wdpromise . Promise < ProtractorBrowser > ;
290
295
291
296
/*
292
297
* Set by the runner.
@@ -464,7 +469,15 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
464
469
/**
465
470
* Fork another instance of browser for use in interactive tests.
466
471
*
467
- * Set by the runner.
472
+ * @example
473
+ * // Running with control flow enabled
474
+ * var fork = browser.forkNewDriverInstance();
475
+ * fork.get('page1'); // 'page1' gotten by forked browser
476
+ *
477
+ * @example
478
+ * // Running with control flow disabled
479
+ * var forked = await browser.forkNewDriverInstance().ready;
480
+ * await forked.get('page1'); // 'page1' gotten by forked browser
468
481
*
469
482
* @param {boolean } opt_useSameUrl Whether to navigate to current url on
470
483
* creation
@@ -478,11 +491,85 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
478
491
}
479
492
480
493
/**
481
- * Restart the browser instance.
494
+ * Restart the browser. This is done by closing this browser instance and creating a new one.
495
+ * A promise resolving to the new instance is returned, and if this function was called on the
496
+ * global `browser` instance then Protractor will automatically overwrite the global `browser`
497
+ * variable.
498
+ *
499
+ * When restarting a forked browser, it is the caller's job to overwrite references to the old
500
+ * instance.
501
+ *
502
+ * This function behaves slightly differently depending on if the webdriver control flow is
503
+ * enabled. If the control flow is enabled, the global `browser` object is synchronously
504
+ * replaced. If the control flow is disabled, the global `browser` is replaced asynchronously
505
+ * after the old driver quits.
482
506
*
483
507
* Set by the runner.
508
+ *
509
+ * @example
510
+ * // Running against global browser, with control flow enabled
511
+ * browser.get('page1');
512
+ * browser.restart();
513
+ * browser.get('page2'); // 'page2' gotten by restarted browser
514
+ *
515
+ * @example
516
+ * // Running against global browser, with control flow disabled
517
+ * await browser.get('page1');
518
+ * await browser.restart();
519
+ * await browser.get('page2'); // 'page2' gotten by restarted browser
520
+ *
521
+ * @example
522
+ * // Running against forked browsers, with the control flow enabled
523
+ * // In this case, you may prefer `restartSync` (documented below)
524
+ * var forked = browser.forkNewDriverInstance();
525
+ * fork.get('page1');
526
+ * fork.restart().then(function(fork) {
527
+ * fork.get('page2'); // 'page2' gotten by restarted fork
528
+ * });
529
+ *
530
+ * @example
531
+ * // Running against forked browsers, with the control flow disabled
532
+ * var forked = await browser.forkNewDriverInstance().ready;
533
+ * await fork.get('page1');
534
+ * fork = await fork.restart();
535
+ * await fork.get('page2'); // 'page2' gotten by restarted fork
536
+ *
537
+ * @example
538
+ * // Unexpected behavior can occur if you save references to the global `browser`
539
+ * var savedBrowser = browser;
540
+ * browser.get('foo').then(function() {
541
+ * console.log(browser === savedBrowser); // false
542
+ * });
543
+ * browser.restart();
544
+ *
545
+ * @returns {webdriver.promise.Promise<ProtractorBrowser> } A promise resolving to the restarted
546
+ * browser
484
547
*/
485
- restart ( ) {
548
+ restart ( ) : wdpromise . Promise < ProtractorBrowser > {
549
+ return ;
550
+ }
551
+
552
+ /**
553
+ * Like `restart`, but instead of returning a promise resolving to the new browser instance,
554
+ * returns the new browser instance directly. Can only be used when the control flow is enabled.
555
+ *
556
+ * @example
557
+ * // Running against global browser
558
+ * browser.get('page1');
559
+ * browser.restartSync();
560
+ * browser.get('page2'); // 'page2' gotten by restarted browser
561
+ *
562
+ * @example
563
+ * // Running against forked browsers
564
+ * var forked = browser.forkNewDriverInstance();
565
+ * fork.get('page1');
566
+ * fork = fork.restartSync();
567
+ * fork.get('page2'); // 'page2' gotten by restarted fork
568
+ *
569
+ * @throws {TypeError } Will throw an error if the control flow is not enabled
570
+ * @returns {ProtractorBrowser } The restarted browser
571
+ */
572
+ restartSync ( ) : ProtractorBrowser {
486
573
return ;
487
574
}
488
575
@@ -1100,4 +1187,18 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
1100
1187
} ;
1101
1188
this . debugHelper . init ( debuggerClientPath , onStartFn , opt_debugPort ) ;
1102
1189
}
1190
+
1191
+ /**
1192
+ * Determine if the control flow is enabled.
1193
+ *
1194
+ * @returns true if the control flow is enabled, false otherwise.
1195
+ */
1196
+ controlFlowIsEnabled ( ) {
1197
+ if ( ( wdpromise as any ) . USE_PROMISE_MANAGER !== undefined ) {
1198
+ return ( wdpromise as any ) . USE_PROMISE_MANAGER ;
1199
+ } else {
1200
+ // True for old versions of `selenium-webdriver`, probably false in >=5.0.0
1201
+ return ! ! wdpromise . ControlFlow ;
1202
+ }
1203
+ }
1103
1204
}
0 commit comments