如何获取对 IWebBrowser 对象的引用
How to get a reference to an IWebBrowser object
我正在 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 }
}
我最大的问题是,每当调用 navigate 方法时,我对新选项卡的引用就会丢失,而对现有选项卡的引用仍在使用。新选项卡已创建并导航到正确的页面,但在整个 for 循环中我的第一个选项卡上调用了 Document.readyState 和 Document.getElementByID().click() 。我对此进行了调查,发现此行为记录在 MSDN https://msdn.microsoft.com/en-us/library/aa752093(v=vs.85).aspx.
的 Navigate 方法中
When navOpenInNewWindow or navOpenInNewTab is specified, the caller does not receive a reference to the WebBrowser object for the new window, so there is no immediate way to manipulate it.
因此,鉴于我无法通过 Navigate 方法获取对我的新 Web 浏览器对象的引用,我需要以其他方式获取对它的引用。
如何获取对新 WebBrowser 对象的引用?
作为参考,我查看了 InternetExplorer 对象文档,https://msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspx, and the WebBrowser control documentation, https://msdn.microsoft.com/en-us/library/w290k23d(v=vs.110).aspx 我仍然没有立即找到解决方案。
所以,我把解决这个问题作为我的使命,诚然这并不容易,但我有一个可行的解决方案。
$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://whosebug.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 与其索引之间建立了映射。
我正在 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 }
}
我最大的问题是,每当调用 navigate 方法时,我对新选项卡的引用就会丢失,而对现有选项卡的引用仍在使用。新选项卡已创建并导航到正确的页面,但在整个 for 循环中我的第一个选项卡上调用了 Document.readyState 和 Document.getElementByID().click() 。我对此进行了调查,发现此行为记录在 MSDN https://msdn.microsoft.com/en-us/library/aa752093(v=vs.85).aspx.
的 Navigate 方法中When navOpenInNewWindow or navOpenInNewTab is specified, the caller does not receive a reference to the WebBrowser object for the new window, so there is no immediate way to manipulate it.
因此,鉴于我无法通过 Navigate 方法获取对我的新 Web 浏览器对象的引用,我需要以其他方式获取对它的引用。
如何获取对新 WebBrowser 对象的引用?
作为参考,我查看了 InternetExplorer 对象文档,https://msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspx, and the WebBrowser control documentation, https://msdn.microsoft.com/en-us/library/w290k23d(v=vs.110).aspx 我仍然没有立即找到解决方案。
所以,我把解决这个问题作为我的使命,诚然这并不容易,但我有一个可行的解决方案。
$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://whosebug.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 与其索引之间建立了映射。