webbrowser控件中的Powershell UI自动化

webbrowser控件中的Powershell UI自动化,powershell,modal-dialog,webbrowser-control,ui-automation,Powershell,Modal Dialog,Webbrowser Control,Ui Automation,好的,我最近学习了如何使用$ie=new object-com“internetexplorer.application”命令执行UI自动化。这对于我试图在ASPX web应用程序上自动执行的任务来说非常有效……直到我遇到一个模式弹出窗口,它冻结了我的脚本。从我在网上读到的内容来看,我可能希望通过使用forms.webbrowser控件在表单上运行相同的进程来绕过这个问题 [Reflection.Assembly]::LoadWithPartialName("System.Windows

好的,我最近学习了如何使用
$ie=new object-com“internetexplorer.application”
命令执行UI自动化。这对于我试图在ASPX web应用程序上自动执行的任务来说非常有效……直到我遇到一个模式弹出窗口,它冻结了我的脚本。从我在网上读到的内容来看,我可能希望通过使用forms.webbrowser控件在表单上运行相同的进程来绕过这个问题

    [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null
    [Reflection.Assembly]::LoadWithPartialName("System.Drawing")
    $form = New-Object Windows.Forms.Form
    $form.text = "My Form"
    $form.size = New-Object Drawing.size @(700,600)
    $web = New-object System.Windows.Forms.webbrowser
    $web.location = New-object System.Drawing.Point(3,3)
    $web.minimumsize = new-object System.Drawing.Size(20,20)
    $web.size = New-object System.Drawing.size(780,530)
    $web.navigate("http://myASPXsite.com")
    $form.Controls.Add($web)
    $form.showdialog()
    $doc = $web.document
    $doc.getElementbyID('txtUserName').value = "myUser"
关键是,引用和调用html元素的能力不能通过此方法工作。我可以导航到该网页,但仅此而已。可能是webbrowser控件没有与internetexplorer对象相同的功能。这是我将与其他方法一起使用的代码

   $ie = new-object -com "internetexplorer.application"
   $ie.navigate("http://www.MyASPXsite.com")
   While ($ie.readystate -ne 4) {start-sleep -m 100}
   $doc = $ie.document
   $doc.getelementbyid('txtUserName').value = "myUser"

对我的情况有什么看法吗?在讨论PowerShell/UIA之前,我是否在正确的轨道上处理模式对话框?

只是为了避开Selenium的建议:我会研究将Selenium用于这种web自动化工作,因为它太棒了!我相信它内置了处理模态对话框的支持

否则,如果您必须继续通过PowerShell操作IE自动化界面,我将探索使用MS UI自动化API来处理模式对话框

您可以直接使用UIA而不使用任何包装库,但我建议使用现有的PowerShell包装器之一,如WASP或更新的UIA PS扩展:

一种方法是编写几行UIA代码来关闭模式对话框,并确保它独立工作(即,手动打开模式对话框,只执行应该关闭它的代码)

然后,从驱动IE的现有PowerShell脚本运行UIA代码。您可以将对话框处理代码放在单独的文件中,并通过主程序启动它


将UIA代码放在一个单独的文件中是一个方便的方法,可以解决您可能遇到的大型浏览器自动化问题—很可能无论您在代码中做什么,打开模式对话框都会阻止脚本的执行,直到对话框被取消。因此,您必须确保对话框处理代码在单独的进程或线程中运行,该进程或线程在您启动模式对话框之前启动。

您的问题是$form.showdialog()。脚本将在这一点上保持不变,直到您关闭表单。必须向窗体的显示事件添加事件处理程序,如下所示:

$form.Add_Shown({
  $doc = $web.document;
  $doc.getElementbyID('txtUserName').value = "myUser";
});
那么它应该会起作用