通过 HtmlUnit 进行 JSF Richfaces fileUpload 测试

JSF Richfaces fileUpload testing by HtmlUnit

我的问题是如何通过 HtmlUnit 测试 Richfaces FileUpload。

我的html页面代码如下:

<div class="uploadFile">
    Upload File:
    <div id="allForm:upload" class="rf-fu ">
        <div class="rf-fu-hdr">
            <span class="rf-fu-btns-lft">
            <span class="rf-fu-btn-add">
            <span class="rf-fu-btn-cnt-add" style="background-position: 2px 2px; padding: 3px 5px 3px 21px;">
            <span class="rf-fu-inp-cntr">
            <input class="rf-fu-inp" type="file">
            </span> Add...
            </span>
            </span>
            <span class="rf-fu-btn-upl">
            </span>
            <span class="rf-fu-btns-rgh">
            </div>
            <div class="rf-fu-lst" style="height: 0px"></div>
            <div class="rf-fu-cntr-hdn">
            </div>
            </div>
    </div>

我的javahtml单元测试代码是这样的:

@Test(dataProvider = "browsers")
public void testFileUpload(BrowserVersion browserVersion) throws IOException {
    HtmlPage page = (HtmlPage) doLogin(browserVersion);
    HtmlFileInput fileUpload = page.getElementByName("rf-fu-inp");
    assertNotNull(fileUpload);
    fileUpload.setData(fileForUpload(FILEPATH).toByteArray());
}

在这种情况下,我得到以下异常:

com.gargoylesoftware.htmlunit.ElementNotFoundException: elementName=[*] attributeName=[name] attributeValue=[rf-fu-inp]

我的主要问题是我在输入元素上没有 id 否则我有机会做这样的事情。

 HtmlFileInput fileUpload = (HtmlFileInput) page.getElementById("rf-fu-inp");

怎么样:

page.getByXPath("//*[@class='rf-fu-inp']")

这意味着:通过 XPath 查找,根元素“//”中具有值为 "rf-fu-inp".

的属性 "class" 的所有标签名称“*”

请在XPath Tutorial and the HtmlUnit API

中阅读更多内容

我找到了解决方案:

 //UplaodFile
        HtmlFileInput htmlFileInput = null;
        DomNodeList<DomElement> inputs = page.getElementsByTagName("input");
        for (DomElement domElement : inputs) {
            if (domElement.getAttribute("class").equals("rf-fu-inp") &&
                    domElement.getAttribute("type").equals("file")) {
                htmlFileInput = (HtmlFileInput) domElement;
                htmlFileInput.setValueAttribute(System.getProperty("basedir") + FILEPATHCURRENTXML);
                break;
            }
        }