Web浏览器控件中的Powershell UI Automation

时间:2014-02-27 05:18:00

标签: powershell modal-dialog webbrowser-control ui-automation

好的,所以我最近学会了如何使用$ie = new-object -com "internetexplorer.application"命令执行UI自动化。这对于我试图在ASPX Web应用程序上自动执行的任务非常有用...直到我遇到冻结我的脚本的模态弹出窗口。从我在线阅读的内容来看,我可能希望通过在窗体上运行相同的过程来避免这种情况,使用forms.webbrowser control.Sample Follows

    [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"

关于我的情况的任何想法?我甚至在正确的轨道上处理模态对话框?

2 个答案:

答案 0 :(得分:0)

在讨论PowerShell / UIA之前,只是为了获取Selenium的建议:我会调查使用Selenium进行这种Web自动化工作,因为它非常棒!我相信它内置了对处理模态对话框的支持。

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

你可以在没有任何包装库的情况下直接使用UIA,但我建议使用现有的PowerShell包装器之一,如WASP或更新的UIA PS扩展:

http://wasp.codeplex.com/

http://uiautomation.codeplex.com/

一种方法是编写几行UIA代码来关闭模态对话框,并确保它独立工作(即,手动调出模态对话框,并执行应解除它的代码)。

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

将UIA代码放在一个单独的文件中是一个方便的黑客,可以解决您可能遇到的大型浏览器自动化问题 - 很可能您在代码中执行的任何操作都会导致模式对话框阻止脚本执行,直到对话框被驳回。因此,您必须确保对话框处理代码在导致模式对话框出现之前启动的单独进程或线程中运行。

答案 1 :(得分:0)

你的问题是$ form.showdialog()。此脚本将暂停,直到您关闭表单。您必须向表单的Shown事件添加一个事件处理程序,如下所示:

$form.Add_Shown({
  $doc = $web.document;
  $doc.getElementbyID('txtUserName').value = "myUser";
});

然后它应该工作