Я использую селен вебдрайвер, С#.
Можно ли заставить работать вебдрайвер с Firefox диалогом выбора файла? Или я должен использовать что-то вроде AutoIt?
Я использую селен вебдрайвер, С#.
Можно ли заставить работать вебдрайвер с Firefox диалогом выбора файла? Или я должен использовать что-то вроде AutoIt?
Если вы пытаетесь выбрать файл для загрузки, 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 обрабатывает диалоговое окно выбора файла.
Однако, если вы хотите манипулировать произвольным диалогом выбора файлов, то, как сказал Андерс, вы должны выйти за пределы Селена.
Нет, WebDriver не может взаимодействовать с диалоговыми окнами - это потому, что диалоги являются доменом операционной системы, а не веб-страницей.
Я знаю людей, которым повезло с аутитом, а также 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
Другой подход - использовать 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));
}
Если вы хотите загрузить файл, а не использовать WebDriver, единственным решением, с которым я столкнулся, является AutoIt. Он позволяет вам написать script и преобразовать его в исполняемый файл, который вы затем можете вызвать из своего кода. Я использовал его успешно, работая с элементом управления ActiveX.