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

标签 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'");

请指教。

最佳答案

因为有一个<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>标签。这不是一个问题,但您可能会考虑这个问题,因为您很可能正在开发网络:)。
  • 您当然不必使不可见元素可见,也不应手动将文件注入(inject)到隐藏的输入元素中,除非对于某些 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" .

关于javascript - 需要 webdriver 和 Javascript 的帮助来隐藏文件上传元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17739529/

相关文章:

javascript - 检测图像中嵌入的内容

java - 表中相关元素的 XPath

java - Selenium findElements() 是否必须隐式等待返回 0 个元素?

javascript - 通过 gulp 从 index.html 中删除脚本

javascript - 没有动画,Canvas 中无限循环

Javascript:始终显示 Chrome 地址栏

python - 不难处理的元素 Selenium

java - 用于检查 Selenium WebDriver 中项目列表的循环

java - Selenium WebDriver : To which extent can I rely on JavaScript?

testing - Selenium (WebDriver) 看不到 richfaces 模式面板