Подтвердить что ты не робот

Как обрабатывать загрузку файлов 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/
4b9b3361

Ответ 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");