使用HtmlUnit的FileUpload不会触发fileUploadListener-Event(Primefaces自动上传)

时间:2014-08-08 11:32:49

标签: selenium file-upload primefaces webdriver htmlunit

我正在尝试使用WebDriver自动化文件上传。它适用于ChromeDriver和FirefoxDriver,但拒绝为HTMLUnit工作。

我已经阅读了

Using Webdriver for PrimeFaces file upload

https://stackoverflow.com/questions/21753497/unable-to-automate-filling-of-form-with-file-upload-using-htmlunit

Unable to upload file using Selenium web driver

但两者都没有帮助。

此上传操作的selenium(java)代码非常简单:

String elementXPath = "//input[contains(@id,'FileUpload_input')]";
WebElement element = driver.findElement(By.xpath(elementXPath));
element.sendKeys(pathToFile);

inputElement的html代码是:

<div class="fileupload-buttonbar ui-widget-header ui-corner-top">
    <label class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-icon-left fileinput-button" role="button" aria-disabled="false">
        <span class="ui-button-icon-left ui-icon ui-icon-plusthick"></span>
        <span class="ui-button-text">Upload</span>
        <input type="file" id="form:FileUpload_input" name="form:FileUpload_input">
    </label>
</div>
<div class="fileupload-content ui-widget-content ui-corner-bottom">
    <table class="files"></table>
</div>

可能是必要的,输入元素的primefaces-codesnippet:

<div class="#{modalDialog ? 'span5' : 'span6'}">
    <p:fileUpload id="FileUpload" mode="advanced" auto="true" sizeLimit="2097152" fileUploadListener="#{ClassView.handleFileUpload}"
    label="Upload" allowTypes="/(\.|\/)(gif|GIF|jpe?g|JPE?G|png|PNG)$/" process="@this"
    showButtons="false"/>
</div>

正如您所看到的,这是一个图片上传。这个上传的值得注意的特点是,没有'确认'或'提交'按钮。

testautomation适用于主浏览器,但是使用htmlUnit失败。经过几个小时的调试,我可以确认,htmlUnit执行'sendKeys'-Methode,但这不会触发fileUploadListener。我已经尝试点击其他元素,因此有一个focusLost-Action,但这没有帮助。 实际上,'sendKeys'之后的'driver.getPageSource()'传递:

<div class="fileupload-buttonbar ui-widget-header ui-corner-top">
    <label class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-icon-left fileinput-button" role="button" aria-disabled="false">
        <span class="ui-button-icon-left ui-icon ui-icon-plusthick"></span>
        <span class="ui-button-text">Upload</span>
        <input id="form:FileUpload_input" name="form:FileUpload_input" value="correct\path\to\file\pic.png" type="file" >
    </label>
</div>
<div class="fileupload-content ui-widget-content ui-corner-bottom">
    <table class="files">
        <tbody align="left">
            <tr class="template-upload" style="">
                <td class="preview"></td>
                <td class="name">pic.png</td>
                <td class="size"></td>
                <td class="progress">
                    <div class="ui-progressbar ui-widget ui-widget-content ui-corner-all" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="100">
                        <div class="ui-progressbar-value ui-widget-header ui-corner-left ui-corner-right" style="width: 100%; display: block;"></div>
                    </div>
                </td>
                <td class="start">
                    <button class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only ui-state-hover" type="submit">
                        <span class="ui-button-icon-left ui-icon ui-icon ui-icon-arrowreturnthick-1-n"></span>
                        <span class="ui-button-text">ui-button</span>
                    </button>
                </td>
                <td class="cancel">
                    <button class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only">
                        <span class="ui-button-icon-left ui-icon ui-icon ui-icon-cancel"></span>
                        <span class="ui-button-text">ui-button</span>
                    </button>
                </td>
            </tr>
        </tbody>
    </table>
</div>

所以现在有按钮......为什么? 我仍然试图点击带有xPath "//td[@class='start']//button"的按钮,但仍然没有发生任何事情。没有Fileupload。

HtmlDriver启用了javascript,我也在使用NicelyResynchronizingAjaxController()。我已经尝试等待超过30秒,但仍然无效。

是否有人知道这个问题并且它是解决方案......或者至少是一种解决方法?

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。 我仍在使用selenium 2.40,升级到2.42解决了问题,虽然更改日志没有为我的问题提出可能的错误修正。