Селен WebDriver и браузеры выбирают диалоговое окно файла - программирование
Подтвердить что ты не робот

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

Я использую селен вебдрайвер, С#.

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

4b9b3361

Ответ 1

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

HTML

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

Код селена

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

В основном вы "набираете" (с SendKeys) полный путь к элементу ввода файла. Selenium обрабатывает диалоговое окно выбора файла.

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

Ответ 2

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

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

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

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

Ответ 3

Вот еще одно решение, использующее 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(); 

Ответ 4

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

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

Ответ 5

Это можно сделать следующим образом, протестировать и работать с 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

Ответ 6

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

Ответ 7

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

    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));
}

Ответ 8

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