Как загрузить файл через элемент 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");