Файловые поля ввода, с точки зрения верстки, — это обычные input-поля, которым присвоен тип «file».
Сам элемент же обычно отображается, как текстовое поле с кнопкой, при нажатии на которую появляется файловый менеджер для отбора имени файла.
В Selenium файловые поля ввода заполняются точно так же, как и обычные текстовые поля. Для того, чтобы загрузить файл используется метод sendKeys(String value)
, в который передается путь к этому файлу. Путь обязательно должен быть абсолютным:
driver.findElement(By.id("photo")) .sendKeys("Z:\\SeleniumExamples\\src\\test\\resources\\photo.png");
или лучше как-то так:
File file = new File("src/test/resources/photo.png"); driver.findElement(By.id("photo")).sendKeys(file.getAbsolutePath());
Файловые поля не нуждаются в очистке перед вводом пути или изменением его значения. Значения перезаписывается автоматически при каждом новом вызове метода sendKeys
. Более того, при вызове метода clear()
для файлового поля возникнет исключение «WebDriverException: Element must be user-editable in order to clear it».
Заполнение файлового поля проходит в браузере практически незаметно, при этом диалог для выбора файла не открывается.
Своего рода проблему представляют плагины загрузчиков файлов AJAX или JQuery, здесь может быть несколько вариантов развития событий:
- Поле ввода появляется после выполнения каких-либо действий (и это уже совсем не проблема, просто заполняем появившееся файловое поле и все);
- Файловое поле скрыто внутри плагина, а вместо него работает красивая обертка. В этом случае стоит поискать файловое поле в верстке. Если такое обнаружено, то можно посоветовать сначала сделать его видимым с помощью javascript, а после уже заполнить. Дальнейшее будет зависеть от реализации плагина — возможно нужно будет нажать на какую-нибудь кнопку «Upload» внутри плагина, или просто кликнуть в любом месте страницы и загрузка начнется автоматически. Как сделать скрытый элемент видимым можно найти в статье «Selenium 2 — получить текст невидимых элементов»
- Плагин выполнен на флеше, либо полностью реализован с помощью скриптов. Вот тут уже к файловому полю никак не добраться и придется иметь дело с файловым менеджером. Для таких целей лучше использовать сторонние инструменты, например, AutoIt. Сам же WebDriver не может взаимодействовать с такими диалогами, потому что они принадлежат области операционной системе, а не веб-страницы.
А если нет поля value и style, но поле невидимое, как тогда ввести путь в input ?
То, что поля не видны в html, не значит, что их нельзя использовать. Элемент скорее всего сделан невидимым с помощью css, но значение inline поля style имеет больший приоритет (если только в css не прописано !important). Главное выяснить какое конкретно свойство видимости элемента Вам нужно менять.
Если же никак не получается сделать поле видимым, используйте AutoIt для заполнения.
Спасибо, все получилось.
А какие свойства видимости могут быть? Просто я попробывал сменить display и visibility а толку никакого.
Эти свойства могут также быть применены к одному из родителей элемента, поэтому нет никакого эффекта. Нужно внимательно изучить верстку страницы
@FindBy(xpath = «//input[@name=’icon’]»)
WebElement element;
element.sendKeys(new File(«resources/icon.jpg»).getAbsolutePath());