О том, как работать с файловым полем ввода уже было написано в статье «Selenium WebDriver: файловые поля ввода (input file)». Текущая же статья посвящена тому как выполнить аналогичную процедуру при запуске браузера на удаленной машине.
Основной смысл загрузки файла заключается в передаче абсолютного пути к файлу в файловое поле ввода. Вот тут-то и возникают основные затруднения: во-первых, файл должен находиться на удаленной машине и, во-вторых, нужно знать полный путь к этому файлу. Работа с удаленной машиной не доставит затруднений, если она у Вас единственная и Вы четко знаете пути к требуемым файлам (заранее туда скопированным). Тогда Вы можете просто передать в sendKeys
путь к файлу на этой машине и благополучно выполнить загрузку. На практике же такое решение встречается крайне редко и с трудом может считаться жизнеспособным.
Если удаленных машин несколько, то, как один из вариантов, можно разместить тестовые ресурсы где-нибудь в общей папке в сети:
File file = new File("\\\\192.168.1.1\\photo.png"); driver.findElement(By.id("photo")).sendKeys(file.getAbsolutePath());
Но и этот способ будет не эффективен, если на машинах установлены различные операционные системы. У каждой системы свои форматы путей и приведенный выше путь к файлу для ОС Windows будет работать только под Windows.
Selenium предоставляет более гибкое решение этой проблемы — использование FileDetector
для загрузки файлов с локальной машины на удалённую. Обращение к FileDetector
происходит во время вызова метода sendKeys
и, если переданный текст представляет собой путь к существующему локальному файлу, то FileDetector
обнаруживает этот файл и происходит его автоматическая загрузка на удаленную машину, а после этого в поле передается путь к загруженному файлу.
import org.openqa.selenium.remote.LocalFileDetector; driver = new RemoteWebDriver(DesiredCapabilities.firefox()); driver.setFileDetector(new LocalFileDetector()); File file = new File("src/test/resources/photo.png"); driver.findElement(By.id("photo")).sendKeys(file.getAbsolutePath());
По-умолчанию FileDetector
в RemoteWebDriver
не выполняет поиск файлов (в него передан UselessFileDetector
), и следовательно никакие дальнейшие действия не выполняются.
В идеальном сценарии использования LocalFileDetector
файл загружается в папку Temp на удаленной машине, используется и удаляется после завершения теста. Однако в некоторых случаях (точнее при возникновении некоторых исключений) загруженные файлы могут не удалиться.
На моей машине запороленая прокси на внешний интернет (логин, пароль и прочее известено, логин и пароль обычно указываю при открытии в браузере внешнего сайта). Все настройки прокси и др в капабилитис и профайле, насколько я понимаю, применяются на удаленной машине, а не на той, с которой запускаю. В итоге запустить тест на машине находящейся за пределами локальной сети — неудаеться. Есть ли возможность указать параметры сети, которые будут применены на машине с которой запускается тест, а не на той, на которой запускается ?
Попробуйте использовать следующие настройки на локальной машине: