Получаем больше логов от Selenium

Заметка о том, как залогировать действия Selenium Webdriver. Вероятнее всего, вы всегда хотели получать больше информации от WebDriver так, чтобы было легко дебажить скрипты или просто получать больше информации о тестах. Теперь это стало возможным благодаря EventFiringWebDriver и WebDriverEventListner. EventFiringWebDriver это класс, который используется как обертка над webDriver. WebDriverEventListner - интерфейс, который нужно реализовать, чтобы получить доступ к действиям webdriver.

selenium webdriver

Поговорим чуть больше o классе EventFiringWebDriver. Этот класс реализует интерфейс WebDriver. Это означает, что в дополнение ко всем стандартным методам, появляется еще два метода:

  • register(WebDriverEventListener eventListener)

  • unregister(WebDriverEventListener eventListener)

Метод register позволяет зарегистрировать вашу реализацию WebDriverEventListner для того, чтобы слушать все действия webdriver и метод unregister позволяет прервать работу метода register.

Шаг 1: Реализуем интерфейс WebDriverEventListener

Создаем класс EventHandler и реализуем WebDriverEventListener:

package com.custom.listeners;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.events.WebDriverEventListener;

public class EventHandler implements WebDriverEventListener {

    private static final Logger LOG = LogManager.getLogger(EventHandler.class);

    @Override
    public void beforeNavigateTo(String url, WebDriver driver) {

    }

    @Override
    public void afterNavigateTo(String url, WebDriver driver) {

    }

    @Override
    public void beforeNavigateBack(WebDriver driver) {

    }

    @Override
    public void afterNavigateBack(WebDriver driver) {

    }

    @Override
    public void beforeNavigateForward(WebDriver driver) {

    }

    @Override
    public void afterNavigateForward(WebDriver driver) {

    }

    @Override
    public void beforeFindBy(By by, WebElement element, WebDriver driver) {
        LOG.debug("Should be " + by);
    }

    @Override
    public void afterFindBy(By by, WebElement element, WebDriver driver) {
        LOG.debug("Element found");
    }

    @Override
    public void beforeClickOn(WebElement element, WebDriver driver) {
        LOG.debug("Should click " + element.getTagName());
    }

    @Override
    public void afterClickOn(WebElement element, WebDriver driver) {
        LOG.debug("Clicked successfull");
    }

    @Override
    public void beforeChangeValueOf(WebElement element, WebDriver driver) {

    }

    @Override
    public void afterChangeValueOf(WebElement element, WebDriver driver) {

    }

    @Override
    public void beforeScript(String script, WebDriver driver) {

    }

    @Override
    public void afterScript(String script, WebDriver driver) {

    }

    @Override
    public void onException(Throwable throwable, WebDriver driver) {

    }
}

Шаг 2: Регистрируем слушателя

Создаем простой объект webdriver:

WebDriver driver = new FirefoxDriver();

Создаем объект EventFiringWebDriver и передаем ему созданный объект driver:

EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);

Регистрируем EventHandler:

eventDriver.register(new EventHandler());

Все, теперь мы можем спокойно писать тесты, как мы это делали раньше и при этом логировать действия драйвера.

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.events.EventFiringWebDriver;

public class Demo {
    public static void main(String[] args) {
                EventFiringWebDriver eventDriver = new EventFiringWebDriver(new FirefoxDriver());
        EventHandler handler = new EventHandler();
        eventDriver.register(handler);
        eventDriver.get("http://automation-remarks.com");
        WebElement element = eventDriver.findElement(By.id("target"));
        element.click();
    }
}

В результате запуска у нас получится такой вот лог:

DEBUG com.home.custom.listeners.WDriverEventListener beforeFindBy - Should be By.name: banner
DEBUG com.home.custom.listeners.WDriverEventListener beforeFindBy - Should be By.name: banner
DEBUG com.home.custom.listeners.WDriverEventListener afterFindBy - Element found
DEBUG com.home.custom.listeners.WDriverEventListener beforeFindBy - Should be By.id: ibm-banner-welcome
DEBUG com.home.custom.listeners.WDriverEventListener beforeFindBy - Should be By.id: ibm-banner-welcome
DEBUG com.home.custom.listeners.WDriverEventListener afterFindBy - Element found

Вот так просто можно улучшить логирование в вашем тестовом фреймворке. Читабельных вам логов и удачи. Подписывайтесь на нашу рассылку;)