Использование Webdriver для загрузки файла PrimeFaces - PullRequest
2 голосов
/ 21 февраля 2012

У меня проблема с написанием теста с использованием Webdriver и HTMLUnit для моей страницы Primefaces.

Что я сделал, так это добавил на страницу простой файл загрузки Primefaces, который будет принимать файл CSV (пока без проверки), например:

<p:fileUpload id="listFileUpload" mode="simple"  value="#{fileImportView.file}" />

Это действительно сделает объект UploadedFile доступным для моего метода слушателя при использовании из Firefox.

Однако, когда тот же самый слушатель вызывается через тест, получаемый файл UploadedFile будет нулевым. Чтобы присвоить полю fileupload значение перед отправкой формы, я использую sendKeys, например:

WebElement drawListFileUpload = webDriver.findElement(By.id("accordionPanel:listFileUpload"));
drawListFileUpload.clear();
drawListFileUpload.sendKeys(file);

Кто-нибудь может увидеть, что происходит? Я искал ответ, касающийся используемого нами драйвера HTMLUnit, но пока сигары нет ... Похоже, код работает нормально для календаря Primefaces в той же форме.

Вот ссылка для доступа к приложению

1 Ответ

2 голосов
/ 13 марта 2014

Мне тоже нравится твоя разработка.Я собираюсь поделиться своими знаниями, но, возможно, есть лучший способ.

jsf-код на стороне сервера

<h:form id="lifeProposalEntryForm" enctype="multipart/form-data">
    <p:fileUpload fileUploadListener="#{AddNewLifeProposalActionBean.handleProposalAttachment}"  
            mode="advanced" multiple="true" sizeLimit="3000000" update="customerEntryPanel attachmentDataList"
            allowTypes="/(\.|\/)(gif|jpe?g|png)$/" id="proposalAttachment"/>    
</h:form>

html-код на стороне клиента

<div id="lifeProposalEntryForm:proposalAttachment" class="ui-fileupload ui-widget">
    <div class="ui-fileupload-buttonbar ui-widget-header ui-corner-top">
        <span class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-icon-left ui-fileupload-choose" role="button">
            <span class="ui-button-icon-left ui-icon ui-c ui-icon-plusthick"></span>
            <span class="ui-button-text ui-c">Choose</span>
            <input id="lifeProposalEntryForm:proposalAttachment_input" type="file" multiple="multiple" name="lifeProposalEntryForm:proposalAttachment_input">
        </span>
        <button class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-icon-left ui-fileupload-upload" type="button" role="button">
            <span class="ui-button-icon-left ui-icon ui-c ui-icon-arrowreturnthick-1-n"></span>
            <span class="ui-button-text ui-c">Upload</span>
        </button>
        <button class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-icon-left ui-fileupload-cancel" type="button" role="button">
            <span class="ui-button-icon-left ui-icon ui-c ui-icon-cancel"></span>
            <span class="ui-button-text ui-c">Cancel</span>
        </button>
    </div>
......
  • Получить элемент lifeProposalEntryForm:proposalAttachment_input с помощью id.
  • Поместить / отправить ключом файла (один или несколько файлов)
  • Получить элемент second button из <div id="lifeProposalEntryForm:proposalAttachment".
  • Нажмите на элемент кнопки.

Тестирование селиния в Java

webElement = driver.findElement(By.id("lifeProposalEntryForm:proposalAttachment_input"));
webElement.sendKeys("C:\\temp\\life\\life_1.jpg");
webElement = driver.findElement(By.xpath("//input[@type='file'and @id='lifeProposalEntryForm:proposalAttachment_input']"));
webElement= driver.findElement(By.xpath(".//*[@id='lifeProposalEntryForm:proposalAttachment']/div[1]/button[1]"));
webElement.click();

Попробуйте, как я уже упоминал.Это работа для меня.

...