如何使用Selenium和Java通过类型为“ hidden”的“ input”元素上传文件?

时间:2018-08-24 08:39:46

标签: java angularjs selenium-webdriver file-upload webdriver

我想使用Java Selenium在以下输入元素(上传元素)中上传文件。

entity-name="JsonRequest"

我尝试使用'sendKeys',但收到错误信息:

<input type="hidden" ng-model="model[options.key || index]"      
 id="formly_21_fileupload_args_content_substrate_surface_media_documentURL_0"
 name="formly_21_fileupload_args_content_substrate_surface_media_documentURL_0"
 formly-custom-validation="options.validators"
 class="ng-pristine ng-untouched ng-invalid ng-invalid-wizard-validation">  

然后我尝试在脚本中使用 JavascriptExecutor 来更改Element(type =“ file”)的可见性,但仍然出现相同的错误:element is invisible:

upload.sendKeys("filePath"); // element is invisible

我还尝试使用父元素'div'进行上传,但收到错误“无法使元素聚焦”。

有没有人可以帮助我解决这个问题?

2 个答案:

答案 0 :(得分:0)

根据您的问题和您共享的<input>标签 HTML ,其属性为 type =“ hidden” 。要在sendKeys()标签上调用<input>,可以使用以下解决方案:

WebElement uploadElement = new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@class='ng-pristine ng-untouched ng-invalid ng-invalid-wizard-validation'][contains(@name,'_fileupload_args_content_substrate_surface_media_documentURL_')]")));
String jse = "arguments[0].type='file'";
((JavascriptExecutor)driver).executeScript(jse, uploadElement);
uploadElement.sendKeys("absolute_path_of_the_file_to_be_uploaded");

答案 1 :(得分:0)

我猜您的问题本质上是,可能存在一个包装对象来修饰默认的input元素。 Web开发人员通常会“隐藏”此默认输入元素,因此,Selenium将无法单击该对象,因为其显示属性设置为“无”。

我们可能需要查看DOM层次结构中的其他HTML标记,但是我怀疑下面可能嵌套有1或2个级别的另一个输入标记,看起来像这样。它至少应将显示属性设置为none:

<input display: none;> </input>

要上传文件,您需要将sendKeys直接发送到此元素。但是首先,您需要使其可见:

//the 'upload' variable here refers to the input element with display: none;

JavascriptExecutor jsexec = (JavascriptExecutor) driver; 
//First, change the display to inline to expose the underlying input element
jsexec.executeScript("arguments[0].display='inline;', upload);

执行上述代码后,您应该看到一个原始输入元素出现。这是您希望将Keys发送到的元素:

//After that you can go ahead to upload the file:
upload.sendKeys("path of the file");

老实说,在没有看到整个DOM的情况下,我无法建议以下行是否必要。您需要亲自尝试一下:

jsexec.executeScript("arguments[0].type='file'", upload);
  • 如果不存在这样的嵌套输入元素,请尝试使用上面找到的当前输入元素的代码。