@@ -480,7 +480,7 @@ public void ShouldBeAbleToExecuteABigChunkOfJavascriptCode()
480480 [ IgnoreBrowser ( Selenium . Browser . Safari , "Safari does not support Chrome DevTools Protocol" ) ]
481481 public async Task ShouldBeAbleToPinJavascriptCodeAndExecuteRepeatedly ( )
482482 {
483- IJavaScriptEngine jsEngine = new JavaScriptEngine ( driver ) ;
483+ using IJavaScriptEngine jsEngine = new JavaScriptEngine ( driver ) ;
484484
485485 driver . Url = xhtmlTestPage ;
486486
@@ -500,6 +500,107 @@ public async Task ShouldBeAbleToPinJavascriptCodeAndExecuteRepeatedly()
500500 Throws . TypeOf < JavaScriptException > ( ) ) ;
501501 }
502502
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+
503604 [ Test ]
504605 public void ShouldBeAbleToExecuteScriptAndReturnElementsList ( )
505606 {
0 commit comments