pythonselenium-webdriverrobotframeworklistener

How to implement WebDriver Event Listeners in Robot Framework


I'm new to Robot Framework. I'm trying to implement WebDriver Event Listeners by importing Selenium Library.

In my Test case, I have this import

Library             SeleniumLibrary    event_firing_webdriver=${CURDIR}/RobotFrameworkListener.py

In RobotFrameworkListener.py file,

    from robot.api import logger
    from selenium.webdriver.support.events import AbstractEventListener
    from robot.libraries.BuiltIn import BuiltIn
    from selenium.webdriver.support.events import EventFiringWebDriver

    selib = BuiltIn().get_library_instance("SeleniumLibrary")
    driver = selib.driver
            
    class RobotFrameworkListener(AbstractEventListener):
         def before_navigate_to(self, url, driver):
             logger.info("URL before navigation: '%s'." % url)
         def after_navigate_to(self, url, driver):
             logger.info("URL after navigation: '%s'." % driver.current_url)
         def before_change_value_of(self, element, driver):
             dict= element.get_property('attributes')
             element_value = dict[2]['value']
             logger.info("Before clearing/entering the text field '%s'." % element_value)
         def after_change_value_of(self, element, driver):
             dict= element.get_property('attributes')
             element_value = dict[2]['value']
             logger.info("After clearing/entering the text field '%s'." % element_value)

So could some one help me on how to trigger listeners for my main Test case so that I can do an action on web driver events like after click, before click, after entering the text etc? Let me know if there is any other way to do it :) Thanks in advance!


Solution

  • I commented some lines in your listener, and it worked:

    RobotFrameworkListener.py file:

    from robot.api import logger
    from selenium.webdriver.support.events import AbstractEventListener
    from robot.libraries.BuiltIn import BuiltIn
    # from selenium.webdriver.support.events import EventFiringWebDriver
    
    # selib = BuiltIn().get_library_instance("SeleniumLibrary")
    # driver = selib.driver
            
    class RobotFrameworkListener(AbstractEventListener):
        def before_navigate_to(self, url, driver):
            logger.info("URL before navigation: '%s'." % url)
    
        def after_navigate_to(self, url, driver):
             logger.info("URL after navigation: '%s'." % driver.current_url)
        
        def before_change_value_of(self, element, driver):
            dict= element.get_property('attributes')
            element_value = dict[2]['value']
            logger.info("Before clearing/entering the text field '%s'." % element_value)
        
        def after_change_value_of(self, element, driver):
            dict= element.get_property('attributes')
            element_value = dict[2]['value']
            logger.info("After clearing/entering the text field '%s'." % element_value)
    

    Test Case:

    *** Settings ***
    Documentation     This is a test suite to test SO question: https://stackoverflow.com/questions/79503722/how-to-implement-webdriver-event-listeners-in-robot-framework
    Suite Teardown    Close All Browsers
    Library           SeleniumLibrary    event_firing_webdriver=${CURDIR}/RobotFrameworkListener.py
    
    *** Variables ***
    ${URL}            https://github.com/robotframework/SeleniumLibrary
    ${ISSUES}         ${URL}/issues
    ${BROWSER}        Chrome
    
    *** Test Cases ***
    Open Browser To Start Page
        Open Browser    ${URL}    ${BROWSER}
    
    Event Firing Webdriver Go To (WebDriver)
        Go To    ${ISSUES}
    
    Event Firing Webdriver Click Element (WebElement)
        Click Element    repository-input
    
    Event Firing Webdriver Input Text (WebElement)
        Input Text    repository-input    FooBar
    

    Listener output in RIDE message window:
    enter image description here