4

Il existe un formulaire de téléchargement de fichier avec le type de données input[type="text" i]. Je voudrais sélectionner et télécharger un fichier sans Robot class et KeyEvent. La classe en HTML ressemble à ceci: class="form-control ng-pristine ng-invalid ng-touched".Forme AngularJS dans WebDriver

Je tente de télécharger un fichier sans ouvrir une fenêtre de sélection de fichier, utilisez le code suivant.

driver.findElement(By.cssSelector("myfilepath"); 

j'ai eu une exception et même lorsque j'utilise XPath pour identifier un objet et passez le chemin du fichier.

org.openqa.selenium.ElementNotVisibleException: element not visible

site similaire et la forme: https://angular-file-upload.appspot.com/#2

+0

possible d'avoir un oeil à la page? –

+0

On dirait que vous essayez de remplir la valeur de l'élément qui n'est pas visible. Vous devriez d'abord aller à cet élément pour le remplir. Vous n'êtes pas sûr de votre sélecteur css 'myfilepath' - c'est juste un exemple, ou avez-vous le composant/directive' myfilepath'? –

+0

@ MartinAdámek: Pas besoin de faire défiler, il est visible après le chargement de la page. La variable 'myfilepath' contient le chemin exact du fichier sur mon ordinateur. – plaidshirt

Répondre

1

Vous devez sélectionner le input[file] premier (par exemple via sélecteur CSS), et définir le chemin d'accès au fichier comme sa valeur:

driver.findElement(By.cssSelector("input.your-file-input-class")).sendKeys("/my/file/path"); 

Vous avez besoin pour trouver l'élément via input.your-file-input-class en premier. Ajustez le sélecteur CSS en fonction de votre balisage.

La meilleure façon d'être sûr de remplir la bonne entrée est d'ajouter une classe ou un identifiant sur l'élément. Vous pouvez également utiliser input[type="text"] comme sélecteur, si vous savez qu'il n'y aura qu'une seule entrée de fichier sur la page.

driver.findElement(By.cssSelector("input[type=\"text\"]")).sendKeys("/my/file/path"); 

Btw vous a également noté dans les commentaires, que myfilepath est une variable contenant le chemin. Si oui, laissez tomber les guillemets, vous ne pouvez pas l'utiliser comme une valeur de chaîne:

String myfilepath = "/path/to/file"; 

driver.findElement(By.cssSelector("input[type=\"text\"]")).sendKeys(myfilepath); 

Si l'erreur préserve, vous devriez essayer d'attendre jusqu'à ce que l'élément est visible, cela pourrait aider aussi:

WebDriverWait wait = new WebDriverWait(driver, 60); // 1 min timeout 
WebElement el = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input[type=\"text\"]"))); 
el.sendKeys(myfilepath); 
+0

J'utilise 'WebDriver 3.6.0' et la méthode' setAttribute' ne peut pas être résolue. – plaidshirt

+0

On dirait que vous devez faire cela dans JS, mettra à jour la réponse. –

+0

donc la méthode sur l'élément java est appelée 'sendKeys',' setAttribute' est de js élément DOM, désolé pour la confusion ... –

1

en utilisant javascript nous pouvons atteindre cet

code javascript:

var test=document.querySelector('your css selector'); 

test.setAttribute("value","your path value"); 

écrire du code javascript dans la chaîne et passée à javascriptExecutor avec csspathselector, la valeur de chemin du fichier

Code Sélénium:

String js = "var test=document.querySelector(arguments[0]);test.setAttribute('value',arguments[1]);"; 
JavascriptExecutor jse = (JavascriptExecutor)driver; 
jse.executeScript(js, "yourcssSelectorPath","filepath"); 
+0

It throw error: 'Runtime.evaluate throw exception: SyntaxError: missing) après argument liste' – plaidshirt

+0

désolé j'ai manqué de fermer après argument [0], essayez ceci – Raju

+0

Chaîne js =" var test = document.querySelector (arguments [0] test.setAttribute ("value", arguments [1]); " – Raju