使用Powershell自动执行IE确认提示

时间:2011-11-17 20:31:14

标签: internet-explorer powershell automation

我有一个很好的powershell脚本,可以为我女儿自动化一个特定的网站。最近他们更改了网站并添加了一个很好的新功能,可以将我的脚本加速10倍。问题是他们用来激活它的输入类型会弹出一个确认对话框。 HTML看起来像这样

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

我可以在PowerShell中自动回答此对话框吗?我希望脚本在后台运行,所以我认为发送键击是不行的。

4 个答案:

答案 0 :(得分:3)

我不打算试图找出如何点击确认对话框,看起来很难处理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...

答案 1 :(得分:3)

我有一个更简单的解决方案。您可以使用自己的函数覆盖原生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,原始确认对话框将会打开。

答案 2 :(得分:2)

回答我自己的问题但是我确实找到了一种方法来做到这一点,即使它有点像黑客。

主脚本通过Com使用Internet Explorer,就像

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

答案 3 :(得分:0)

$ws = New-Object -ComObject WScript.Shell

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

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

  $ws.sendkeys("{ENTER}")
}