@@ -317,11 +317,16 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
317
317
params : any ;
318
318
319
319
/**
320
+ * Resolved when the browser is ready for use. Resolves to the browser, so
321
+ * you can do:
322
+ *
323
+ * forkedBrowser = await browser.forkNewDriverInstance().ready;
324
+ *
320
325
* Set by the runner.
321
326
*
322
- * @type {q. Promise} Done when the new browser is ready for use
327
+ * @type {webdriver.promise. Promise.<ProtractorBrowser> }
323
328
*/
324
- ready : wdpromise . Promise < any > ;
329
+ ready : wdpromise . Promise < ProtractorBrowser > ;
325
330
326
331
/*
327
332
* Set by the runner.
@@ -499,7 +504,15 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
499
504
/**
500
505
* Fork another instance of browser for use in interactive tests.
501
506
*
502
- * Set by the runner.
507
+ * @example
508
+ * // Running with control flow enabled
509
+ * var fork = browser.forkNewDriverInstance();
510
+ * fork.get('page1'); // 'page1' gotten by forked browser
511
+ *
512
+ * @example
513
+ * // Running with control flow disabled
514
+ * var forked = await browser.forkNewDriverInstance().ready;
515
+ * await forked.get('page1'); // 'page1' gotten by forked browser
503
516
*
504
517
* @param {boolean } opt_useSameUrl Whether to navigate to current url on
505
518
* creation
@@ -513,11 +526,85 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
513
526
}
514
527
515
528
/**
516
- * Restart the browser instance.
529
+ * Restart the browser. This is done by closing this browser instance and creating a new one.
530
+ * A promise resolving to the new instance is returned, and if this function was called on the
531
+ * global `browser` instance then Protractor will automatically overwrite the global `browser`
532
+ * variable.
533
+ *
534
+ * When restarting a forked browser, it is the caller's job to overwrite references to the old
535
+ * instance.
536
+ *
537
+ * This function behaves slightly differently depending on if the webdriver control flow is
538
+ * enabled. If the control flow is enabled, the global `browser` object is synchronously
539
+ * replaced. If the control flow is disabled, the global `browser` is replaced asynchronously
540
+ * after the old driver quits.
517
541
*
518
542
* Set by the runner.
543
+ *
544
+ * @example
545
+ * // Running against global browser, with control flow enabled
546
+ * browser.get('page1');
547
+ * browser.restart();
548
+ * browser.get('page2'); // 'page2' gotten by restarted browser
549
+ *
550
+ * @example
551
+ * // Running against global browser, with control flow disabled
552
+ * await browser.get('page1');
553
+ * await browser.restart();
554
+ * await browser.get('page2'); // 'page2' gotten by restarted browser
555
+ *
556
+ * @example
557
+ * // Running against forked browsers, with the control flow enabled
558
+ * // In this case, you may prefer `restartSync` (documented below)
559
+ * var forked = browser.forkNewDriverInstance();
560
+ * fork.get('page1');
561
+ * fork.restart().then(function(fork) {
562
+ * fork.get('page2'); // 'page2' gotten by restarted fork
563
+ * });
564
+ *
565
+ * @example
566
+ * // Running against forked browsers, with the control flow disabled
567
+ * var forked = await browser.forkNewDriverInstance().ready;
568
+ * await fork.get('page1');
569
+ * fork = await fork.restart();
570
+ * await fork.get('page2'); // 'page2' gotten by restarted fork
571
+ *
572
+ * @example
573
+ * // Unexpected behavior can occur if you save references to the global `browser`
574
+ * var savedBrowser = browser;
575
+ * browser.get('foo').then(function() {
576
+ * console.log(browser === savedBrowser); // false
577
+ * });
578
+ * browser.restart();
579
+ *
580
+ * @returns {webdriver.promise.Promise<ProtractorBrowser> } A promise resolving to the restarted
581
+ * browser
519
582
*/
520
- restart ( ) {
583
+ restart ( ) : wdpromise . Promise < ProtractorBrowser > {
584
+ return ;
585
+ }
586
+
587
+ /**
588
+ * Like `restart`, but instead of returning a promise resolving to the new browser instance,
589
+ * returns the new browser instance directly. Can only be used when the control flow is enabled.
590
+ *
591
+ * @example
592
+ * // Running against global browser
593
+ * browser.get('page1');
594
+ * browser.restartSync();
595
+ * browser.get('page2'); // 'page2' gotten by restarted browser
596
+ *
597
+ * @example
598
+ * // Running against forked browsers
599
+ * var forked = browser.forkNewDriverInstance();
600
+ * fork.get('page1');
601
+ * fork = fork.restartSync();
602
+ * fork.get('page2'); // 'page2' gotten by restarted fork
603
+ *
604
+ * @throws {TypeError } Will throw an error if the control flow is not enabled
605
+ * @returns {ProtractorBrowser } The restarted browser
606
+ */
607
+ restartSync ( ) : ProtractorBrowser {
521
608
return ;
522
609
}
523
610
@@ -1138,4 +1225,18 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
1138
1225
} ;
1139
1226
this . debugHelper . init ( debuggerClientPath , onStartFn , opt_debugPort ) ;
1140
1227
}
1228
+
1229
+ /**
1230
+ * Determine if the control flow is enabled.
1231
+ *
1232
+ * @returns true if the control flow is enabled, false otherwise.
1233
+ */
1234
+ controlFlowIsEnabled ( ) {
1235
+ if ( ( wdpromise as any ) . USE_PROMISE_MANAGER !== undefined ) {
1236
+ return ( wdpromise as any ) . USE_PROMISE_MANAGER ;
1237
+ } else {
1238
+ // True for old versions of `selenium-webdriver`, probably false in >=5.0.0
1239
+ return ! ! wdpromise . ControlFlow ;
1240
+ }
1241
+ }
1141
1242
}
0 commit comments