我有一个很好的powershell脚本,可以为我女儿自动化一个特定的网站。最近他们更改了网站并添加了一个很好的新功能,可以将我的脚本加速10倍。问题是他们用来激活它的输入类型会弹出一个确认对话框。 HTML看起来像这样
<input type=submit name='enter_all' value='Enter all' onClick="return confirm('Enter all?');">
我可以在PowerShell中自动回答此对话框吗?我希望脚本在后台运行,所以我认为发送键击是不行的。
答案 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}")
}