2010-02-04 8 views
5

Mam input type = tekst inputboxes na stronie internetowej załadować i napełnić wartości i kliknij przycisk Prześlij, który działa prawidłowo:PowerShell: wpisz wartość w typie wejściowym = Forma pliku.

$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} 

Chciałbym również, aby wypełnić input type = plik pole z c: \ temp \ test.txt i prześlij to. Przeczytałem, że ze względów bezpieczeństwa wartość = nie jest obsługiwana przez przeglądarki.

Czy jest jakieś obejście tego problemu z PowerShell? Może "kliknij" przycisk przeglądania i wybierz plik lub użyj sendkeys?

Odpowiedz

4

Sprawdź Jaykul's post. Używa Watin do automatyzacji. Wystarczy pobrać zespół i spróbować. Udało mi się ustawić wartość, a następnie przesłać formularz tak:

$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() 

Rozumiem powody, aby używać IE zamiast WebClient i podobnych klas, jednak ich używać w innych przypadkach, jeżeli jest to możliwe.

Edit:

W przypadku, gdy nie ma identyfikatora elementu, ale tylko nazwa, można spróbować

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

lub

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

To wygląda dobrze, chociaż mam problemy, aby znaleźć odpowiednie pole, ponieważ źródło nie ma identyfikatora, ale tylko imię ... Czy wiesz, czy mogę wyszukiwać według nazwy, a nie według id? – icnivad

+1

Użyłem twojego przykładu gdzie wywołujesz funkcję getElementById, więc pomyślałem, że znasz identyfikator. Sprawdzę, czy to możliwe. – stej

+0

Jestem również zdezorientowany, dlaczego mój pierwszy przykład zadziałał, ponieważ tam również mam tylko nazwę i brak tagu id ... Z twoim ostatnim przykładem $ _. GetAttributeValue ("name") wydaje mi się, że znajduję pudełko, ale mój przycisk submit (także bez id nazwy) nie zadziałało. Znowu się z tym bawić jutro. Dziękuję do tej pory – icnivad

1

Zdecydowanie rozważę użycie WebClient lub HttpWebRequest zamiast prowadzenia GUI IE. Istnieje WebClient example przy użyciu PowerShell.

+0

Dzięki za odpowiedź, Matthew. Chociaż wolałbym IE Gui w tej chwili, ponieważ widzę wyniki i unikam problemów z certyfikatami proxy itp., Byłbym zainteresowany tym, jak wyglądałby napisany powyżej kod z podejściem do klienta internetowego .. – icnivad

+1

Wygląda na to, że może nie być w stanie zrobić, co chcesz z czystym WebClient. Jest funkcja dostępna w CodeProject (http://www.codeproject.com/KB/cs/uploadfileex.aspx). Jest to w zasadzie bardziej wyrafinowana wersja WebClient.UploadFile, oparta na HttpWebRequest. –

0

Tak, musiałby użyć trasy SendKeys, jeśli chcesz to zrobić w IE. Bezpośrednie wprowadzanie tekstu do okna jest blokowane w IE8 i wyżej.