Webdriver: загрузка файлов - PullRequest
13 голосов
/ 21 июля 2010

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

Ответы [ 6 ]

20 голосов
/ 23 июля 2010

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

driver.find_element(:id, 'upload').send_keys('/foo/bar')
8 голосов
/ 22 июля 2010

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

4 голосов
/ 20 июля 2015

Для 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);
3 голосов
/ 09 августа 2012

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

Вот мое решение (оно немного сложное, но * пожимает плечами * большинство способов обхода проблем с селеновым веб-драйвером должно быть сложным).

# 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.

0 голосов
/ 08 октября 2018

Я тоже ищу сторонние библиотеки,

Если нет другого окна, тогда это работает для меня:

в C # добавить ссылку на System.Windows.Forms

using System.Windows.Forms;

string url = "http://nervgh.github.io/pages/angular-file-upload/examples/image-preview/";
string path = @"C:\Users\File_Path";
IWebDriver d = new ChromeDriver();
d.Navigate().GoToUrl(url);
d.FindElement(By.XPath("//input[@type='file']")).Click();
hread.Sleep(5000);
System.Windows.Forms.SendKeys.SendWait(path);
System.Windows.Forms.SendKeys.SendWait(@"{Enter}");
0 голосов
/ 28 августа 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...