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

Как работать с загрузкой файлов в автоматизацию тестирования с использованием селена или webdriver

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

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

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

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

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

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

Ответ 1

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

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

Приведенный выше пример находится в Python, но вы получаете идею

Ответ 2

Использование 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();

Ответ 3

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

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

Ответ 4

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

===

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

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

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

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

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

Ответ 5

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

https://gist.github.com/1511360

Ответ 6

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

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

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