1

好的,我最近學會了如何使用$ie = new-object -com "internetexplorer.application"命令來執行UI自動化。這對我嘗試在ASPX Web應用程序中自動執行的任務非常有用......直到我遇到了凍結我的腳本的模式彈出窗口。從我在線閱讀,我可能要通過運行在窗體上同一過程,使用forms.webbrowser control.Sample繞過這是繼網頁瀏覽器控件中的Powershell UI自動化

[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元素的能力不通過此方法工作。我可以導航到網頁,但沒有更多。可能是因爲web瀏覽器控件沒有與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" 

對我的情況有什麼想法?我甚至在正確的軌道上處理模態對話框?

回答

0

在討論PowerShell/UIA之前,爲了獲得Selenium的建議:我會調查使用Selenium進行這種Web自動化工作,因爲它太棒了!我相信它內置了對處理模態對話框的支持。否則,如果您必須保持通過PowerShell操作IE自動化接口,我會探索使用MS UI自動化API來處理您的模態對話框。

您可以使用UIA直接,沒有任何包裝的庫,但我建議使用現有的PowerShell的包裝像WASP或較新的UIA PS擴展名之一:

http://wasp.codeplex.com/

http://uiautomation.codeplex.com/

一方法是編寫幾行UIA代碼來消除模態對話框,並確保它獨立工作(即手動調出模態對話框,並執行應該消除它的代碼)。

然後,從驅動IE的現有PowerShell腳本運行UIA代碼。你可以把對話框處理代碼放在一個單獨的文件中,並通過你的主程序啓動它。

將UIA代碼放在一個單獨的文件中是一個方便的工具,可以解決您可能遇到的大型瀏覽器自動化問題 - 這可能是您在代碼中執行的任何操作,可能會導致模態對話框阻止腳本執行直到對話被解散。所以你必須確保你的對話框處理代碼運行在一個單獨的進程或線程中,在你啓動模態對話框之前啓動它。

0

你的問題是$ form.showdialog()。該腳本將在這一點持續,直到您關閉表單。你必須添加事件處理程序窗體的顯示的事件是這樣的:

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

那麼它應該工作