2017-01-23 4 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.

Когда navOpenInNewWindow или navOpenInNewTab задан, то вызывающий абонент не получит ссылку на объект WebBrowser для нового окна, так что нет никакого непосредственного способа манипулировать ею.

Таким образом, учитывая, что я не могу получить ссылку на мой новый объект веб-браузера с помощью метода навигации, мне нужно получить ссылку на него другим способом.

Как получить ссылку на новый объект 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() 

Использование оболочки позволяет получить доступ к вкладке с помощью индекса, так как вы открытие вкладки из заданного массива, у вас уже есть отображение между URL сайта и его индекс.

+1

Вы были на том же треке, что и я, я просто не мог поместить свой ответ в код! В голове мне показалось, что я могу вернуться к ОС и получить ссылку на IE с помощью HWND. Я также изучал свое наследование объектов, чтобы узнать, не могу ли я использовать ссылку на $ ie, чтобы перейти к контейнеру родительского объекта, а затем получить ссылку на мой массив. В целом, мне нравится ваше решение. Прекрасная работа! – slmaq