Как загрузить файл через элемент input с type="hidden", используя Selenium и Java?

Я хочу использовать Java Selenium для загрузки файла в следующем элементе ввода (элемент загрузки).

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

Я пытался использовать sendKeys, но получил сообщение об ошибке:

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

Затем я попытался использовать JavascriptExecutor в сценарии, чтобы изменить видимость элемента (type="file"), но все равно получил ту же ошибку: элемент невидим:

JavascriptExecutor jsexec = (JavascriptExecutor) driver; 
jsexec.executeScript("arguments[0].type='file'", upload);  

Я также попытался использовать родительский элемент "div" для загрузки, но получил ошибку "не могу сфокусировать элемент".

Кто-нибудь может мне помочь решить эту проблему?

2 ответа

Я предполагаю, что ваша проблема, по сути, в том, что, вероятно, существует объект-обертка, который по умолчанию красив input элемент. Веб-разработчикам свойственно "скрывать" этот элемент ввода по умолчанию, и поэтому Selenium не сможет щелкнуть по этому объекту, поскольку его атрибут отображения имеет значение "none".

Возможно, нам придется взглянуть на другие теги HTML в этой иерархии DOM, но я подозреваю, что, вероятно, есть еще один входной тег, вложенный на 1 или 2 уровня ниже, который выглядит примерно так. Он должен по крайней мере иметь атрибут отображения, установленный в none:

<input display: none;> </input>

Чтобы загрузить файл, вам нужно будет отправить ключи непосредственно к этому элементу. Но сначала вам нужно сделать это видимым:

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

После выполнения приведенного выше кода вы должны увидеть необработанный элемент ввода. Это элемент, который вы хотите отправить:

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

Честно говоря, не видя всего DOM, я не могу сообщить, нужна ли нижняя строка. Вам нужно будет попробовать и убедиться в этом:

jsexec.executeScript("arguments[0].type='file'", upload);
  • Если такого вложенного элемента ввода не существует, просто попробуйте код выше с текущим элементом ввода, который вы нашли.

В соответствии с вашим вопросом и HTML вы поделились <input> тег имеет атрибут 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");
Другие вопросы по тегам