Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Вы можете установить значение поля ввода с помощью 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"), и это также должно работать.

Ответ 2

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

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

Ответ 3

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

Вот мое решение (это немного сложно, но * shrug). Большинство обходных решений для проблем селен-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.

Ответ 4

Для С#, 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);

Ответ 5

Мы можем использовать следующий (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"

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