@@ -480,7 +480,7 @@ public void ShouldBeAbleToExecuteABigChunkOfJavascriptCode()
480
480
[ IgnoreBrowser ( Selenium . Browser . Safari , "Safari does not support Chrome DevTools Protocol" ) ]
481
481
public async Task ShouldBeAbleToPinJavascriptCodeAndExecuteRepeatedly ( )
482
482
{
483
- IJavaScriptEngine jsEngine = new JavaScriptEngine ( driver ) ;
483
+ using IJavaScriptEngine jsEngine = new JavaScriptEngine ( driver ) ;
484
484
485
485
driver . Url = xhtmlTestPage ;
486
486
@@ -500,6 +500,107 @@ public async Task ShouldBeAbleToPinJavascriptCodeAndExecuteRepeatedly()
500
500
Throws . TypeOf < JavaScriptException > ( ) ) ;
501
501
}
502
502
503
+ [ Test ]
504
+ [ NeedsFreshDriver ( IsCreatedAfterTest = true ) ]
505
+ [ IgnoreBrowser ( Selenium . Browser . IE , "IE does not support Chrome DevTools Protocol" ) ]
506
+ [ IgnoreBrowser ( Selenium . Browser . Firefox , "Firefox does not support Chrome DevTools Protocol" ) ]
507
+ [ IgnoreBrowser ( Selenium . Browser . Safari , "Safari does not support Chrome DevTools Protocol" ) ]
508
+ public async Task ShouldBeAbleToAddInitializationScriptAndExecuteOnNewDocument ( )
509
+ {
510
+ const string ScriptValue = "alert('notice')" ;
511
+ const string ScriptName = "AlertScript" ;
512
+
513
+ using IJavaScriptEngine jsEngine = new JavaScriptEngine ( driver ) ;
514
+
515
+ var initScript = await jsEngine . AddInitializationScript ( ScriptName , ScriptValue ) ;
516
+
517
+ Assert . That ( initScript , Is . Not . Null ) ;
518
+ Assert . That ( initScript . ScriptSource , Is . EqualTo ( ScriptValue ) ) ;
519
+ Assert . That ( initScript . ScriptName , Is . EqualTo ( ScriptName ) ) ;
520
+ Assert . That ( initScript . ScriptId , Is . Not . Null ) ;
521
+
522
+ await jsEngine . StartEventMonitoring ( ) ;
523
+
524
+ driver . Navigate ( ) . Refresh ( ) ;
525
+ driver . SwitchTo ( ) . Alert ( ) . Accept ( ) ;
526
+
527
+ Assert . That ( jsEngine . InitializationScripts , Does . Contain ( initScript ) ) ;
528
+ await jsEngine . RemoveInitializationScript ( ScriptName ) ;
529
+
530
+ driver . Navigate ( ) . Refresh ( ) ;
531
+ Assert . That ( ( ) => driver . SwitchTo ( ) . Alert ( ) . Accept ( ) , Throws . TypeOf < NoAlertPresentException > ( ) ) ;
532
+
533
+ Assert . That ( jsEngine . InitializationScripts , Does . Not . Contain ( initScript ) ) ;
534
+
535
+ await jsEngine . AddInitializationScript ( ScriptName , ScriptValue ) ;
536
+
537
+ driver . Navigate ( ) . Refresh ( ) ;
538
+ driver . SwitchTo ( ) . Alert ( ) . Accept ( ) ;
539
+ Assert . That ( jsEngine . InitializationScripts , Does . Contain ( initScript ) ) ;
540
+
541
+ await jsEngine . ClearInitializationScripts ( ) ;
542
+
543
+ driver . Navigate ( ) . Refresh ( ) ;
544
+ Assert . That ( ( ) => driver . SwitchTo ( ) . Alert ( ) . Accept ( ) , Throws . TypeOf < NoAlertPresentException > ( ) ) ;
545
+ Assert . That ( jsEngine . InitializationScripts , Is . Empty ) ;
546
+
547
+ await jsEngine . AddInitializationScript ( ScriptName , ScriptValue ) ;
548
+ driver . Navigate ( ) . Refresh ( ) ;
549
+ driver . SwitchTo ( ) . Alert ( ) . Accept ( ) ;
550
+
551
+ await jsEngine . ClearAll ( ) ;
552
+ driver . Navigate ( ) . Refresh ( ) ;
553
+ Assert . That ( ( ) => driver . SwitchTo ( ) . Alert ( ) . Accept ( ) , Throws . TypeOf < NoAlertPresentException > ( ) ) ;
554
+ Assert . That ( jsEngine . InitializationScripts , Is . Empty ) ;
555
+ }
556
+
557
+ [ Test ]
558
+ [ NeedsFreshDriver ( IsCreatedAfterTest = true ) ]
559
+ [ IgnoreBrowser ( Selenium . Browser . IE , "IE does not support Chrome DevTools Protocol" ) ]
560
+ [ IgnoreBrowser ( Selenium . Browser . Firefox , "Firefox does not support Chrome DevTools Protocol" ) ]
561
+ [ IgnoreBrowser ( Selenium . Browser . Safari , "Safari does not support Chrome DevTools Protocol" ) ]
562
+ public async Task ShouldBeAbleToAddAndRemoveScriptCallbackBinding ( )
563
+ {
564
+ const string ScriptValue = "alert('Hello world')" ;
565
+ const string ScriptName = "alert" ;
566
+
567
+ using IJavaScriptEngine jsEngine = new JavaScriptEngine ( driver ) ;
568
+
569
+ var executedBindings = new List < string > ( ) ;
570
+ jsEngine . JavaScriptCallbackExecuted += AddToList ;
571
+ await jsEngine . AddInitializationScript ( ScriptName , ScriptValue ) ;
572
+ await jsEngine . StartEventMonitoring ( ) ;
573
+
574
+ driver . Navigate ( ) . Refresh ( ) ;
575
+ driver . SwitchTo ( ) . Alert ( ) . Accept ( ) ;
576
+
577
+ await jsEngine . AddScriptCallbackBinding ( ScriptName ) ;
578
+
579
+ driver . Navigate ( ) . Refresh ( ) ;
580
+ Assert . That ( ( ) => driver . SwitchTo ( ) . Alert ( ) . Accept ( ) , Throws . TypeOf < NoAlertPresentException > ( ) ) ;
581
+
582
+ Assert . That ( executedBindings , Does . Contain ( ScriptName ) ) ;
583
+ int oldCount = executedBindings . Count ;
584
+ driver . Navigate ( ) . Refresh ( ) ;
585
+
586
+ Assert . That ( executedBindings , Has . Count . GreaterThan ( oldCount ) ) ;
587
+ Assert . That ( jsEngine . ScriptCallbackBindings , Does . Contain ( ScriptName ) ) ;
588
+ oldCount = executedBindings . Count ;
589
+
590
+ await jsEngine . RemoveScriptCallbackBinding ( ScriptName ) ;
591
+ Assert . That ( jsEngine . ScriptCallbackBindings , Is . Empty ) ;
592
+ await jsEngine . AddScriptCallbackBinding ( ScriptName ) ;
593
+ Assert . That ( jsEngine . ScriptCallbackBindings , Does . Contain ( ScriptName ) ) ;
594
+ await jsEngine . ClearScriptCallbackBindings ( ) ;
595
+ Assert . That ( jsEngine . ScriptCallbackBindings , Is . Empty ) ;
596
+
597
+ jsEngine . JavaScriptCallbackExecuted -= AddToList ;
598
+ driver . Navigate ( ) . Refresh ( ) ;
599
+ Assert . That ( executedBindings , Has . Count . EqualTo ( oldCount ) ) ;
600
+
601
+ void AddToList ( object sender , JavaScriptCallbackExecutedEventArgs e ) => executedBindings . Add ( e . BindingName ) ;
602
+ }
603
+
503
604
[ Test ]
504
605
public void ShouldBeAbleToExecuteScriptAndReturnElementsList ( )
505
606
{
0 commit comments