如何获取对IWebBrowser对象的引用

时间:2017-01-23 16:55:42

标签: c# .net powershell com ole

我在Powershell中编写了一个脚本,它将为我打开一系列标签并登录到打开的每个标签。到目前为止,我的脚本非常标准。

$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 }
}

我最大的问题是,每当调用导航方法时,我对新选项卡的引用都会丢失,并且仍会使用对现有选项卡的引用。创建新选项卡并导航到右侧页面,但是在整个for循环中,我在第一个选项卡上调用了对Document.readyState和Document.getElementByID()。click()的调用。我对此进行了调查,发现MSDN https://msdn.microsoft.com/en-us/library/aa752093(v=vs.85).aspx中的Navigate方法记录了这种行为。

  

当指定了navOpenInNewWindow或navOpenInNewTab时,调用者不会收到对新窗口的WebBrowser对象的引用,因此没有直接的方法来操作它。

因此,鉴于我无法通过Navigate方法获取对我的新Web浏览器对象的引用,我需要以另一种方式获取对它的引用。

如何获取对新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,我仍然没有立即明白解决方案。

1 个答案:

答案 0 :(得分: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允许我们通过索引访问选项卡,因为从预定义的数组中打开选项卡,您已经在站点URL和索引之间建立了映射。