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

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

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

0 голосов
/ 25 августа 2018

Я предполагаю, что ваша проблема заключается в том, что, вероятно, существует объект-обертка для красивого элемента 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);
  • Если такого вложенного элемента ввода не существует, просто попробуйте код выше с текущим элементом ввода, который вы нашли.
0 голосов
/ 24 августа 2018

В соответствии с вашим вопросом и тегом 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...