Selenium + PhantomJS dans Python 2.7, téléchargement de fichier

Je me suis heurté à cette fonction depuis quelques heures et je ne peux pas l'utiliser de quelque façon que ce soit.

Supposons que l'emplacement de mon élément et le chemin d'image sont corrects en tout temps. (Sérieusement, je me suis occupé de ces 4 dernières heures, ce n'est pas l'emplacement de l'élément et ce n'est pas le chemin du fichier.)

Ce que j'ai commencé avec était un sendkeys à l'élément de saisie. Cela n'a pas donné d'erreur, mais a provoqué l'exécution du script pour toujours; Il ne serait pas passé et aucune image n'a été téléchargée.

J'ai littéralement essayé toutes les variations possibles de la méthode sendkeys répertoriées sur les 4 premières pages de Google lors de la recherche de "Python PhanthomJS Selenium upload file sendkeys". Retour à la planche à dessin.

Actuellement, je cherche à exécuter un peu de JavaScript via Python pour télécharger le fichier, mais je n'ai aucune idée de la façon de procéder.

La page sur laquelle j'essaie de télécharger a son formulaire configuré sur hidden et affiche uniquement un bouton qui ouvre une boîte de dialogue de chargement sur les navigateurs normaux. Je pense que c'est pourquoi sendkeys ne fonctionnait pas.

Quelqu'un peut-il me donner des suggestions ou des suggestions comme quoi essayer ensuite? Ou comment exécuter un certain JavaScript de Python?

EDIT: J'ai appris à exécuter JavaScript en utilisant le sélénium en python et il m'a sauvé la journée. Pour quiconque vient ici de google ou quoi que ce soit avec le même problème, permettez-moi d'expliquer ce que j'ai fait: le fait que mon .send_keys() était suspendu lors de l'envoi de clés à l'élément input[file=input] m'a demandé de faire le sujet Mais depuis que le webdriver était encore capable de trouver l'élément, je ne pensais pas trop à cela et je me suis réveillé comme quelque chose de aléatoire. Plus tard, cependant, je suis venu avec une suggestion que, parce qu'il avait un display: hidden !important type css display: hidden !important le webdriver aurait pu le trouver, mais ne pas interagir avec lui, et pour une raison quelconque, le sélénium a simplement décidé de se raccrocher au lieu de s'écraser / donner une erreur. Dans cet esprit, j'ai commencé à parcourir les documents et .execute_script() trouvé la commande .execute_script() , mais on peut l'utiliser pour exécuter un morceau de JavaScript via le Webdriver. Pourquoi je voulais cela, c'est voir si le style de classe avait quelque chose à voir avec le tout, comment vous le demandez? Bien, nous pouvons utiliser la ligne de code suivante pour modifier l'attribut de classe de l'élément input[type=file] : document.querySelector("input").className="" . Ce n'est pas la solution la plus élégante étant donné que nous supprimons essentiellement la class entière responsable de l' display: hidden !important style display: hidden !important . Si la classe devait contenir des données plus importantes, je suggérerais de changer la classe au lieu de la renommer pour "" ou de supprimer. En avançant et en essayant, il a montré le bouton d'entrée comme je l'espérais! Après cela, j'ai simplement essayé d'envoyer les clés et je n'ai trouvé aucun problème. Il n'y a pas besoin de cliquer, de soumettre ou de rien. driver.find_element_by_css_selector('input[type=file]').send_keys('path/to/file') Cependant, j'ai noté que la façon dont vous structurez le chemin semble être très importante. Par exemple, je teste sur Windows et path/to/file n'a pas téléchargé ou sélectionné aucune image pour moi, en utilisant le path\\to\\file cependant, a fonctionné complètement.

Tldr:

driver.execute_script('document.querySelector("input")').className=""

suivi par:

driver.find_element_by_css_selector('input[type=file]').send_keys('path/to/file')

Est ce que cela a fonctionné pour moi, et si vous êtes dans une situation identique, votre variation sur le script doit télécharger l'image comme prévu.