Detectar quando uma página da Web é carregada sem usar o modo de suspensão

Estou criando um script VB no windows que abre um site no IE. O que eu quero: Detectar quando a página da Web é carregada e exibir uma mensagem. Consegui isso usando sleep ( WScript.Sleep ) por aprox. segundos quando o site é carregado. No entanto, o site aparece nome de usuário, senha no meio do caminho. Somente quando o usuário insere credenciais, acaba de carregar a página. Portanto, não quero usar “sleep” por aproximadamente segundos, em vez disso, uma function exata ou uma maneira de detectar que a página foi carregada. Eu verifiquei na linha e tentei usar Do While loop, onload , onclick funções, mas nada funciona. Para simplificar, mesmo se eu escrever um script para abrir um site como o yahoo e detectar, exibir uma mensagem “Oi” quando a página é carregada: ele não funciona sem usar o sono ( WScript.Sleep ).

    Tente o método convencional:

     Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://www.yahoo.com/" Do While objIE.ReadyState <> 4 WScript.Sleep 10 Loop ' your code here ' ... 

    UPD: este deve verificar se há erros:

     Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://www.yahoo.com/" On Error Resume Next Do If objIE.ReadyState = 4 Then If Err = 0 Then Exit Do Else Err.Clear End If End If WScript.Sleep 10 Loop On Error Goto 0 ' your code here ' ... 

    UPD2: Você escreveu que o IE é desconectado quando o pop-up de login entra, hipoteticamente há uma maneira de pegar a desconexão e, em seguida, obter a instância do IE novamente. Note que isso é “programação anormal” 🙂 Espero que isso ajude:

     Option Explicit Dim objIE, strSignature, strInitType Set objIE = CreateObject("InternetExplorer.Application") ' create IE instance objIE.Visible = True strSignature = Left(CreateObject("Scriptlet.TypeLib").GUID, 38) ' generate uid objIE.putproperty "marker", strSignature ' tokenize the instance strInitType = TypeName(objIE) ' get typename objIE.Navigate "https://www.yahoo.com/" MsgBox "Initial type = " & TypeName(objIE) ' for visualisation On Error Resume Next Do While TypeName(objIE) = strInitType ' wait until typename changes (ActveX disconnection), may cause error 800A000E if not within OERN WScript.Sleep 10 Loop MsgBox "Changed type = " & TypeName(objIE) ' for visualisation Set objIE = Nothing ' excessive statement, just for clearance Do For Each objIE In CreateObject("Shell.Application").Windows ' loop through all explorer windows to find tokenized instance If objIE.getproperty("marker") = strSignature Then ' our instance found If TypeName(objIE) = strInitType Then Exit Do ' may be excessive type check End If Next WScript.Sleep 10 Loop MsgBox "Found type = " & TypeName(objIE) ' for visualisation On Error GoTo 0 Do While objIE.ReadyState <> 4 ' conventional wait if instance not ready WScript.Sleep 10 Loop MsgBox "Title = " & objIE.Document.Title ' for visualisation 

    Você pode obter todos os nós de texto, links, etc. do DOM, da seguinte maneira:

     Option Explicit Dim objIE, colTags, strResult, objTag, objChild, arrResult Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://www.yahoo.com/" Do While objIE.ReadyState <> 4 WScript.Sleep 10 Loop Set colTags = objIE.Document.GetElementsByTagName("a") strResult = "Total " & colTags.Length & " DOM Anchor Nodes:" & vbCrLf For Each objTag In colTags strResult = strResult & objTag.GetAttribute("href") & vbCrLf Next ShowInNotepad strResult Set colTags = objIE.Document.GetElementsByTagName("*") arrResult = Array() For Each objTag In colTags For Each objChild In objTag.ChildNodes If objChild.NodeType = 3 Then ReDim Preserve arrResult(UBound(arrResult) + 1) arrResult(UBound(arrResult)) = objChild.NodeValue End If Next Next strResult = "Total " & colTags.Length & " DOM object nodes + total " & UBound(arrResult) + 1 & " #text nodes:" & vbCrLf strResult = strResult & Join(arrResult, vbCrLf) ShowInNotepad strResult objIE.Quit Sub ShowInNotepad(strToFile) Dim strTempPath With CreateObject("Scripting.FileSystemObject") strTempPath = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%TEMP%") & "\" & .gettempname With .CreateTextFile(strTempPath, True, True) .WriteLine (strToFile) .Close End With CreateObject("WScript.Shell").Run "notepad.exe " & strTempPath, 1, True .DeleteFile (strTempPath) End With End Sub 

    Também procure obter dados de texto

    UPD3: Eu quero colocar aqui uma verificação adicional se o carregamento da página da Web e a boot estiverem concluídos:

     ' ... ' Navigating to some url objIE.Navigate strUrl ' Wait for IE ready Do While objIE.ReadyState <> 4 Or objIE.Busy WScript.Sleep 10 Loop ' Wait for document complete Do While objIE.Document.ReadyState <> "complete" WScript.Sleep 10 Loop ' Processing loaded webpage code ' ... 

    UPD4: Há alguns casos em que você precisa rastrear se um nó de destino foi criado no documento (geralmente é necessário se você obtiver o erro Object required ao tentar acessar o nó por .getElementById , etc.):

    Se a página usar AJAX (o HTML de origem da página carregada não contém o nó de destino, o conteúdo ativo, como JavaScript, o cria dinamicamente), há o exemplo no trecho abaixo de uma página, mostrando como ela pode ser. O nó de texto 5.99 pode ser criado depois que a página foi completamente carregada e algumas outras solicitações a um servidor para que dados extras sejam exibidos ocupam um lugar:

     ...   5.99   ... 

    Ou se você estiver carregando, por exemplo, página de resultados de pesquisa do Google e esperando pelo botão Avançar aparece (especialmente, se você invocou o método .click na página anterior), ou carregando alguma página com o formulário web de login e esperando pelo nome de usuário como .

    O código abaixo permite fazer uma verificação adicional se o nó de destino estiver acessível:

     With objIE ' Navigating to some url .Navigate strUrl ' Wait for IE ready Do While .ReadyState <> 4 Or .Busy WScript.Sleep 10 Loop ' Wait for document complete Do While .Document.ReadyState <> "complete" WScript.Sleep 10 Loop ' Wait for target node created Do While TypeName(.Document.getElementById("userID")) = "Null" WScript.Sleep 10 Loop ' Processing target node .Document.getElementById("userID").Value = "myusername" ' ... ' End With