Я использую Selenium WebDriver, С#.
Можно ли заставить работать веб-драйвер с диалоговым окном выбора файла Firefox? Или я должен использовать что-то вроде AutoIt?
Я использую Selenium WebDriver, С#.
Можно ли заставить работать веб-драйвер с диалоговым окном выбора файла Firefox? Или я должен использовать что-то вроде AutoIt?
Если вы пытаетесь выбрать файл для загрузки, 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.
Нет, WebDriver не может взаимодействовать с диалогами, потому что диалоги являются доменом операционной системы, а не веб-страницы.
Я знаю людей, которым повезло с autoit, а также с API автоматизации, предоставляемым .Net.
Другим вариантом было бы полностью пропустить диалоговое окно файла и выполнить POST или GET, но это требует более глубоких знаний веб-сайта, а также понимания того, как построить POST/GET.
Вы можете попробовать Webinator, он похож на Selenium в том смысле, что работает на WebDriver. Он предоставляет возможности диалога с файлами, и я добился с ним большого успеха.
Вот еще одно решение с использованием 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();
В .Net есть библиотека для обработки диалога загрузки файлов. У него есть класс SendKeys с методом SendWait (строковые ключи). Он отправляет данный ключ в активное приложение и ожидает обработки сообщения. Он не возвращает никакого значения.
Это можно сделать следующим образом, протестировать и работать с 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
Вы просили использовать 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, связанные с файловыми диалогами.
Если вы хотите загрузить файл и не использовать WebDriver, единственное решение, с которым я столкнулся, это AutoIt. а>. Он позволяет вам написать сценарий и преобразовать его в исполняемый файл, который вы затем можете вызывать из своего кода. Я успешно использовал его при работе с элементом управления ActiveX.
Другой подход заключается в использовании System.Windows.Forms.SendKeys.SendWait("pathToFile")
.
Я успешно использую его везде, где я не могу просто отправить ключи к элементу, как описано @prestomanifesto.
Я использовал это для решения проблемы... попробуйте, если все вышеперечисленное не работает
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));
}