Автоматизация запроса подтверждения IE с помощью Powershell - PullRequest
3 голосов
/ 18 ноября 2011

У меня есть хороший скрипт powershell, который автоматизирует определенный сайт для моей дочери.Недавно они изменили сайт и добавили новую замечательную функцию, которая ускорила бы мой сценарий в 10 раз. Проблема в том, что тип ввода, который они используют для активации, вызывает диалоговое окно подтверждения.HTML выглядит так:

<input type=submit name='enter_all' value='Enter all' onClick="return confirm('Enter all?');">

Можно ли автоматизировать ответ на этот диалог в powershell?Я хочу, чтобы скрипт выполнялся в фоновом режиме, поэтому я думаю, что отправка нажатий клавиш прекращена.

Ответы [ 4 ]

3 голосов
/ 28 сентября 2014

У меня есть еще более простое решение для этого. Вы можете переопределить встроенную функцию window.confirm своей собственной. Моя реализация ниже заменяет ее функцией confirm, которая пропускает диалог подтверждения только один раз.

PowerShell:

$ie = New-Object -COM InternetExplorer.Application -Property @{
    Navigate = "http://www.example.com/"
    Visible = $true
}
do { Start-Sleep -m 100 } while ( $ie.busy )

# Override window.confirm function with confirmOnce, so that on first call
# it will return true and immediately restore it to native confirm.
$jsCommand = @"
    window.confirm = (function() {
        var nativeConfirm = window.confirm;
        function confirmOnce(message) {
            window.confirm = nativeConfirm;
            return true;
        }
        return confirmOnce;
    })();
"@
$document = $ie.document
$window = $document.parentWindow
$window.execScript($jsCommand, 'javascript') | Out-Null

После запуска скрипта откроется окно IE. Нажмите F12, чтобы перейти к консоли JavaScript, и введите:

confirm('Really?')

Он вернется true. Попробуйте снова запустить confirm, откроется оригинальное диалоговое окно подтверждения.

3 голосов
/ 22 ноября 2011

Я бы не стал пытаться выяснить, как нажимать на диалоговое окно подтверждения, это выглядит довольно сложно, имея дело только с COM.

Вместо этого я просто отправил бы такую ​​форму. Предположим, у меня есть этот HTML:

<html>
  <body>
  <form action="http://localhost/xx">
  <input type="submit" onclick="return confirm('really?')" value="ENTER" />
  </form>
  </body>
</html>

Чем я могу обойти диалог подтверждения с этим кодом:

$ie = New-Object -ComObject internetexplorer.application
$ie.Navigate('http://localhost/x.html')
$ie.Visible = 1 # not needed
# look for the correct form, you probably know which one is it
$ie.document.forms | 
   Select -First 1 | 
   % { $_.submit() }   # simply submit...
2 голосов
/ 24 ноября 2011

Отвечая на мой собственный вопрос, но я нашел способ сделать это, даже если это что-то вроде хака.

Основной скрипт использует Internet Explorer через Com так же, как

$ie = new-object -com "InternetExplorer.Application"

Существует множество примеров того, как использовать объект ie com для навигации, заполнения полей, нажатия кнопок и т. Д. И т. Д. Однако всплывающее подтверждение просто приводит к зависанию.

Чтобы обойти это, я запустил другой поток, используя Wasp , который является библиотекой для автоматизации форм Windows. В этой теме я просто зацикливаюсь на поиске подтверждения и нажимаю на него. (В моем случае окно всплывает много раз). Код для этого скрипта выглядит следующим образом

   Import-Module WASP
while ($true) {
  [System.Threading.Thread]::Sleep(200) 
  $confirmation = Select-Window iexplore 
  if ($confirmation -ne $null) {
    Select-ChildWindow  -Window $confirmation | Select-Control -title "OK" -recurse | Send-Click
  }
}
0 голосов
/ 05 февраля 2019
$ws = New-Object -ComObject WScript.Shell

$ld = (gps iex* | where {$_.MainWindowTitle }).id

if($ld.Count -gt 1)
{
  $ws.AppActivate($ld[1])

  $ws.sendkeys("{ENTER}")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...