使用PowerShell关闭弹出窗口

4
目前我正在编写一个脚本来自动化IE中的过程,以添加计算机名称及其MAC地址,以便我们可以镜像它们。该页面有两个字段,一个用于MAC地址,另一个用于计算机名称,然后是一个新添加按钮。目前仍需手动输入,但我打算从csv文件中读取以一次处理大量数据。
我目前遇到的问题是每当出现重复记录时,javascript弹出窗口会告诉你。弹出窗口会禁用与IE页面的交互。我需要一种方法在条目之间关闭弹出窗口。
这是我目前代码的样子。
cls

$URL = ""
$iterator = 1;

#starts IE
$ie = new-object -ComObject "InternetExplorer.Application"

#visible for testing purposes
$ie.visible = $true
#$ie.silent = $true
$ie.navigate($URL)

#Manual Input
$newMAC = read-host -prompt 'Input MAC here'
$newNAME = read-host -prompt 'Input Computer Name here'

while($ie.Busy -eq $true) { start-sleep -Milliseconds 100 }

#enters information into appropriate fields and clicks the add button
($ie.document.getElementsByName("mc_id") |select -first 1).value = $newNAME;
($ie.document.getElementsByName("mac_id") |select -first 1).value = $newMAC;
($ie.document.getElementsByName("btnAddNew") |select -first 1).click();

编辑:

目前我决定采用粗略的解决方案,即每次新条目都关闭我的com对象。然而,我现在遇到了导入csv以供脚本读取的问题。


哎呀,我甚至不知道PowerShell可以做到那个。由于这被标记为JavaScript,JavaScript的解决方案是否可行? - Gerrit0
一个可能的方法是使用 user32.dll 中的一个函数,比如 DestroyWindow。P/invoke 签名可以在这里找到:http://www.pinvoke.net/default.aspx/user32.DestroyWindow。这里有一个使用 P/invoke 签名的指南:http://www.leeholmes.com/blog/2009/01/19/powershell-pinvoke-walkthrough/。 - BenH
@BenH 我会调查一下这个问题,谢谢你的建议。 - P. McDevitt
你能从页面/网站中抓取所有现有的MAC地址,并在你的代码中进行检查,避免重复添加吗?你能直接使用Invoke-WebRequest将数据POST到后端,避免使用IE并完全不运行JavaScript吗? - TessellatingHeckler
很遗憾,@TessellatingHeckler,我的团队只能访问此页面的前端,并且只能添加新名称。最糟糕的是,弹出窗口甚至都不必要,它只是告诉您有一个重复项正在被覆盖。 - P. McDevitt
@P.McDevitt,你仍然可以使用开发者工具或本地MITM代理(例如Fiddler4)捕获浏览器在添加新名称时提交的内容,然后从脚本中复制。它可能是一个HTTP POST请求,带有一些标准表单提交内容。弹出窗口只是IE运行JavaScript时显示“显示弹出窗口”,如果您跳过它并从另一个客户端进行身份验证和表单提交,则无需处理弹出窗口。 - TessellatingHeckler
1个回答

2
$wshell = New-Object -ComObject wscript.shell;
if($wshell.AppActivate('Message from webpage'))
{
    Start-Sleep -Seconds 1
    [System.Windows.Forms.SendKeys]::SendWait('{Enter}')
}

这段代码将把活动窗口设置为标题为"Message from webpage"的窗口。因此,请调整它以匹配弹出窗口的标题。

然后,它将发送Enter键按下。您可以尝试调整它以发送组合键来关闭弹出窗口。甚至可以使用::SendWait('%{f4}')发送ALT+F4

我假设Javascript弹出窗口在一个新窗口中打开。或者,您可以查看页面上使用的其他JavaScript,如果仅用于弹出窗口,则可以禁用该页面上的Javascript以进行com对象。

编辑:

要禁用Javascript,您需要将其添加到受限制的站点安全区域,并确保该区域的Javascript执行已关闭。但我有一个更好的主意,您可以使用com对象尝试破解页面的弹出功能:

$ie = new-object -ComObject "InternetExplorer.Application"
$ie.visible = $true
$ie.navigate("http://www.echoecho.com/jswindows03.htm")
$ie.Document.body.innerHTML = $ie.Document.body.innerHTML -replace "popup\('www.yahoo.com', 'Win1', 300, 300\);", ""

这段代码打开了一个带有演示JavaScript弹出框函数的页面,然后从按钮的 onclick 事件中删除了该函数调用。这会导致弹出框不再被调用。您可以执行与我所做的相同的技巧来修改页面的客户端副本并破坏JavaScript或修改它以使其永远不显示。


我刚试了一下,它似乎没有切换到弹出窗口,但却发送了回车。我该如何在 com 对象中禁用 JavaScript? - P. McDevitt
我更新了我的回答。没有看到页面源代码,我无法解决你所有的问题,但这应该足以让你开始了。通过编程方式编辑页面的HTML代码以删除警报JavaScript似乎是有效的。在我的示例中,“-replace”将使用正则表达式匹配HTML并将其替换为“”(空)。 - Nick
@P.McDevitt 有什么进展了吗? - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接