1
votes

Sélénium Python: Impossible de localiser l'élément (// input [@ type = 'file'] ')

J'essaye de télécharger un fichier en utilisant l'automatisation Python. Alors que j'essaie d'exécuter le code ci-dessous, le sélénium python jette une erreur. Même j'ai essayé d'attendre 10 secondes pour éviter les problèmes de synchronisation.

<div class="span8">
  <input type="file" id="imageFile" class="form-control choose valid">
</div>

NoSuchElementException: Message: aucun élément de ce type: impossible de localiser élément: {"method": "xpath", "selector": "// input [@ type =" file "]"}

URL du site Web:

https://ocr.space/

Extrait de code HTML:

driver.execute_script('window.open("https://ocr.space/" , "new window")')
Imagepath = r"C:\User\Desktop\banner.png"
field=driver.find_element_by_xpath('//input[@type="file"]')
field.send_keys(Imagepath)


3 commentaires

Pourquoi ouvrez-vous le site avec window.open () au lieu de la manière standard? Lorsque vous ouvrez le site dans un nouvel onglet, vous devez basculer vers cet onglet avant de pouvoir interagir avec lui. C'est le problème.


@JeffC Plutôt que de critiquer l'approche d'OP, vous devez vous renseigner sur le cas d'utilisation d'OP. L'approche suivie par OP peut dépendre d'autres facteurs dont nous ne sommes pas conscients.


@DebanjanB Je n'ai pas critiqué, j'ai posé une question et expliqué le problème lié à l'utilisation de cette approche ... ce qui explique l'erreur qu'il reçoit.


3 Réponses :


2
votes

Changer le code pour lancer l'url avec get semble résoudre le problème.

from selenium import webdriver


driver = webdriver.Chrome("./chromedriver")

driver.get("https://ocr.space/")
image = r"C:\Users\Thanthu Nair\Desktop\soc360.png"
field=driver.find_element_by_xpath('//input[@type="file"]')
field.send_keys(image)

Assurez-vous également que le chemin fourni C: \ User \ Desktop \ banner.png est correct, sinon vous obtiendrez une autre exception. Je suppose simplement que ce chemin peut être erroné car le dossier Desktop se trouve généralement à l'intérieur du dossier avec le nom de l'utilisateur qui se trouve dans le dossier User. Dans ce cas, votre dossier Desktop se trouve dans le dossier User selon le chemin que vous avez indiqué.


0 commentaires

0
votes

En général, lorsque la balise associée à téléchargement de fichier contient l'attribut type en tant que file code > vous pouvez appeler send_keys () pour remplir le champ de texte pertinent avec une séquence de caractères . Cependant, dans votre cas d'utilisation, la balise a bien type = "file" mais les attributs class sont form-control choose qui se présente comme suit:

<input type="file" id="imageFile" class="form-control choose">

Ainsi, vous ne pourrez peut-être pas envoyer une séquence de caractères appelant send_keys () .

Dans ces cas, vous devez utiliser des solutions basées sur Auto IT . Vous pouvez trouver quelques discussions pertinentes dans:


3 commentaires

Comment cela répond-il à la question? Le problème est Impossible de localiser l'élément , non pas qu'il ne peut pas send_keys () à l'élément.


@JeffC En raison de votre visibilité limitée une fois de plus, vous n'avez pas réussi à voir la situation dans son ensemble. Veuillez prendre le temps de comprendre les cas d'utilisation et de réagir en conséquence.


... et encore une fois, vous n'avez pas lu et compris la question. Comment .send_keys () est-il le problème (ligne 4) lorsque la ligne 3 provoque l'échec? Mais clairement cela ne vous empêchera pas de critiquer et d'insulter les autres pour ne pas comprendre le problème.



1
votes

Pour résoudre votre problème, remplacez simplement nouvelle fenêtre par _self dans la ligne ci-dessous de votre code:

JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("window.open(\"https://ocr.space/\" , \"_self\")");

System.out.println(driver.getTitle());

WebElement field = driver.findElement(By.xpath("//input[@type='file']"));
String imagePath = "some image";
field.sendKeys(imagePath);

Votre code est fonctionne bien mais la raison d'une erreur est qu'après l'exécution de votre code, il lance le navigateur avec deux onglets rien que des fenêtres et la page sera lancée dans la deuxième fenêtre, vous devez donc basculer vers cette fenêtre avant de télécharger une image.

Vous pouvez utiliser des poignées de fenêtre pour basculer vers cette fenêtre. Voici le code en Java, vous pouvez essayer de faire de même en utilisant Python:

// Using JavaScriptExecutor to launch the browser
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("window.open(\"https://ocr.space/\" , \"new window\")");
// Fetching window handles and switching to the last window
Set<String> handles = driver.getWindowHandles();
for(String handle : handles) {
    driver.switchTo().window(handle);
}
// Printing window title
System.out.println(driver.getTitle());
// Uploading an image
WebElement field = driver.findElement(By.xpath("//input[@type='file']"));
String imagePath = "some image";
field.sendKeys(imagePath);

Si vous utilisez window.open () pour lancer une URL, alors il fera deux choses, d'abord il lancera le navigateur avec la fenêtre par défaut puis il ouvrira l'URL dans un nouvel onglet même si vous ne fournissez pas d'argument nouvelle fenêtre dans votre fonction JavaScript. Vous devez basculer vers une fenêtre particulière pour y effectuer des opérations si vous choisissez cette méthode.

Pour éviter un problème ci-dessus, vous pouvez simplement utiliser driver.get (URL) ou driver.navigate (). to (URL) qui lance le navigateur et accède à une URL particulière dans la même fenêtre de navigateur lancée.

Si vous souhaitez utiliser JavaScriptExecutor uniquement sans lors de la commutation, vous pouvez passer _self comme deuxième argument à la fonction JavaScript comme ci-dessous au lieu de nouvelle fenêtre ce qui évite la commutation et lance une URL dans la même fenêtre: p >

driver.execute_script('window.open("https://ocr.space/" , "_self")')

J'espère que cela aide ...


0 commentaires