Webdriver: загрузка файла

Есть ли способ взаимодействия с полем загрузки файлов в webdriver? Поле формы, в которое вставлен путь, считывается только для того, чтобы я не мог писать.

Вы можете установить значение поля ввода с помощью JavaScript. Учитывая, что идентификатор поля – fileName следующий пример устанавливает значение ввода в файл C:\temp\file.txt :

 String script = "document.getElementById('fileName').value='" + "C:\\\\temp\\\\file.txt" + "';"; ((IJavaScriptExecutor)driver).ExecuteScript(script); 

В этом примере driver – это ваш экземпляр WebDriver.

Обратите внимание, что вам нужно использовать четыре обратных слэша ( \ ) для Windows-подобных путей, потому что вам необходимо передать двойные обратные слеши на JavaScript, поэтому вам нужно сбежать с двумя дополнительными косой чертой. Другой вариант – использовать косую черту (например, "C:/tmp/file.txt" ), и это также должно работать.

Вы можете сделать это без использования JavaScript. Вам просто нужно получить поле формы и ввести в него. Что-то вроде (с использованием Ruby API):

 driver.find_element(:id, 'upload').send_keys('/foo/bar') 

Проблема, которую я обнаружил, – это диалоговое окно загрузки, которое вешает webdriver до закрытия. То есть элемент element.click, вызывающий диалог загрузки, не возвращается до тех пор, пока диалоговое окно загрузки не будет закрыто. Чтобы быть ясным, диалоговое окно загрузки означает выбор файла на основе ОС.

Вот мое решение (это немного сложно, но * shrug). Большинство обходных решений для проблем selenium-webdriver должно усложняться).

 # presumes webdriver has loaded the web page of interest element_input = webdriver.find_element_by_css_selector('input[id="uploadfile"]') handle_dialog(element_input, "foobar.txt") def handle_dialog(element_initiating_dialog, dialog_text_input): def _handle_dialog(_element_initiating_dialog): _element_initiating_dialog.click() # thread hangs here until upload dialog closes t = threading.Thread(target=_handle_dialog, args=[element_initiating_dialog] ) t.start() time.sleep(1) # poor thread synchronization, but good enough upload_dialog = webdriver.switch_to_active_element() upload_dialog.send_keys(dialog_text_input) upload_dialog.send_keys(selenium.webdriver.common.keys.Keys.ENTER) # the ENTER key closes the upload dialog, other thread exits 

Используя python 2.7, webdriver 2.25.0, на Ubuntu 12, с firefox.

Для C #, SendKeys() работает, но вы должны использовать \ в вашем пути к файлу вместо /

Например, следующие работы:

 string filePath = @"drive:\path\filename.filextension"; driver.FindElement(By.Id("fileInput")).SendKeys(filePath); 

Но следующее не работает:

 string filePath = "drive:/path/filename.filextension"; driver.FindElement(By.Id("fileInput")).SendKeys(filePath); 

Мы можем использовать следующий (ruby API)

 @driver.find_element(:xpath, "html/body/div[1]/div[2]/div[1]/form/div[4]/div[7]/table/tbody/tr[1]/td[2]/input").send_keys "C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg" 

Это помогло мне загрузить изображение.

  • Почему нужно предпочитать использование CSS поверх XPath в IE?
  • Уточнение причины смешивания Неявные и явные ожидания документа Selenium
  • Страtagsя загрузки страницы для драйвера Chrome (обновлено до Selenium v3.12.0)
  • Chrome - org.openqa.selenium.WebDriverException: неизвестная ошибка: не удается получить расширение автоматизации в driver.manage (). Window (). Maximize ();
  • Может ли Selenium Webdriver открывать windows браузера в фоновом режиме?
  • Selenium 2.0b3 IE WebDriver, нажмите, не стреляйте
  • Selenium WebDriver Как решить проблему исключения устаревших элементов?
  • Селектор CSS (идентификатор содержит часть текста)
  • Как отправить cookies с помощью selenium webdriver?
  • Есть ли проверенное решение mouseOver для FirefoxDriver в Selenium2?
  • Имя пользователя и пароль аутентификации Windows Python не работает
  • Давайте будем гением компьютера.