Selenium WebDriver и браузер выбирают файл диалога - PullRequest
20 голосов
/ 13 января 2012

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

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

Ответы [ 8 ]

33 голосов
/ 13 января 2012

Если вы пытаетесь выбрать файл для загрузки, 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 обрабатывает диалог выбора файла.

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

9 голосов
/ 13 января 2012

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

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

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

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

4 голосов
/ 13 июля 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(); 
1 голос
/ 19 июля 2016

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

1 голос
/ 16 сентября 2015

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

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

0 голосов
/ 12 декабря 2018

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

    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));
}
0 голосов
/ 23 марта 2015

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

0 голосов
/ 24 июня 2014

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

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