Как обрабатывать загрузку файлов Windows с помощью Selenium WebDriver?
Я видел много вопросов и решений по загрузке файлов с использованием Selenium WebDriver в Stack Overflow. Но никто из них не работает по следующему сценарию.
Кто-то дал решение следующим образом
// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.name("uploadfile"));
fileInput.sendKeys("C:/path/to/file.jpg");
Но я все еще не могу найти ручку окна. Как я могу работать над этим?
![Screenshot]()
Я ищу решение для сценария выше.
Пожалуйста, проверьте это на любом из следующих сайтов.
http://www.uploadify.com/demos/
http://www.zamzar.com/
Ответы
Ответ 1
// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.name("uploadfile"));
fileInput.sendKeys("C:/path/to/file.jpg");
Эй, это мое откуда-то :).
В случае с веб- сайтом Zamzar все должно работать идеально. Вы не нажимаете на элемент. Вы просто вводите путь в него. Чтобы быть конкретным, это должно быть абсолютно нормально:
driver.findElement(By.id("inputFile")).sendKeys("C:/path/to/file.jpg");
В случае с веб- сайтом Uploadify вы находитесь в процессе, так как загружаемая вещь - это не input
, а объект Flash. Нет API для WebDriver, который позволял бы вам работать с диалоговыми окнами браузера (или объектами Flash).
Поэтому после того, как вы щелкнете по элементу Flash, появится окно, которое вы не сможете контролировать. В известных мне браузерах и операционных системах можно предположить, что после того, как окно было открыто, курсор находится на вводе File name
файла. Пожалуйста, убедитесь, что это предположение верно и в вашем случае.
Если нет, вы можете попытаться перейти к нему, нажав Alt + N, по крайней мере, в Windows...
Если да, вы можете "вслепую" ввести путь, используя класс Robot
. В вашем случае это будет что-то вроде:
driver.findElement(By.id("SWFUpload_0")).click();
Robot r = new Robot();
r.keyPress(KeyEvent.VK_C); // C
r.keyRelease(KeyEvent.VK_C);
r.keyPress(KeyEvent.VK_COLON); // : (colon)
r.keyRelease(KeyEvent.VK_COLON);
r.keyPress(KeyEvent.VK_SLASH); // / (slash)
r.keyRelease(KeyEvent.VK_SLASH);
// etc. for the whole file path
r.keyPress(KeyEvent.VK_ENTER); // confirm by pressing Enter in the end
r.keyRelease(KeyEvent.VK_ENTER);
Это отстой, но это должно работать. Обратите внимание, что вам могут понадобиться эти: Как я могу заставить робота набирать ':'? и Преобразовать строку в KeyEvents (плюс есть новый блестящий KeyEvent#getExtendedKeyCodeForChar()
который выполняет аналогичную работу, но доступен только из JDK7).
Для Flash единственная альтернатива, которую я знаю (из этого обсуждения), - это использовать темную технику:
Во-первых, вы изменяете исходный код своего приложения флэш-памяти, предоставляя внутренние методы с помощью API-интерфейса ActionScript ExternalInterface. После раскрытия эти методы будут вызываться JavaScript в браузере.
Во-вторых, теперь, когда JavaScript может вызывать внутренние методы в вашем flash-приложении, вы используете WebDriver для вызова JavaScript на веб-странице, которая затем будет вызывать ваше flash-приложение.
Этот метод объяснен далее в документах проекта вспышки-селена. (http://code.google.com/p/flash-selenium/), но идея этого метода применима и к WebDriver.
Ответ 2
Ниже код работает для меня:
public void test() {
WebDriver driver = new FirefoxDriver();
driver.get("http://www.freepdfconvert.com/pdf-word");
driver.findElement(By.id("clientUpload")).click();
driver.switchTo()
.activeElement()
.sendKeys(
"/home/likewise-open/GLOBAL/123/Documents/filename.txt");
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
driver.findElement(By.id("convertButton"));
Ответ 3
Используя С# и Selenium, этот код работает для меня, ПРИМЕЧАНИЕ, вы захотите использовать параметр для замены "localhost" в вызове FindWindow для вашего конкретного сервера если это не localhost и отслеживание, которое является самым новым диалогом, открытым, если вокруг висит более одного диалогового окна, но это должно заставить вас начать:
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
public static void UploadFile(this IWebDriver webDriver, string fileName)
{
webDriver.FindElement(By.Id("SWFUpload_0")).Click();
var dialogHWnd = FindWindow(null, "Select file(s) to upload by localhost");
var setFocus = SetForegroundWindow(dialogHWnd);
if (setFocus)
{
Thread.Sleep(500);
SendKeys.SendWait(fileName);
SendKeys.SendWait("{ENTER}");
}
}
Ответ 4
Импортируйте System.Windows.Forms в тестовое решение и вызовите следующие два LOC при нажатии кнопки "Загрузить" в пользовательском интерфейсе.
// Send the file path and enter file path and wait.
System.Windows.Forms.SendKeys.SendWait("complete path of the file");
System.Windows.Forms.SendKeys.SendWait("{ENTER}");
Ответ 5
Ниже код работает для меня:
// wait for the window to appear
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());
// switch to the file upload window
Alert alert = driver.switchTo().alert();
// enter the filename
alert.sendKeys(fileName);
// hit enter
Robot r = new Robot();
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
// switch back
driver.switchTo().activeElement();
Ответ 6
Существует более простой способ решить эту проблему, чем описано Slanec. Решение Hes работает, когда вы используете английскую клавиатуру, если вам не трудно будет "отобразить" ключ для специальных символов.
Вместо robot.keyPress
и robot.keyRelease
каждый отдельный ключ вы можете использовать Toolkit
, чтобы скопировать строку в буфер обмена, а затем вставьте его.
StringSelection s = new StringSelection("Path to the file");
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(s, null);
Robot robot = new Robot();
robot.keyPress(java.awt.event.KeyEvent.VK_ENTER);
robot.keyRelease(java.awt.event.KeyEvent.VK_ENTER);
robot.keyPress(java.awt.event.KeyEvent.VK_CONTROL);
robot.keyPress(java.awt.event.KeyEvent.VK_V);
robot.keyRelease(java.awt.event.KeyEvent.VK_CONTROL);
Thread.sleep(3000);
robot.keyPress(java.awt.event.KeyEvent.VK_ENTER);
Ответ 7
Я использовал sendkeys в сценариях оболочки, используя файл vbsscript. Ниже приведен код в файле vbs,
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.SendKeys "C:\Demo.txt"
WshShell.SendKeys "{ENTER}"
Ниже приведена строка кода селена для запуска этого файла vbs,
driver.findElement(By.id("uploadname1")).click();
Thread.sleep(1000);
Runtime.getRuntime().exec( "wscript C:/script.vbs" );
Ответ 8
Альтернативным решением было бы написать script для автоматизации диалога Open File. См. AutoIt.
Кроме того, если вы не можете "click" элемента, как правило, это обходное решение:
element.SendKeys(Keys.Enter);
Надеюсь, что это поможет (хотя это старый пост)
Ответ 9
Вы поставили двойной слэш\\для всего абсолютного пути для достижения этого
Пример: - D:\\images\\Lighthouse.jpg
Steps
- используйте кнопки отправки для кнопки с возможностью просмотра (кнопка, которая откроется ваше окно для выбора файлов)
- Теперь нажмите кнопку, которая будет загружать файл
driver.findElement(By.xpath("//input[@id='files']")).sendKeys("D:\\images\\Lighthouse.jpg");
Thread.sleep(5000);
driver.findElement(By.xpath("//button[@id='Upload']")).click();
Ответ 10
Сначала добавьте файл в каталог ресурсов проекта
затем
public YourPage uploadFileBtnSendKeys() {
final ClassLoader classLoader = getClass().getClassLoader();
final File file = new File(classLoader.getResource("yourFile.whatever").getPath());
uploadFileBtn.sendKeys(file.getPath());
return this;
}
Уолла, вы увидите выбранный вами выбранный файл и пропустили окно проводника файлов
Ответ 11
Используйте AutoIt Script, чтобы обрабатывать загрузку файлов в Selenium Webdriver. Он работает отлично для вышеуказанного сценария.
Runtime.getRuntime().exec("E:\\AutoIT\\FileUpload.exe");
Пожалуйста, используйте ссылку ниже для получения дополнительной помощи:
http://www.guru99.com/use-autoit-selenium.html
Ответ 12
Найти элемент (должен быть элементом ввода с атрибутом type="file") и отправить путь к файлу.
WebElement fileInput = driver.findElement(By.id("uploadFile"));
fileInput.sendKeys("/path/to/file.jpg");
ПРИМЕЧАНИЕ. Если вы используете RemoteWebDriver, вам также необходимо будет установить детектор файлов. По умолчанию используется UselessFileDetector
WebElement fileInput = driver.findElement(By.id("uploadFile"));
driver.setFileDetector(new LocalFileDetector());
fileInput.sendKeys("/path/to/file.jpg");
Ответ 13
webDriver.FindElement(By.CssSelector("--cssSelector--")).Click();
webDriver.SwitchTo().ActiveElement().SendKeys(fileName);
работал хорошо для меня. Другой подход, приведенный в ответе выше, Matt in С#.net также может работать с именем класса # 32770 для загрузки.
Ответ 14
Ниже я работал у меня
webDriver.findElement(By.xpath("//input[@type='file' and @name='importFile']")).sendKeys("C:/path/to/file.jpg");
Ответ 15
Двойная обратная косая черта в пути, например:
driver.findElement(browsebutton).sendKeys("C:\\Users\\Desktop\\Training\\Training.jpg");