IE автоматизация с помощью Powershell
Я пытаюсь автоматизировать вход на сайт в нашей интрасети, используя Powershell и IE. Пока у меня есть следующий код, который работает:
$ie = new-object -com "InternetExplorer.Application"
$ie.navigate("https://somepage/jsp/module/Login.jsp/")
while($ie.ReadyState -ne 4) {start-sleep 1}
$ie.visible = $true
$doc = $ie.Document
If ($doc.nameProp -eq "Certificate Error: Navigation Blocked") {
$doc.getElementByID("overridelink").Click()
}
$loginid = $doc.getElementById("loginid")
$loginid.value= "username"
$password = $doc.getElementById("password")
$password.value = 'somepass'
$ie.navigate("javascript:doSubmit('login')",$null,$true)
Итак, проблемная область, которую я имею сейчас, состоит в том, что сайт закрывает исходное окно, использованное для входа в систему, и открывает новое окно IE. Как мне отправить данные в это новое окно? Я знаю, что могу использовать что-то вроде tasklist.exe /v, чтобы получить PID нового окна... но я не уверен, как бы я взял его под свой контроль.
Кроме того, после просмотра моего кода, пожалуйста, знайте, что я не собираюсь использовать встроенные имя пользователя и пароли. Это только для того, чтобы мне не приходилось постоянно вводить комбо un/pw каждый раз, когда я хочу протестировать скрипт.
3 ответа
Попробовав немного больше...
$applist = new-object -com shell.application
$newie = $applist.windows() | where {$_.Type -eq "HTML Document" -and $_.LocationURL -match "MainFrame.jsp"}
Я нашел старую статью, в которой описывается, как сделать то, что вы ищете, циклически перебирая окна Shell.Application
объект. Я должен сказать, что, хотя это выглядит возможным и, кажется, отвечает на ваш прямой вопрос, подход кажется мне довольно неприятным и хрупким.
Если вы не против попробовать другой подход, я бы посоветовал попробовать Selenium Webdriver. Вы можете использовать драйвер Internet Explorer, и примеры C# в документации обычно хорошо переводятся в PowerShell. Вы также получаете некоторые другие приятные преимущества, такие как драйверы для других веб-браузеров или возможность ожидания условия вместо того, чтобы полагаться на циклы сна / проверки. Вы также будете иметь driver.switchTo()
функция, которая позволяет прыгать между окнами или фреймами.
Попробуй это.
- $ shell = (New-Object -ComObject Shell.Application).Windows ()
- $ shell.Count
- 7
- у вас есть пункты 0-6, вы можете проверить этот путь.
- $ Shell.Item(0).LocationName
- или же
- $ Shell.Item (0).LocationURL
- $ Shell.Item (1).LocationName
- $ Shell.Item(1).LocationURL