@@ -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 fork.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,84 @@ 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.restart().then(function() {
495
+ * console.log(browser === savedBrowser); // false
496
+ * });
497
+ *
498
+ * @returns {webdriver.promise.Promise<ProtractorBrowser> } A promise resolving to the restarted
499
+ * browser
438
500
*/
439
- restart ( ) {
501
+ restart ( ) : wdpromise . Promise < ProtractorBrowser > {
502
+ return ;
503
+ }
504
+
505
+ /**
506
+ * Like `restart`, but instead of returning a promise resolving to the new browser instance,
507
+ * returns the new browser instance directly. Can only be used when the control flow is enabled.
508
+ *
509
+ * @example
510
+ * // Running against global browser
511
+ * browser.get('page1');
512
+ * browser.restartSync();
513
+ * browser.get('page2'); // 'page2' gotten by restarted browser
514
+ *
515
+ * @example
516
+ * // Running against forked browsers
517
+ * var forked = browser.forkNewDriverInstance();
518
+ * fork.get('page1');
519
+ * fork = fork.restartSync();
520
+ * fork.get('page2'); // 'page2' gotten by restarted fork
521
+ *
522
+ * @throws {TypeError } Will throw an error if the control flow is not enabled
523
+ * @returns {ProtractorBrowser } The restarted browser
524
+ */
525
+ restartSync ( ) : ProtractorBrowser {
440
526
return ;
441
527
}
442
528
@@ -1054,4 +1140,18 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
1054
1140
} ;
1055
1141
this . debugHelper . init ( debuggerClientPath , onStartFn , opt_debugPort ) ;
1056
1142
}
1143
+
1144
+ /**
1145
+ * Determine if the control flow is enabled.
1146
+ *
1147
+ * @returns true if the control flow is enabled, false otherwise.
1148
+ */
1149
+ controlFlowIsEnabled ( ) {
1150
+ if ( ( wdpromise as any ) . USE_PROMISE_MANAGER !== undefined ) {
1151
+ return ( wdpromise as any ) . USE_PROMISE_MANAGER ;
1152
+ } else {
1153
+ // True for old versions of `selenium-webdriver`, probably false in >=5.0.0
1154
+ return ! ! wdpromise . ControlFlow ;
1155
+ }
1156
+ }
1057
1157
}
0 commit comments