2017-01-23 25 views
0

我正在Powershell中編寫一個腳本,它將爲我打開一系列選項卡並登錄到打開的每個選項卡。到目前爲止,我的腳本非常標準。如何獲取對IWebBrowser對象的引用

$ipaddresses = #some array of ip addresses 
$ie = New-Object -ComObject internetexplorer.application 
$ie.Visible = $true 
for ($i = 0; $i -lt 1; $i++) { 
    $url = "http://"+($ipaddresses[$i])+":8000" 
    if($i -eq 0) {$ie.Navigate($url+"/login",0)} else {$ie.Navigate($url+"/login",2048)} 
    while($ie.Document.readyState -ne "complete") { Start-Sleep -Milliseconds 100 } 
    $ie.Document.getElementById("submitButton").click() 
    while($ie.Document.readyState -ne "complete") { Start-Sleep -Milliseconds 100 } 
} 

我最大的問題是,每當導航方法被調用時,我提到我的新選項卡丟失,參考我現有的選項卡仍在使用。新選項卡已創建並導航到正確的頁面,但對Document.readyState和Document.getElementByID()。click()的調用在整個for循環的第一個選項卡上被調用。我調查了這一點,發現這種行爲記錄在MSDN https://msdn.microsoft.com/en-us/library/aa752093(v=vs.85).aspx的Navigate方法中。

當指定navOpenInNewWindow或navOpenInNewTab,主叫方沒有收到新窗口的WebBrowser對象的引用,所以沒有對其進行操作立竿見影的辦法。

因此,鑑於我無法通過Navigate方法獲得對新瀏覽器對象的引用,我需要以另一種方式獲取對它的引用。

如何獲得對新的WebBrowser對象的引用?

作爲參考,我查看了InternetExplorer對象文檔https://msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspx和WebBrowser控制文檔https://msdn.microsoft.com/en-us/library/w290k23d(v=vs.110).aspx,但對我而言,解決方案仍不是很明顯。

回答

2

所以,我把它作爲我的使命,弄清楚這一點,並承認它並不容易,但我有一個可行的解決方案。

$windows = (New-Object -ComObject Shell.Application).Windows() 
$ie = New-Object -ComObject internetexplorer.application 
$ie.Visible = $true 
$ie.Navigate("http://www.taylorgibb.com", 0) 
$ie.Navigate("https://stackoverflow.com/questions/tagged/powershell", 2048) 

while($ie.Busy) { 
    Start-Sleep -Milliseconds 100 
} 

$tabs = $windows | Where {$_.Name -eq "Internet Explorer" -and $_.HWND -eq $ie.HWND} 
$button = $tabs[1].Document.IHTMLDocument2_all | where {$_.id -eq 'nav-jobs'} 
$button.click() 

使用shell讓我們獲得通過索引訪問到標籤,因爲你從預定義的陣列打開你的標籤,你已經擁有了網站的網址和其指數之間的映射。

+1

你和我在同一條軌道上,我無法將我的答案放到代碼中!在我的腦海中,我想我可以回到操作系統並通過使用HWND獲取IE引用。我還在探索我的對象繼承,以查看我是否無法使用我的$ ie引用來訪問父對象容器,然後獲取對數組的引用。總的來說,我確實喜歡你的解決方案。美麗的工作! – slmaq