Selenium WebDriver и браузеры выбирают диалоговое окно выбора файла

Я использую Selenium WebDriver, С#.

Можно ли заставить работать веб-драйвер с диалоговым окном выбора файла Firefox? Или я должен использовать что-то вроде AutoIt?


person Oleg Strokatyy    schedule 13.01.2012    source источник


Ответы (9)


Если вы пытаетесь выбрать файл для загрузки, Selenium 2 поддерживает ввод файлов HTML. Например:

HTML

<input type="file" id="uploadhere" />

Код Selenium

IWebElement element = driver.FindElement(By.Id("uploadhere"));
element.SendKeys("C:\\Some_Folder\\MyFile.txt");

По сути, вы «вводите» (с помощью SendKeys) полный путь к файлу элемента ввода. Selenium обрабатывает диалоговое окно выбора файла за вас.

Однако, если вы хотите манипулировать произвольным диалоговым окном выбора файла, то, как сказал Андерс, вам нужно выйти за пределы Selenium.

person prestomanifesto    schedule 13.01.2012
comment
Это сработало для меня, даже если на сайте есть скрытый ввод файлов. - person Joseph Gabriel; 14.03.2016
comment
Я не могу заставить это работать в Firefox в Selenium 2.48. - person Michael Bowman; 07.04.2016
comment
Это работает как шарм для меня! Но как я могу заставить его работать с несколькими файлами? - person Jack; 16.10.2018
comment
@Jack — загрузка нескольких файлов также возможна через SendKeys — см. stackoverflow.com/questions/23955430/ - person Joseph238; 18.03.2021

Нет, WebDriver не может взаимодействовать с диалогами, потому что диалоги являются доменом операционной системы, а не веб-страницы.

Я знаю людей, которым повезло с autoit, а также с API автоматизации, предоставляемым .Net.

Другим вариантом было бы полностью пропустить диалоговое окно файла и выполнить POST или GET, но это требует более глубоких знаний веб-сайта, а также понимания того, как построить POST/GET.

Вы можете попробовать Webinator, он похож на Selenium в том смысле, что работает на WebDriver. Он предоставляет возможности диалога с файлами, и я добился с ним большого успеха.

person Anders    schedule 13.01.2012

Вот еще одно решение с использованием remotewebdriver, оно работает как по волшебству, и мне понравилось.

Вот класс, который у меня есть:

driver.findElementByLinkText("Upload Files").click();
driver.setLogLevel(Level.ALL);
System.out.println(driver.getCurrentUrl());
WebElement element = driver.findElement(By.xpath("//input[@name='file_1']"));
LocalFileDetector detector = new LocalFileDetector();

//Now, give the file path and see the magic :)              
String path = "D://test66T.txt";
File f = detector.getLocalFile(path);
((RemoteWebElement)element).setFileDetector(detector);
element.sendKeys(f.getAbsolutePath());

//now click the button to finish
driver.findElementByXPath("//html/body/div[9]/div[1]/a/span").click(); 
person Bijoy Meethal    schedule 13.07.2012
comment
Это работает отлично, избавляет от огромной головной боли, связанной с установкой дополнительного программного обеспечения на тестовую коробку (например, AutoIT и т. Д.). - person nerdwaller; 09.07.2014
comment
Это привязка Java? Поскольку в C# я не могу найти метод getLocalFile в разделе LocalFileDetector selenium.googlecode .com/git/docs/api/dotnet/html/ - person Pavel Zagalsky; 05.11.2015

По словам Надима Сакера

В .Net есть библиотека для обработки диалога загрузки файлов. У него есть класс SendKeys с методом SendWait (строковые ключи). Он отправляет данный ключ в активное приложение и ожидает обработки сообщения. Он не возвращает никакого значения.

person Vadim    schedule 16.09.2015

Это можно сделать следующим образом, протестировать и работать с Internet Explorer и драйвером Chrome.

var allowsDetection = this.Driver as IAllowsFileDetection;
if (allowsDetection != null)
{
   allowsDetection.FileDetector = new LocalFileDetector();
}

Driver.FindElement(By.Id("your-upload-input")).SendKeys(@"C:\PathToYourFile");

Ссылка https://groups.google.com/forum/#!msg/webdriver/KxmRZ8MkM4M/45CT4ID_WjQJ

person DalSoft    schedule 19.07.2016

Вы просили использовать AutoIt для диалогового окна файла. Это просто, и вы можете сделать это с помощью C#.

  • Установите пакет NuGet AutoItX.Net

  • Используйте демо-код ниже

  • Измените строку заголовка диалога, как вам нужно

     public static void InsertIntoFileDialog(string file, int timeout = 10)
     {
         int aiDialogHandle = AutoItX.WinWaitActive("Save As", "", timeout); // adjust string as you need
         if (aiDialogHandle <= 0)
         {
             Assert.Fail("Can't find file dialog.");
         }
         AutoItX.Send(file);
         Thread.Sleep(500);
         AutoItX.Send("{ENTER}");
         Thread.Sleep(500);
     }
    

Это помогло мне после того, как у меня возникли проблемы с Appium/Selenium, связанные с файловыми диалогами.

person Beauty    schedule 18.11.2020
comment
Спасибо за это! Я уже 1,5 дня ломаю голову, пытаясь не использовать очередной пакет. Но я уступил, и это работает очень хорошо! Для тех, кто читает это, он выбирает активное окно, поэтому, когда вы отлаживаете, обязательно добавляйте точки останова после .Send(), иначе он вводит путь к вашему файлу в вашей среде IDE. - person agleno; 16.02.2021

Если вы хотите загрузить файл и не использовать WebDriver, единственное решение, с которым я столкнулся, это AutoIt. . Он позволяет вам написать сценарий и преобразовать его в исполняемый файл, который вы затем можете вызывать из своего кода. Я успешно использовал его при работе с элементом управления ActiveX.

person sparkyShorts    schedule 24.06.2014
comment
Я написал демонстрационный код для AutoIt на C#. Сделали быстро и работает хорошо. Взгляните на мой ответ: stackoverflow.com/a/64891474/789423 - person Beauty; 18.11.2020

Другой подход заключается в использовании System.Windows.Forms.SendKeys.SendWait("pathToFile").
Я успешно использую его везде, где я не могу просто отправить ключи к элементу, как описано @prestomanifesto.

person Bart Wojtala    schedule 23.03.2015

Я использовал это для решения проблемы... попробуйте, если все вышеперечисленное не работает

    Actions action = new Actions(driver);
    action.SendKeys(pObjElement, Keys.Space).Build().Perform();

    Thread.Sleep(TimeSpan.FromSeconds(2));

    var dialogHWnd = FindWindow(null, "Elegir archivos para cargar"); // Here goes the title of the dialog window
    var setFocus = SetForegroundWindow(dialogHWnd);
    if (setFocus)
    {

        Thread.Sleep(TimeSpan.FromSeconds(2));
        System.Windows.Forms.SendKeys.SendWait(pFile);
        System.Windows.Forms.SendKeys.SendWait("{DOWN}");
        System.Windows.Forms.SendKeys.SendWait("{TAB}");
        System.Windows.Forms.SendKeys.SendWait("{TAB}");
        System.Windows.Forms.SendKeys.SendWait("{ENTER}");
    }

    Thread.Sleep(TimeSpan.FromSeconds(2));
}
person José Carlos    schedule 12.12.2018