it-roy-ru.com

Как обработать загрузку файлов Windows с помощью Selenium WebDriver?

Я видел много вопросов и решений по загрузке файлов с использованием Selenium WebDriver в Stackoverflow. Но никто из работающих по следующему сценарию. 

Кто-то дал решение следующим образом 

// 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/
34
Jasmine.Olivra
// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.name("uploadfile"));
fileInput.sendKeys("C:/path/to/file.jpg");

Эй, это мое откуда-то :).


В случае сети Замзар она должна работать идеально. Вы не нажимаете на элемент. Вы просто вводите путь в него. Это должно быть абсолютно нормально:

driver.findElement(By.id("inputFile")).sendKeys("C:/path/to/file.jpg");

В случае сети Uploadify вы находитесь в состоянии загрузки, поскольку объект загрузки не input, а объект Flash. Нет API для WebDriver, который мог бы работать с диалоговыми окнами в Интернете (или объектами Flash).

Flash, появится окно, которое вы не сможете контролировать. Все, что было открыто, - это курсор, находящийся на входе File name. Пожалуйста, подтвердите, что это предположение верно и в вашем случае.

Если вы не можете перейти к нему,Alt + Nпо крайней мере на винде ...

Если да, вы можете "вслепую" ввести путь в него, используя класс 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 единственная альтернатива, которую я знаю (это это обсуждение ), - это использовать темную технику:

Flash, предоставляемые внутренними методами с помощью API-интерфейса ExternalInterface ActionScript. После раскрытия эти методы будут вызывать JavaScript в браузере.

Во-вторых, теперь, когда JavaScript может вызывать внутренние методы в вашем flash-приложении, вы используете WebDriver для вызова JavaScript на веб-странице, который затем будет вызывать ваше flash-приложение.

Этот метод объясняется далее в документе проекта flash-Selenium. ( http: //code.google.com/p/flash-Selenium/ ), но идея является применимой и к WebDriver.

43
Petr Janeček

Ниже код работает для меня:

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"));
9
Emmanuel Angelo.R

Используя C # и Selenium этот код здесь работает для меня,NOTEвы захотите использовать параметр для замены "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}");
        }
    }
2
Matt

Импортируйте двоичный файл 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}");
1
Sham

Есть более простой способ решить эту проблему, чем то, что описал 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);
1
Bruno Pontes

Я использовал sendkeys в сценариях Shell, используя файл vbsscript. Ниже приведен код в файле VBS,

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.SendKeys "C:\Demo.txt"
WshShell.SendKeys "{ENTER}"

Ниже приведена строка кода Selenium для запуска этого файла VBS,

driver.findElement(By.id("uploadname1")).click();
Thread.sleep(1000);
Runtime.getRuntime().exec( "wscript C:/script.vbs" );
1
Vignesh Sunder

Ниже код работает для меня: 

// 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();
1
Rahul Kaup

Вы поставили двойную косую черту \\ на весь абсолютный путь для достижения этого Пример: - D: \\ images \\ Lighthouse.jpg

Шаги - используйте sendkeys для кнопки, имеющей опцию просмотра (кнопка, которая откроет ваше окно для выбора файлов) - Теперь нажмите на кнопку, которая собирается загрузить ваш файл

driver.findElement(By.xpath("//input[@id='files']")).sendKeys("D:\\images\\Lighthouse.jpg");  
Thread.sleep(5000);
driver.findElement(By.xpath("//button[@id='Upload']")).click();
0
Shubham Jain

Найдите элемент (должен быть элементом ввода с атрибутом 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");
0
Marissa Novak

Используйте скрипт AutoIt для обработки загрузки файлов в Selenium Webdriver. Это работает хорошо для вышеупомянутого сценария.

Runtime.getRuntime().exec("E:\\AutoIT\\FileUpload.exe");

Пожалуйста, используйте ссылку ниже для получения дополнительной помощи: http://www.guru99.com/use-autoit-Selenium.html

0
Anumanth
        webDriver.FindElement(By.CssSelector("--cssSelector--")).Click();
        webDriver.SwitchTo().ActiveElement().SendKeys(fileName);

работал хорошо для меня. Использование другого подхода, предложенного в ответе Мэттом в C # .net, также может работать с именем класса # 32770 для поля загрузки. 

0
user6723403

Сначала добавьте файл в каталог ресурсов вашего проекта

затем

public YourPage uploadFileBtnSendKeys() {
    final ClassLoader classLoader = getClass().getClassLoader();
    final File file = new File(classLoader.getResource("yourFile.whatever").getPath());
    uploadFileBtn.sendKeys(file.getPath());
    return this;
}

Уолла, вы увидите выбранный вами файл и пропустили окно проводника

0
rogger2016

Альтернативное решение - написать скрипт для автоматизации диалога «Открыть файл». Смотрите AutoIt

Кроме того, если вы не можете «нажать» на элемент, мой обходной путь, как правило, заключается в следующем:

element.SendKeys(Keys.Enter);

Надеюсь, это поможет (хотя это старый пост)

0
sparkyShorts