it-roy-ru.com

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

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

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

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

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

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

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

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

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

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

40
AutomatedTester

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

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

===

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

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

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

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

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

1
user3037058

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

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

1
David

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

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

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

0
HerrWalter

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

https://Gist.github.com/1511360

0
Matthew Madson