Для отслеживания детального хода выполнения теста, например, отслеживания поиска элементов, нажатий на них, ввода текста, выполнения javascript и т.д, библиотека Selenium предоставляет интерфейс
WebDriverEventListener
. Интерфейс работает в паре с EventFiringWebDriver
, который представляет собой обертку для любой реализации веб-драйвера и позволяет регистрировать объект WebDriverEventListener
. Создать собственный listener событий драйвера можно двумя способами:
- создать класс, реализующий интерфейс
WebDriverEventListener
и все его методы;
import org.openqa.selenium.support.events.WebDriverEventListener; public class WebDriverLogger implements WebDriverEventListener {
- создать класс, унаследованный от
AbstractWebDriverEventListener
. Все методы, предоставляемыеAbstractWebDriverEventListener
, пустые (не содержат кода). Поэтому в унаследованном классе можно переопределять не все, а только интересующие методы.
import org.openqa.selenium.support.events.AbstractWebDriverEventListener; public class WebDriverLogger extends AbstractWebDriverEventListener {
Простенький пример логирования работы драйвера:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.events.AbstractWebDriverEventListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class WebDriverLogger extends AbstractWebDriverEventListener { private static final Logger LOGGER = LoggerFactory .getLogger(WebDriverLogger.class); @Override public void afterNavigateTo(String url, WebDriver driver) { LOGGER.info("WebDriver navigated to '" + url + "'"); } @Override public void beforeClickOn(WebElement element, WebDriver driver) { LOGGER.info("WebDriver click on element - " + elementDescription(element)); } @Override public void beforeChangeValueOf(WebElement element, WebDriver driver) { LOGGER.info("WebDriver will change value for element - " + elementDescription(element)); } @Override public void afterChangeValueOf(WebElement element, WebDriver driver) { LOGGER.info("WebDriver changed value for element - " + elementDescription(element)); } private String elementDescription(WebElement element) { String description = "tag:" + element.getTagName(); if (element.getAttribute("id") != null) { description += " id: " + element.getAttribute("id"); } else if (element.getAttribute("name") != null) { description += " name: " + element.getAttribute("name"); } description += " ('" + element.getText() + "')"; return description; } }
Подключение WebDriverLogger
выполняется следующим образом:
import org.openqa.selenium.support.events.EventFiringWebDriver; EventFiringWebDriver driver = new EventFiringWebDriver(new FirefoxDriver()); driver.register(new WebDriverLogger());
Приведенный выше пример просто показывает как можно использовать реализацию WebDriverEventListener
. Естественно, он может использоваться для любых других целей, например, снятия скриншотов или подсвечивания активных элементов. Использование WebDriverEventListener
носит в себе вспомогательный характер, поэтому не переносите в него реализацию выполнения тестов, например, ожидание определенного состояния элемента перед кликом. Для таких вещей более подходящими будут обертки веб-элементов или другие подобные средства.
@Override
public void afterNavigateTo(String url, WebDriver driver) {
LOGGER.info(«WebDriver navigated to ‘» + url + «‘»);
}
Вероятно урл тут получается из драйвера
Ой, блин, урл передается, сори)
а что делать если возникает ошибка?
SLF4J: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
slf4j-log4j12 предназначен для того, чтобы перенаправлять вызовы SLF4J к логгеру log4j. log4j-over-slf4j наоборот перенаправляет вызовы log4j к SLF4J. Одновременно они не могут сосуществовать в проекте, определите с каким логгером Вы хотите работать и исключите ненужный jar из проекта. Вычислите после добавления чего в проект появилась ошибка или используйте
mvn dependency:tree
для поиска (для maven проекта). Если он подключился вместе с какой-то другой библиотекой, то используйте exclude в pom файле:Татьяна скажите пожалуйста, как из консоли не выводить сообщения такого рода.
[junit] май 08, 2013 3:33:36 PM org.slf4j.impl.JCLLoggerAdapter info
[junit] INFO: Драйвер Собирается Кликнуть по Элементу — ТЭГ:li id: (‘Подробно’)
[junit] май 08, 2013 3:33:36 PM org.slf4j.impl.JCLLoggerAdapter info
[junit] INFO: Драйвер Собирается Кликнуть по Элементу — ТЭГ:a id: (‘В корзину’)
[junit] май 08, 2013 3:33:44 PM org.slf4j.impl.JCLLoggerAdapter info
ой) я имел ввиду конкретно
[junit] май 08, 2013 3:33:36 PM org.slf4j.impl.JCLLoggerAdapter info
а то лог уж очень большой получается
Да вид строки в логе можно изменить. Но slf4j это просто фасад для различных фреймворков логгирования, нужно выяснить какой конкретно фреймворк используется и его настраивать.