2012-02-24 2 views
21

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

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

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

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); 

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

ответ

29

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

Селен 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' /> элемент ,

+1

Спасибо, проблема в том, что «sendKeys» не работает для меня, потому что я загружаю файл через вызов ajax перед отправкой формы. Но, возможно, это помогает другим. :) – Alex

+3

Но. Он просто заполняет путь, любые вызовы ajax __ должны быть разрешены после того, как '' теряет фокус (это означает, что после вызова 'sendkeys()' вам нужно щелкнуть за пределами '' или начать заполнять какой-то другой для' onchange' для запуска). –

+0

Да, вы правы, но файловая загрузка, которую я использую, использует поддельное поле ввода, в котором отображается только имя загруженного файла. Ajax не запускается, когда это поле теряет фокус. Это не очень простой процесс и не может быть протестирован так, но я бы предпочел, чтобы это было так. – Alex

3

Thanks Alex,

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); 
+0

Im рад услышать, что это вам помогло :) – Alex

0

Спасибо Alex! Мне это нужно, так как я не мог заставить функцию 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) 
+0

С удовольствием его слушаю. ах! и спасибо за обмен вашим решением :) – Alex

+0

Hey Mashhood вы можете помочь мне с конвертированием вашей версии загрузки файла нажатия на Mac для использования с привязками python селена: http://selenium.googlecode.com/svn/trunk/docs /api/py/webdriver/selenium.webdriver.common.keys.html. Я тоже не мог заставить sendKeys правильно работать для моего варианта использования. – jcuwaz

0

Переключение приложения на 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); 
Смежные вопросы