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

Одно решение для загрузки файлов с использованием Java Robot API с Selenium WebDriver от Java

Я видел, что у многих людей проблемы с загрузкой файла в тестовой среде с помощью Selenium WebDriver. Я использую селен WebDriver и java и имею ту же проблему. Я, наконец, нашел решение, поэтому я опубликую его здесь, надеясь, что он поможет кому-то еще.

Когда мне нужно загрузить файл в тесте, я нажимаю кнопку "Webdriver" в кнопке и жду, пока откроется окно "Открыть". И затем я скопирую путь к файлу в буфер обмена, а затем вставьте его в "открытое" окно и нажмите "Enter". Это работает, потому что, когда открывается окно "открыть", фокус всегда находится в "открытой" кнопке.

Вам понадобятся эти классы и метод:

import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;


public static void setClipboardData(String string) {
   StringSelection stringSelection = new StringSelection(string);
   Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
}

И вот что я делаю, сразу после открытия "открытого" окна:

setClipboardData("C:\\path to file\\example.jpg");
//native key strokes for CTRL, V and ENTER keys
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);

И все. Он работает для меня, я надеюсь, что это сработает для некоторых из вас.

4b9b3361

Ответ 1

Собственно, для этого есть встроенная техника. Он должен работать во всех браузерах и операционных системах.

Пример Selenium 2 (WebDriver) Java:

// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.xpath("//input[@type='file']"));
fileInput.sendKeys("C:/path/to/file.jpg");

Идея состоит в том, чтобы напрямую отправить абсолютный путь к файлу элементу, который вы обычно нажимаете, чтобы получить модальное окно - это элемент <input type='file' />.

Ответ 2

Спасибо Алекс,

API Java Robot помог мне загрузить файл. Я был fedup с загрузкой файлов с помощью WebDriver. Ниже приведен код, который я использовал (небольшая модификация для вашего):

Robot robot = new Robot();
robot.delay(1000);

robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
robot.delay(1000);

Ответ 3

Спасибо, Алекс! Мне это нужно, так как я не мог заставить функцию sendKeys работать при использовании через Play Framework 2.1 (флюентлиум-обертка). Я тестирую Firefox [17.0.7] для Mac и должен сделать несколько модов, чтобы заставить его работать. Ниже приведен пример последнего фрагмента, который я использовал.

    val file = new File(PATH_TO_IPA)
    val stringSelection: StringSelection = new StringSelection(file.getAbsolutePath)
    Toolkit.getDefaultToolkit.getSystemClipboard().setContents(stringSelection, null)
    val robot: Robot = new Robot()
    // Cmd + Tab is needed since it launches a Java app and the browser looses focus
    robot.keyPress(KeyEvent.VK_META)
    robot.keyPress(KeyEvent.VK_TAB)
    robot.keyRelease(KeyEvent.VK_META)
    robot.keyRelease(KeyEvent.VK_TAB)
    robot.delay(500)
    robot.keyPress(KeyEvent.VK_META)
    robot.keyPress(KeyEvent.VK_SHIFT)
    robot.keyPress(KeyEvent.VK_G)
    robot.keyRelease(KeyEvent.VK_META)
    robot.keyRelease(KeyEvent.VK_SHIFT)
    robot.keyRelease(KeyEvent.VK_G)
    robot.keyPress(KeyEvent.VK_META)
    robot.keyPress(KeyEvent.VK_V)
    robot.keyRelease(KeyEvent.VK_META)
    robot.keyRelease(KeyEvent.VK_V)
    robot.keyPress(KeyEvent.VK_ENTER)
    robot.keyRelease(KeyEvent.VK_ENTER)
    robot.delay(500)
    robot.keyPress(KeyEvent.VK_ENTER)
    robot.keyRelease(KeyEvent.VK_ENTER)

Ответ 4

Переключение приложения на Mac намного лучше связано с AppleScript. AppleScript интегрирован в систему, поэтому он будет всегда функционировать и не зависит от порядка приложений на Cmd + Tab. Ваш тест/приложение будет менее хрупким. https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html

Вам нужно только определить, что вы находитесь на mac и имеет имя приложения.

Runtime runtime = Runtime.getRuntime();
            String[] args = { "osascript", "-e", "tell app \"Chrome\" to activate" };
            Process process = runtime.exec(args);