我想使用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'进行上传,但收到错误“无法使元素聚焦”。
有没有人可以帮助我解决这个问题?
答案 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);