需要帮助webdriver和Javascript的隐藏文件上传元素

时间:2013-07-19 06:36:05

标签: javascript selenium webdriver

我正在尝试在客户端Web应用程序中自动执行文件上载方案。整个文件上传表单的代码如下所示

<td valign="top">
    <iframe id="batchLoad:inputFile:uploadFrame" class="iceInpFile" width="600px" scrolling="no" height="30px"             frameborder="0" title="Input File Frame" style="border-collapse:collapse; border-spacing:0px; padding:0px;" src="/hip-webapp/block/resource/LTExMzg4MjQzMTY=/" name="batchLoad:inputFile:uploadFrame" marginwidth="0"       marginheight="0" allowtransparency="true">
        <html style="overflow:hidden;">
            <head>
                <body style="background-color:transparent; overflow:hidden">
                    <form id="fileUploadForm" enctype="multipart/form-data" action="/hip-webap/uploadHtml" method="post">
                        <input type="hidden" value="batchLoad:inputFile" name="ice.component">
                        <input type="hidden" value="3" name="ice.view">
                        <input class="iceInpFileTxt" type="file" size="35" name="upload">
                        <input class="iceInpFileBtn" type="submit" value="Upload">
                    </form>
                </body>
        </html>
    </iframe>
    <br>
    <span id="batchLoad:j_id537"></span>
</td>

我尝试使用传统的文件上传方法,但这不起作用。

请参阅:Selenium Webdriver FIle Upload error element ice:inputFile

我对Javascript不是很熟悉因此我认为我正在做一些语法错误。 我试过的是:

String ew = (String)js.executeScript("document.getElementByXPath('//form[@id='fileUploadForm']/input[3]')");
String j = "arguments[0].style.height='auto'; arguments[0].style.visibility='visible';";
js.executeScript(j, ew);

从这里获得提示Selenium WebDriver clicking on hidden element

但现在我收到语法错误。我使用Selenium IDE获得了XPath。我也试过这个,但这也不起作用。

((JavascriptExecutor)driver).executeScript("document.getElementByClassName(iceInpFileTxt).style.visibility = 'visible';");
((JavascriptExecutor)driver).executeScript("document.getElementByClassName('iceInpFileTxt').value = 'D:\\AD\\Prac\\Prac\\002 EditPrac Add Person Error.xml-revHEAD.svn000.tmp.xml'");

请建议。

1 个答案:

答案 0 :(得分:1)

由于您正在使用的网页上有<iframe>元素,因此您需要switch the driver context to that <iframe> element first

driver.switchTo().frame("batchLoad:inputFile:uploadFrame");

完成后,再次尝试常用的上传方法。

driver.findElement(By.name("upload")).sendKeys("D:\\AD\\Prac\\Prac\\002 EditPrac Add Person Error.xml-revHEAD.svn000.tmp.xml");

请注意,当您尝试与<iframe>之外的元素进行互动时,您必须事先做driver.switchTo().defaultContent();


附注:

  • iframe没有结束</head>标记。这不是问题,但你可能会考虑的事情,因为你最有可能开发网络:)。
  • 您当然不必使隐形元素可见,也不应手动将文件注入隐藏的输入元素,除非是某些Flash / Silverlight控件。您可以立即设置value
  • String ew = (String)js.executeScript("document.getElementByXPath('//form[@id='fileUploadForm']/input[3]')");

    包含错误。您使用的嵌套'无法正常工作。你应该通过\来逃避内部单引号。此外,它应该返回WebElement,因此您应该将结果转换为WebElement,而不是String

  • js.executeScript(j, ew);

    如上所述,第二个参数应为WebElement。此外,如果您之前已切换到正确的框架,则可以通过driver.findElement()找到正常的框架。

  • document.getElementByClassName()不存在。正确的方法名称是document.getElementsByClassName()(注意复数“元素”)。它返回一组元素,因此你需要在for循环中迭代它们,或者盲目地选择第一个元素([0])。

  • document.getElementByClassName(iceInpFileTxt).style.visibility = 'visible';

    包含错误,方法(如果存在)采用字符串,因此您应引用"iceInpFileTxt"