RemoteWebDriver + WebDriverEventListener

listeners
remote
selenium-grid
java
webdriver
Теги: #<Tag:0x00007fedbc688060> #<Tag:0x00007fedbc68fef0> #<Tag:0x00007fedbc68fdb0> #<Tag:0x00007fedbc68fc70> #<Tag:0x00007fedbc68fae0>

(Sergey Korol) #1

Всем доброго времени суток.

Использую #java + #testng + #selenium-grid . Попытался подключить WebDriverEventListener для обработки событий драйвера, но столкнулся со следующей проблемой. Для установки слушателя, нужно использовать EventFiringWebDriver, который не содержит в себе метода setFileDetector, который в свою очередь необходим нам на проекте.

Попытался извратиться, добавив слушателя абстрактному классу-обертке всех методов драйвера. Сам EventFiringWebDriver при этом использую только для фейковой генерации ивентов, вызывая напрямую из самих методов класса-обертки. Но это выглядит уж очень криво.

Преобразовать EventFiringWebDriver к RemoteWebDriver тоже не получилось. Может есть у кого идеи, как заставить EventFiringWebDriver работать с setFileDetector, или как подключить WebDriverEventListener к RemoteWebDriver?


Загрузка файлов через WebDriver на SauceLabs
(Mykhailo Poliarush) #2

RemoteWebDriver + WebDriverEventListener должен работать 

вот даже есть пример кода https://gist.github.com/1728633

а на счет setFileDetector, да в EventFiringWebDriver  нет кода для этого метода

другими словами его надо самому написать.

 

как? :) надо наследоваться от EventFiringWebDriver  и добавить данный метод и обработчики для него, по образу и подобию как это было сделано в 

http://code.google.com/p/selenium/source/search?q=EventFiringWebDriver.java&origq=EventFiringWebDriver.java&btnG=Search+Trunk

конечно кода немогу предоставить, потому как до этого с этим еще не сталкивался, а писать код сейчас нету времени

это конечно в теории, а как на практике не могу сказать.

но не зря метод setFileDetector существует только для remotewebdriver, соответсвенно могут быть ньюансы при разработке кода

 


(Sergey Korol) #3

До прочтения комментария сделал класс, хранящий в себе 2 драйвера. Для всех манипуляций использовал EventFiringWebDriver, а для setFileDetector - RemoteWebDriver. После прочтения последовал совету с наследованием и собственной реализацией метода внутри кастомного класса - тоже заработало. Так даже красивее смотрится. Спасибо. :)


(Sergey Korol) #4

Кому интересно, вот код:

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;
    }
}

(Sergey Korol) #5

Но там весь прикол даже не в setFileDetector, а в реализации метода sendKeys. Если задан fileDetector, sendKeys работает как file uploader для инпутов c типом file. Таковой была задумка разработчиков.


(Mykhailo Poliarush) #6

отлично, рад что у тебя получилось :)


(romal) #7

А для С# клиента это работает? Я не нахожу WebDriverEventListener.