使用Invoke-WebRequest时的Supress JS警报

时间:2018-06-18 14:42:22

标签: powershell

这是我观察到的非常奇怪的行为。当网页中只有以下内容时,Invoke-WebRequest将发出警报消息并暂停所有脚本,直到警报被取消。

<script>
alert('testing');
</script>

enter image description here

我在网上找到了一个例子,所以你们都可以轻松复制。

Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load'

这是最奇怪的一点。我已经尝试了很多以避免这种警报。在我的情况下,-UseBasicParsing不是一个选项。因此,我尝试将对象分配给变量,并仅访问没有提及警报的部分。例如:

$x = Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
$x.Forms

但这仍然会生成警报消息!甚至$null = $x.Forms或类似的技巧都不能阻止它。

更奇怪的是,这只返回一次。例如:

$x = Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
$x.Forms
$x.Forms
$x.Forms

返回单个邮件。只有当我重新调用请求时,才会收到其他错误。

我也试过在一份工作中运行它,但这仍然会产生警报。这项工作暂停,直至被解雇。

有没有人知道如何在不使用-UseBasicParsing参数的情况下解决此问题?

2 个答案:

答案 0 :(得分:2)

通过-UseBasicParsing拨打电话

$Request = Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load' -UseBasicParsing

* EDIT:我知道您说过您不能使用-UseBasicParsing,但是这里的要点是您不必实现自己的解析。您可以在修改响应以避免警报之前使用与Invoke-WebRequest相同的解析。这样,您就可以$request.forms进行填充而不会发出任何警报。

修改响应HTML以覆盖警报弹出窗口。

$JavascriptAlertOverride = @"
// Override window.alert
  window.alert = function() {
    // do nothing here
  };

// Override alert
  alert = function() {
    // do nothing here
  };
"@
$NonAlertingHTML = $Request.Content -replace "<head>", "<head><script type='text/javascript'>$JavascriptAlertOverride</script>"

然后将其解析回完整的IHTMLDocument,您将可以立即访问.forms以及Invoke-WebRequest上的其他任何属性,除非您没有警报。

$HTML = New-Object -ComObject "HTMLFile"
$HTML.IHTMLDocument2_write($NonAlertingHTML)
$HTML.forms

PS > $HTML.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                                  
-------- -------- ----                                     --------                                                                                                                  
True     False    HTMLDocumentClass                        System.__ComObject                                                                                                        



PS > $Request.ParsedHtml.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                                  
-------- -------- ----                                     --------                                                                                                                  
True     False    HTMLDocumentClass                        System.__ComObject 

答案 1 :(得分:0)

'https://www.quackit.com/javascript/javascript_alert_box_example_2.cfm'处的SSL出现问题。我得到了:

Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.

At line:1 char:1
+ Invoke-WebRequest -uri 'https://www.quackit.com/javascript/javascript_alert_box_ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

我必须将其更改为:'https://64.73.217.183/javascript/javascript_alert_box_example_2.cfm',然后才能在PS 4.x中对其进行测试。

这个想法如何-使用Try{} Catch{}

Try {
    Invoke-WebRequest -uri 'https://64.73.217.183/javascript/javascript_alert_box_example_2.cfm'
} Catch {
 "$_"
}

由于“ $ _”仅产生简单

  

基础连接已关闭:发送中发生意外错误。

如果您不希望出现任何错误,请删除或标记"$_"

如果您想了解有关Powershell错误处理的完整资源,请阅读The Big Book of PowerShell Error Handling

重新编辑显然,关闭alert框并不是那么容易。根据我的调查,它似乎是Powershell中的iexplorer实例。

根据我的研究,我认为无法“抑制”显示的警报窗口。

但是,您可以采用这种方式(一种解决方法):

一个脚本是原始脚本:

$x = Invoke-WebRequest -uri 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
$x.Forms

第二个是关闭窗口(您需要具有WASP(用于Powershell的Windows自动化管理单元)模块):

Import-Module WASP
start-Sleep -Seconds 15
$web_alert = Get-Process | Where-Object { $_.MainWindowTitle -
Like 'Message from webpage' } # this is what identifies the window (based on your example)
select-window $web_alert | Set-windowActive | send-keys '{Enter}' # press enter

然后按照这些原则编写第三个脚本,它们应该在后台异步启动脚本(这只是一个快速的快照,您可以像PoshRSJob这样看似:

$jobA = Start-Process PowerShell -Argument 'C:\script1.ps1'
$jobB = Start-Process PowerShell -Argument 'C:\script2.ps1'