Need help for webdriver and Javascript for a hidden File upload element

江枫思渺然 提交于 2021-01-29 02:11:41

问题


I am trying to automate a file upload scenario in a client web application. The code of the entire file upload form looks like this

<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>

I tried with the conventional File upload method, but that did not work.

Please refer: Selenium Webdriver FIle Upload error element ice:inputFile

I am not much familiar with Javascript hence I think I am doing some syntax error. What I tried is:

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);

Got the hint from here Selenium WebDriver clicking on hidden element.

But now I am getting syntax error. I got the XPath using Selenium IDE. I have also tried this, but that did not work either.

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

Please advice.


回答1:


Because there is an <iframe> element on the page you're working with, you need to switch the driver context to that <iframe> element first:

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

Once you've done that, try the usual upload method again.

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

Note that when you'll try to interact with elements outside the <iframe>, you'll have to do driver.switchTo().defaultContent(); beforehand.


Side notes:

  • The iframe does not have a closing </head> tag. This is not an issue, but something you might think about since you're most likely developing the web :).
  • You certainly don't have to make the invisible elements visible nor should you inject the file to the hidden input element manually unless for some Flash/Silverlight controls. You could have simply set the value right away.
  • String ew = (String)js.executeScript("document.getElementByXPath('//form[@id='fileUploadForm']/input[3]')");

    contains an error. You are using nested ' which does not work. You should escape the inner single quote via a \. Also, it should return a WebElement, so you should cast the result to WebElement, not to a String.

  • js.executeScript(j, ew);

    As said above, the second argument should be a WebElement. Also, if you had switched to the correct frame before, you could have found it the usual way via driver.findElement().

  • document.getElementByClassName() does not exist. The right method name is document.getElementsByClassName() (note the plural "elements"). And it returns a set of elements, so you need to iterate over them in a for loop, or blindly pick the first one ([0]).

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

    contains an error, the method (if it existed) takes a string, so you should quote the "iceInpFileTxt".



来源:https://stackoverflow.com/questions/17739529/need-help-for-webdriver-and-javascript-for-a-hidden-file-upload-element

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!