2010-02-04 10 views
5

J'ai un type d'entrée = texte boîtes de saisie sur une page Web que je charge et remplir avec des valeurs et cliquez sur le bouton Envoyer qui fonctionne très bien:PowerShell: écrire une valeur dans un type d'entrée = fichier Form.

$ie=New-Object -comobject InternetExplorer.Application 
$ie.visible=$true 
$ie.Navigate("https://myurl/test.html") 
while($ie.busy){Start-Sleep 1} 
$ie.Document.getElementById("field_firstName").value="Firstname" 
$ie.Document.getElementById("field_lastName").value="Lastname" 
$ie.Document.getElementById("btn_upload").Click() 
while($ie.busy){Start-Sleep 1} 

J'aimerais aussi remplir un type d'entrée = fichier boîte avec c: \ temp \ test.txt et télécharger ceci. J'ai lu que pour des raisons de sécurité, value = n'est pas supporté par les navigateurs.

Est-il possible de contourner ce problème avec PowerShell? Peut-être "cliquez" sur le bouton Parcourir et sélectionnez le fichier ou utilisez les touches de raccourci?

Répondre

4

Vérifiez Jaykul's post. Il utilise Watin pour l'automatisation. Téléchargez simplement l'assemblage et essayez. J'ai pu définir la valeur et soumettre le formulaire comme celui-ci:

$WatinPath = 'c:\bin\watin\WatiN.Core.dll' #path with downloaded assembly 
$watin  = [Reflection.Assembly]::LoadFrom($WatinPath) 

$ie  = new-object WatiN.Core.IE("https://myurl/test.html") 
$file1 = $ie.FileUpload('file1') #id of the input 
$file1.set('C:\temp\test.txt') # path to the file 

# and now just find the button and click on it 
$o = $ie.Button('send') #send is id of the submit button 
$o.Click() 

Je comprends vos raisons d'utiliser IE au lieu de WebClient et des classes similaires, mais les utiliser dans d'autres cas, si possible.

Edit:

Si vous ne disposez pas d'ID de l'élément, mais seulement le nom, vous pouvez essayer

$f = $ie.FileUpload({param($fu) $fu.GetAttributeValue("name") -eq 'the name you have' }) 

ou

$f = $ie.FileUploads | ? { $_.GetAttributeValue("name") -eq 'the name you have' } 
+0

Cela semble bon, bien que j'ai des problèmes pour trouver le bon champ que la source n'a pas d'ID mais juste un nom ... Savez-vous si je peux rechercher par nom et non par ID? – icnivad

+1

J'ai utilisé votre exemple où vous appelez la fonction getElementById, donc je pensais que vous connaissiez l'identifiant. Je vais vérifier si c'est possible. – stej

+0

Je suis également confus pourquoi mon premier exemple a fonctionné parce que j'ai juste aussi un nom et aucune étiquette d'identification ... Avec votre dernier exemple $ _. GetAttributeValue ("name") il semble que je trouve la boîte mais mon submitbutton (aussi pas d'id juste le nom) n'a pas fonctionné. Avoir à jouer avec ça encore demain. Merci jusqu'à présent – icnivad

1

Je voudrais fortement utiliser WebClient ou HttpWebRequest au lieu de conduire l'interface graphique IE. Il y a un WebClient example utilisant PowerShell.

+0

Merci pour la réponse, Matthew. Bien que je préfère IE Gui pour le moment car je peux voir les résultats alors et éviter les problèmes avec les certificats de proxy, etc. Je serais intéressé comment le code posté ci-dessus ressemblerait à une approche webclient .. – icnivad

+1

Il vous ressemble peut ne pas être en mesure de faire ce que vous voulez avec WebClient pur. Il y a une fonction à CodeProject (http://www.codeproject.com/KB/cs/uploadfileex.aspx) que vous pourriez regarder. Il s'agit essentiellement d'une version plus sophistiquée de WebClient.UploadFile, basée sur HttpWebRequest. –

0

Oui, vous devrait utiliser la route SendKeys si vous voulez faire cela dans IE. L'entrée de texte directe dans la boîte est bloquée dans IE8 et plus haut.

Questions connexes