@@ -593,6 +593,220 @@ def on_navigation_committed(info):
593593 driver .browsing_context .remove_event_handler ("navigation_committed" , callback_id )
594594
595595
596+ def test_add_event_handler_dom_content_loaded (driver , pages ):
597+ """Test adding event handler for dom_content_loaded event."""
598+ events_received = []
599+
600+ def on_dom_content_loaded (info ):
601+ events_received .append (info )
602+
603+ callback_id = driver .browsing_context .add_event_handler ("dom_content_loaded" , on_dom_content_loaded )
604+ assert callback_id is not None
605+
606+ # Navigate to trigger the event
607+ context_id = driver .current_window_handle
608+ url = pages .url ("simpleTest.html" )
609+ driver .browsing_context .navigate (context = context_id , url = url , wait = ReadinessState .COMPLETE )
610+
611+ assert len (events_received ) == 1
612+ assert any ("simpleTest" in event .url for event in events_received )
613+
614+ driver .browsing_context .remove_event_handler ("dom_content_loaded" , callback_id )
615+
616+
617+ def test_add_event_handler_load (driver , pages ):
618+ """Test adding event handler for load event."""
619+ events_received = []
620+
621+ def on_load (info ):
622+ events_received .append (info )
623+
624+ callback_id = driver .browsing_context .add_event_handler ("load" , on_load )
625+ assert callback_id is not None
626+
627+ context_id = driver .current_window_handle
628+ url = pages .url ("simpleTest.html" )
629+ driver .browsing_context .navigate (context = context_id , url = url , wait = ReadinessState .COMPLETE )
630+
631+ assert len (events_received ) == 1
632+ assert any ("simpleTest" in event .url for event in events_received )
633+
634+ driver .browsing_context .remove_event_handler ("load" , callback_id )
635+
636+
637+ def test_add_event_handler_navigation_started (driver , pages ):
638+ """Test adding event handler for navigation_started event."""
639+ events_received = []
640+
641+ def on_navigation_started (info ):
642+ events_received .append (info )
643+
644+ callback_id = driver .browsing_context .add_event_handler ("navigation_started" , on_navigation_started )
645+ assert callback_id is not None
646+
647+ context_id = driver .current_window_handle
648+ url = pages .url ("simpleTest.html" )
649+ driver .browsing_context .navigate (context = context_id , url = url , wait = ReadinessState .COMPLETE )
650+
651+ assert len (events_received ) == 1
652+ assert any ("simpleTest" in event .url for event in events_received )
653+
654+ driver .browsing_context .remove_event_handler ("navigation_started" , callback_id )
655+
656+
657+ def test_add_event_handler_fragment_navigated (driver , pages ):
658+ """Test adding event handler for fragment_navigated event."""
659+ events_received = []
660+
661+ def on_fragment_navigated (info ):
662+ events_received .append (info )
663+
664+ callback_id = driver .browsing_context .add_event_handler ("fragment_navigated" , on_fragment_navigated )
665+ assert callback_id is not None
666+
667+ # First navigate to a page
668+ context_id = driver .current_window_handle
669+ url = pages .url ("linked_image.html" )
670+ driver .browsing_context .navigate (context = context_id , url = url , wait = ReadinessState .COMPLETE )
671+
672+ # Then navigate to the same page with a fragment to trigger the event
673+ fragment_url = url + "#link"
674+ driver .browsing_context .navigate (context = context_id , url = fragment_url , wait = ReadinessState .COMPLETE )
675+
676+ assert len (events_received ) == 1
677+ assert any ("link" in event .url for event in events_received )
678+
679+ driver .browsing_context .remove_event_handler ("fragment_navigated" , callback_id )
680+
681+
682+ @pytest .mark .xfail_firefox
683+ def test_add_event_handler_navigation_failed (driver ):
684+ """Test adding event handler for navigation_failed event."""
685+ events_received = []
686+
687+ def on_navigation_failed (info ):
688+ events_received .append (info )
689+
690+ callback_id = driver .browsing_context .add_event_handler ("navigation_failed" , on_navigation_failed )
691+ assert callback_id is not None
692+
693+ # Navigate to an invalid URL to trigger the event
694+ context_id = driver .current_window_handle
695+ try :
696+ driver .browsing_context .navigate (context = context_id , url = "http://invalid-domain-that-does-not-exist.test/" )
697+ except Exception :
698+ # Expect an exception due to navigation failure
699+ pass
700+
701+ assert len (events_received ) == 1
702+ assert events_received [0 ].url == "http://invalid-domain-that-does-not-exist.test/"
703+ assert events_received [0 ].context == context_id
704+
705+ driver .browsing_context .remove_event_handler ("navigation_failed" , callback_id )
706+
707+
708+ def test_add_event_handler_user_prompt_opened (driver , pages ):
709+ """Test adding event handler for user_prompt_opened event."""
710+ events_received = []
711+
712+ def on_user_prompt_opened (info ):
713+ events_received .append (info )
714+
715+ callback_id = driver .browsing_context .add_event_handler ("user_prompt_opened" , on_user_prompt_opened )
716+ assert callback_id is not None
717+
718+ # Create an alert to trigger the event
719+ create_alert_page (driver , pages )
720+ driver .find_element (By .ID , "alert" ).click ()
721+ WebDriverWait (driver , 5 ).until (EC .alert_is_present ())
722+
723+ assert len (events_received ) == 1
724+ assert events_received [0 ].type == "alert"
725+ assert events_received [0 ].message == "cheese"
726+
727+ # Clean up the alert
728+ driver .browsing_context .handle_user_prompt (context = driver .current_window_handle )
729+ driver .browsing_context .remove_event_handler ("user_prompt_opened" , callback_id )
730+
731+
732+ def test_add_event_handler_user_prompt_closed (driver , pages ):
733+ """Test adding event handler for user_prompt_closed event."""
734+ events_received = []
735+
736+ def on_user_prompt_closed (info ):
737+ events_received .append (info )
738+
739+ callback_id = driver .browsing_context .add_event_handler ("user_prompt_closed" , on_user_prompt_closed )
740+ assert callback_id is not None
741+
742+ create_prompt_page (driver , pages )
743+ driver .execute_script ("prompt('Enter something')" )
744+ WebDriverWait (driver , 5 ).until (EC .alert_is_present ())
745+
746+ driver .browsing_context .handle_user_prompt (
747+ context = driver .current_window_handle , accept = True , user_text = "test input"
748+ )
749+
750+ assert len (events_received ) == 1
751+ assert events_received [0 ].accepted is True
752+ assert events_received [0 ].user_text == "test input"
753+
754+ driver .browsing_context .remove_event_handler ("user_prompt_closed" , callback_id )
755+
756+
757+ @pytest .mark .xfail_chrome
758+ @pytest .mark .xfail_firefox
759+ @pytest .mark .xfail_edge
760+ def test_add_event_handler_history_updated (driver , pages ):
761+ """Test adding event handler for history_updated event."""
762+ events_received = []
763+
764+ def on_history_updated (info ):
765+ events_received .append (info )
766+
767+ callback_id = driver .browsing_context .add_event_handler ("history_updated" , on_history_updated )
768+ assert callback_id is not None
769+
770+ # Navigate to a page and use history API to trigger the event
771+ context_id = driver .current_window_handle
772+ url = pages .url ("simpleTest.html" )
773+ driver .browsing_context .navigate (context = context_id , url = url , wait = ReadinessState .COMPLETE )
774+
775+ # Use history.pushState to trigger history updated event
776+ driver .execute_script ("history.pushState({}, '', '/new-path');" )
777+
778+ assert len (events_received ) == 1
779+ assert any ("/new-path" in event .url for event in events_received )
780+
781+ driver .browsing_context .remove_event_handler ("history_updated" , callback_id )
782+
783+
784+ @pytest .mark .xfail_firefox
785+ def test_add_event_handler_download_will_begin (driver , pages ):
786+ """Test adding event handler for download_will_begin event."""
787+ events_received = []
788+
789+ def on_download_will_begin (info ):
790+ events_received .append (info )
791+
792+ callback_id = driver .browsing_context .add_event_handler ("download_will_begin" , on_download_will_begin )
793+ assert callback_id is not None
794+
795+ # click on a download link to trigger the event
796+ context_id = driver .current_window_handle
797+ url = pages .url ("downloads/download.html" )
798+ driver .browsing_context .navigate (context = context_id , url = url , wait = ReadinessState .COMPLETE )
799+
800+ download_xpath_file_1_txt = '//*[@id="file-1"]'
801+ driver .find_element (By .XPATH , download_xpath_file_1_txt ).click ()
802+ WebDriverWait (driver , 5 ).until (lambda d : len (events_received ) > 0 )
803+
804+ assert len (events_received ) == 1
805+ assert events_received [0 ].suggested_filename == "file_1.txt"
806+
807+ driver .browsing_context .remove_event_handler ("download_will_begin" , callback_id )
808+
809+
596810def test_add_event_handler_with_specific_contexts (driver ):
597811 """Test adding event handler with specific browsing contexts."""
598812 events_received = []
0 commit comments