Использую #java + #testng + #selenium-grid . Попытался подключить WebDriverEventListener для обработки событий драйвера, но столкнулся со следующей проблемой. Для установки слушателя, нужно использовать EventFiringWebDriver, который не содержит в себе метода setFileDetector, который в свою очередь необходим нам на проекте.
Попытался извратиться, добавив слушателя абстрактному классу-обертке всех методов драйвера. Сам EventFiringWebDriver при этом использую только для фейковой генерации ивентов, вызывая напрямую из самих методов класса-обертки. Но это выглядит уж очень криво.
Преобразовать EventFiringWebDriver к RemoteWebDriver тоже не получилось. Может есть у кого идеи, как заставить EventFiringWebDriver работать с setFileDetector, или как подключить WebDriverEventListener к RemoteWebDriver?
До прочтения комментария сделал класс, хранящий в себе 2 драйвера. Для всех манипуляций использовал EventFiringWebDriver, а для setFileDetector - RemoteWebDriver. После прочтения последовал совету с наследованием и собственной реализацией метода внутри кастомного класса - тоже заработало. Так даже красивее смотрится. Спасибо. :)
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.remote.FileDetector;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.UselessFileDetector;
import org.openqa.selenium.support.events.EventFiringWebDriver;
public class CustomEventFiringWebDriver extends EventFiringWebDriver {
private FileDetector fileDetector = new UselessFileDetector();
public CustomEventFiringWebDriver(RemoteWebDriver driver) {
super(driver);
}
/**
* Set the file detector to be used when sending keyboard input. By default, this is set to a file
* detector that does nothing.
@param detector The detector to use. Must not be null.
* @see FileDetector
* @see UselessFileDetector
*/
public void setFileDetector(FileDetector detector) {
if (detector == null) {
throw new WebDriverException("You may not set a file detector that is null");
}
fileDetector = detector;
}
public FileDetector getFileDetector() {
return fileDetector;
}
}
Но там весь прикол даже не в setFileDetector, а в реализации метода sendKeys. Если задан fileDetector, sendKeys работает как file uploader для инпутов c типом file. Таковой была задумка разработчиков.