Как бороться с загрузкой файлов в автоматизации тестирования с использованием селена или веб-драйвера - PullRequest
23 голосов
/ 25 мая 2011

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

Но есть огромная проблема, если загрузка файлов является частью вашего веб-потока.Это перестает быть автоматизацией тестирования.Ограничение безопасности браузеров (вызывая выбор файла) практически делает невозможным автоматизацию тестов.

Afaik единственная опция - это когда веб-драйвер нажимает кнопку загрузки файла, спит поток, разработчик / тестер вручную выбирает файл изатем выполните остальную часть веб-потока.

Как с этим справиться, есть ли обходной путь для этого?Потому что это действительно невозможно сделать так.Это не имеет смысла.

Это единственный известный мне случай, когда ограничения безопасности браузера не применяются:

<script language=javascript>   
  function window.onload(){   
          document.all.attachment.focus();   
          var WshShell=new ActiveXObject("WScript.Shell")   
          WshShell.sendKeys("D:\MyFile.doc")
  }   
</script>

Ответы [ 6 ]

40 голосов
/ 25 мая 2011

Webdriver может справиться с этим довольно легко в IE и Firefox. Простой случай найти элемент и набрать его.

driver = webdriver.Firefox()
element = driver.find_element_by_id("fileUpload")
element.send_keys("myfile.txt")

Приведенный выше пример написан на Python, но вы поняли

3 голосов
/ 25 мая 2011

Использование AWT Robots - один из вариантов, если вы используете Java, которым вы и являетесь.Но это не очень хороший вариант, он не очень надежный и совсем не чистый. Смотрите здесь

Я использую HttpClient и провожу несколько тестов вне Selenium.Это надежнее и чище.

См. Код ниже.Вам понадобится больше обработки исключений и условий, чтобы они соответствовали вашей работе.

HttpClient c = new HttpClient();
String url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/j_security_check";
PostMethod post = new PostMethod(url);
post.setParameter("j_username", username);
post.setParameter("j_password", password);
c.executeMethod(post);

url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/myurl.html";
MultipartPostMethod mPost = new MultipartPostMethod(url);
String fileNameWithPath = this.getClass().getClassLoader().getResource(filename).getPath();
File f1 = new File(fileNameWithPath);
mPost.addParameter(elementName, f1);
mPost.addParameter("action", "upload");
mPost.addParameter("ajax", "true");

c.executeMethod(mPost);
mPost.getResponseBodyAsString();
1 голос
/ 31 января 2014

Предложение ввода в текстовое поле работает, только если текстовое поле включено. Многие приложения вынуждают вас просматривать файловый браузер файловой системы по понятным причинам. Что вы делаете тогда? Я не думаю, что разработчики WebDriver думали о том, чтобы просто представлять ключи в буфере KeyBoard (раньше это было просто и понятно)

===

После нескольких дней небольшого сна, ударов головой и выдергивания волос я смог получить некоторые решения на основе роботов, предложенные здесь (и в других местах).

Проблема, с которой я столкнулся, заключалась в том, что диалоговое текстовое поле, которое было заполнено с правильным путем и именем файла, не могло отвечать на события KeyPress / Release при завершении имени файла с помощью VK_ENTER, как в:

private final static int Enter = KeyEvent.VK_ENTER;
keyboard.keyPress(Enter);
keyboard.keyRelease(Enter);

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

Кто-нибудь знает, как заставить этого робота вести себя немного лучше?

1 голос
/ 24 июля 2011

Просто подумал, что предоставлю к сведению оригинальную статью автора об использовании ActiveX.Другим обходным решением будет интеграция с инструментами автоматизации настольного графического интерфейса для выполнения этой работы.Например, гугл "Selenium AutoIt".Для более кросс-платформенного решения рассмотрите такие инструменты, как Sikuli поверх AutoIt.

Это, конечно, не учитывает поддержку WebDriver для загрузки в IE и Firefox через SendKeys или для других браузеров, где этот метод не подходит.работа.

0 голосов
/ 07 марта 2014

Если вы используете сетку, вы можете открыть папку тестовых файлов для совместного использования.

Таким образом, вы можете выбрать поле ввода загрузки и установить его значение \\ pc-name \myTestFiles

Если нет, вы должны использовать локальные файлы в каждой системе.

0 голосов
/ 23 декабря 2011

После того, как я слишком долго думал об этой проблеме, я хотел поделиться с сообществом, что Firefox 7.0.1, похоже, имеет проблему с реализацией FirefoxDriver sendKeys (), отмеченной выше (по крайней мере, я не смог получить это работает на моем Windows 7 x64 box), я не нашел обходного пути, но обновление до Firefox 8.0.1, кажется, решило проблему. Для тех, кто интересуется, также можно использовать Selenium RC для решения этой проблемы (хотя вам необходимо учитывать все целевые операционные системы и нажатия собственных клавиш, необходимые для взаимодействия с их диалоговыми окнами выбора файлов). Надеюсь, проблемы, с которыми мне пришлось обойтись, сэкономят время другим людям, в итоге:

https://gist.github.com/1511360

...