@@ -236,11 +236,16 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
236
236
params : any ;
237
237
238
238
/**
239
+ * Resolved when the browser is ready for use. Resolves to the browser, so
240
+ * you can do:
241
+ *
242
+ * forkedBrowser = await browser.forkNewDriverInstance().ready;
243
+ *
239
244
* Set by the runner.
240
245
*
241
- * @type {q. Promise} Done when the new browser is ready for use
246
+ * @type {webdriver.promise. Promise.<ProtractorBrowser> }
242
247
*/
243
- ready : wdpromise . Promise < any > ;
248
+ ready : wdpromise . Promise < ProtractorBrowser > ;
244
249
245
250
/*
246
251
* Set by the runner.
@@ -418,7 +423,15 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
418
423
/**
419
424
* Fork another instance of browser for use in interactive tests.
420
425
*
421
- * Set by the runner.
426
+ * @example
427
+ * // Running with control flow enabled
428
+ * var fork = browser.forkNewDriverInstance();
429
+ * fork.get('page1'); // 'page1' gotten by forked browser
430
+ *
431
+ * @example
432
+ * // Running with control flow disabled
433
+ * var forked = await browser.forkNewDriverInstance().ready;
434
+ * await forked.get('page1'); // 'page1' gotten by forked browser
422
435
*
423
436
* @param {boolean } opt_useSameUrl Whether to navigate to current url on
424
437
* creation
@@ -432,11 +445,85 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
432
445
}
433
446
434
447
/**
435
- * Restart the browser instance.
448
+ * Restart the browser. This is done by closing this browser instance and creating a new one.
449
+ * A promise resolving to the new instance is returned, and if this function was called on the
450
+ * global `browser` instance then Protractor will automatically overwrite the global `browser`
451
+ * variable.
452
+ *
453
+ * When restarting a forked browser, it is the caller's job to overwrite references to the old
454
+ * instance.
455
+ *
456
+ * This function behaves slightly differently depending on if the webdriver control flow is
457
+ * enabled. If the control flow is enabled, the global `browser` object is synchronously
458
+ * replaced. If the control flow is disabled, the global `browser` is replaced asynchronously
459
+ * after the old driver quits.
436
460
*
437
461
* Set by the runner.
462
+ *
463
+ * @example
464
+ * // Running against global browser, with control flow enabled
465
+ * browser.get('page1');
466
+ * browser.restart();
467
+ * browser.get('page2'); // 'page2' gotten by restarted browser
468
+ *
469
+ * @example
470
+ * // Running against global browser, with control flow disabled
471
+ * await browser.get('page1');
472
+ * await browser.restart();
473
+ * await browser.get('page2'); // 'page2' gotten by restarted browser
474
+ *
475
+ * @example
476
+ * // Running against forked browsers, with the control flow enabled
477
+ * // In this case, you may prefer `restartSync` (documented below)
478
+ * var forked = browser.forkNewDriverInstance();
479
+ * fork.get('page1');
480
+ * fork.restart().then(function(fork) {
481
+ * fork.get('page2'); // 'page2' gotten by restarted fork
482
+ * });
483
+ *
484
+ * @example
485
+ * // Running against forked browsers, with the control flow disabled
486
+ * var forked = await browser.forkNewDriverInstance().ready;
487
+ * await fork.get('page1');
488
+ * fork = await fork.restart();
489
+ * await fork.get('page2'); // 'page2' gotten by restarted fork
490
+ *
491
+ * @example
492
+ * // Unexpected behavior can occur if you save references to the global `browser`
493
+ * var savedBrowser = browser;
494
+ * browser.get('foo').then(function() {
495
+ * console.log(browser === savedBrowser); // false
496
+ * });
497
+ * browser.restart();
498
+ *
499
+ * @returns {webdriver.promise.Promise<ProtractorBrowser> } A promise resolving to the restarted
500
+ * browser
438
501
*/
439
- restart ( ) {
502
+ restart ( ) : wdpromise . Promise < ProtractorBrowser > {
503
+ return ;
504
+ }
505
+
506
+ /**
507
+ * Like `restart`, but instead of returning a promise resolving to the new browser instance,
508
+ * returns the new browser instance directly. Can only be used when the control flow is enabled.
509
+ *
510
+ * @example
511
+ * // Running against global browser
512
+ * browser.get('page1');
513
+ * browser.restartSync();
514
+ * browser.get('page2'); // 'page2' gotten by restarted browser
515
+ *
516
+ * @example
517
+ * // Running against forked browsers
518
+ * var forked = browser.forkNewDriverInstance();
519
+ * fork.get('page1');
520
+ * fork = fork.restartSync();
521
+ * fork.get('page2'); // 'page2' gotten by restarted fork
522
+ *
523
+ * @throws {TypeError } Will throw an error if the control flow is not enabled
524
+ * @returns {ProtractorBrowser } The restarted browser
525
+ */
526
+ restartSync ( ) : ProtractorBrowser {
440
527
return ;
441
528
}
442
529
@@ -1054,4 +1141,18 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
1054
1141
} ;
1055
1142
this . debugHelper . init ( debuggerClientPath , onStartFn , opt_debugPort ) ;
1056
1143
}
1144
+
1145
+ /**
1146
+ * Determine if the control flow is enabled.
1147
+ *
1148
+ * @returns true if the control flow is enabled, false otherwise.
1149
+ */
1150
+ controlFlowIsEnabled ( ) {
1151
+ if ( ( wdpromise as any ) . USE_PROMISE_MANAGER !== undefined ) {
1152
+ return ( wdpromise as any ) . USE_PROMISE_MANAGER ;
1153
+ } else {
1154
+ // True for old versions of `selenium-webdriver`, probably false in >=5.0.0
1155
+ return ! ! wdpromise . ControlFlow ;
1156
+ }
1157
+ }
1057
1158
}
0 commit comments