Página 1 de 1

VBA interagindo com IE (HTML)

Enviado: 10 Nov 2016 às 08:04
por wesleyribeiro123
Pessoal
Bom dia,

Estou tentando fazer o VBA logar em meu email corporativo.
Endereço: http://mail.tempotelecom.com.br/

Consigo acessa-lo, digito o meu email e a senha, marco a CheckBox de Permanecer Conectado, porém não consigo clicar no botão "Login".
Não encontrei um ID para este botão e como não entendo muito de HTML, fiquei com dificuldade para interagir com este item.
Imagem

Observem que o botão possui Type, Class e Value.
Me ajudem apenas com a instrução para clicar no botão "Login".

Sub teste()

Dim Endereço As String
Dim MyBrowser As SHDocVw.InternetExplorer
Dim ULogin As Boolean, ieForm

Endereço = "http://mail.tempotelecom.com.br/"
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate (Endereço)
IE.Visible = True
While IE.ReadyState <> 4
Wend

IE.Document.all("username").innerText = "Meu email"
IE.Document.all("password").innerText = "Minha senha"
IE.Document.all("remember").Click

'Neste momento preciso que o VBA clique no Botão Login...
IE.Document.getElementsByTagName("ZLoginAppName").Click

End Sub

VBA interagindo com IE (HTML)

Enviado: 10 Nov 2016 às 08:23
por laennder
Tente assim:
Código: Selecionar todos
IE.Document.getElementsByClassName("ZLoginButton").Click

VBA interagindo com IE (HTML)

Enviado: 10 Nov 2016 às 11:00
por wesleyribeiro123
Laennder, obrigado pela atenção

Continua com o erro, ele apresenta a seguinte mensagem:
"Erro em tempo de execução '438':
O objeto não aceita esta propriedade ou método"

VBA interagindo com IE (HTML)

Enviado: 10 Nov 2016 às 13:23
por laennder
Então tenta assim:
Código: Selecionar todos
IE.Document.forms(0).submit()

VBA interagindo com IE (HTML)

Enviado: 10 Nov 2016 às 15:22
por wesleyribeiro123
Laennder
Consegui solucionar usando o seguinte codigo

For Each Button In IE.Document.getElementsByTagName("input")
Button.Click
Next

Porém agora me deparei com uma nova situação ... Ao clicar Login e criar uma nova mensagem, essa nova mensagem abre em um popup do navegador e todo comando que o vba executa está na janela principal e não no popup que agora deveria ser meu foco.

Como faço para alterar o foco para este popup e continuar interagindo via VBA?

Re: VBA interagindo com IE (HTML)

Enviado: 10 Nov 2016 às 15:25
por Mikel
Boa tarde Wesley e Laennder.

Bem, uma coisa que observei na primeira sugestão apresentada pelo Laennder, foi o valor do atributo Class incompleto. Tente utilizar da seguinte forma:
Código: Selecionar todos
IE.Document.getElementsByClassName("ZLoginButton DwtButton").Click
Esta é a maneira mais fácil de se realizar o Click.

Agora, caso essa forma não funcione, podemos usar um código um pouco mais complexo, mas funciona. Veja abaixo:
Código: Selecionar todos
Dim oElement As Object 'Objeto referente a um Elemento
Dim oElementCol As Object 'Coleção de um tipo de Elemento
'Atribui a coleção oElementCol, os elementos Input da página.
Set oElementCol = IE.Document.getElementsByTagName("input")
'Realiza um laço em todos os elementos Input, através da coleção oElementCol.
For Each oElement In oElementCol
  'Compara o atributo Value do Elemento Input atual, como valor procurado (Login).
  'Ao encontrar, é simulado o Click e força a saída do laço.
  If oElement.Value = "Login" Then oElement.Click: Exit For
Next oElement
Acredito que um dos dois modelos deve funcionar.

Abraços e excelente final de semana, que já esta batendo na porta.

Re: VBA interagindo com IE (HTML)

Enviado: 10 Nov 2016 às 16:39
por wesleyribeiro123
Mikel
Boa... Você viu meu segundo questionamento?
Ao clicar em Login e em Nova Mensagem o navegador abre uma nova janela (popup).
O problema é que o foco continua na janela principal do IE, a mesma que o VBA abriu tornando impossível manipular o popup e enviar o email.

Como faço para o foco sair da janela principal e seguir o popup?

Desde já muito obrigado pela atenção e pela promeira resposta...
Abçs

Re: VBA interagindo com IE (HTML)

Enviado: 10 Nov 2016 às 19:31
por Mikel
Wesley, boa noite.

Não tinha visto, já que eu estava escrevendo a minha mensagem, quando você estava posto a solução do problema.

Sobre o PopUp, por acaso existe um endereço (url) padrão para este?

Se sim, você poderia usar esse endereço e fazer um IE.Navigate.

Aguardo retorno.

VBA interagindo com IE (HTML)

Enviado: 14 Nov 2016 às 09:59
por wesleyribeiro123
Mikel
Boa tarde,

Então pensei nisso também, porém o caminho não é igual, ele gera um contador tipo assim:
1ª vez que clico ele aparece:
http://mail.tempotelecom.com.br/public/ ... &childId=0
2ª vez que clico ele aparece:
http://mail.tempotelecom.com.br/public/ ... &childId=1

Mesmo logado no meu email, se eu entrar com o endereço da 1ª vez ele não é capaz de carregar a página e fica uma página em branco.

Achei uma solução na internet em um forum americano, porém ele retorna um erro de variável nao definida... Veja o código talvez seja uma possivel solução, sou meio leigo nessa interação por isso estas dúvidas... Se puder me ajudar ficarei bem grato, rsrs

Function oGetIEWindowFromTitle(sTitle As String, _
Optional bCaseSensitive As Boolean = False, _
Optional bExact As Boolean = False) As SHDocVw.InternetExplorer

Dim objShellWindows As New SHDocVw.ShellWindows
Dim found As Boolean
Dim startTime As Single

found = False
'Loop through shell windows
For Each oGetIEWindowFromTitle In objShellWindows
found = oGetIEWindowFromTitleHandler(oGetIEWindowFromTitle, sTitle, bCaseSensitive, bExact)
If found Then Exit For
Next

'Check whether a window was found
If Not found Then
Set oGetIEWindowFromTitle = Nothing
Else
pauseUntilIEReady oGetIEWindowFromTitle
End If

End Function

Private Function oGetIEWindowFromTitleHandler(win As SHDocVw.InternetExplorer, _
sTitle As String, _
bCaseSensitive As Boolean, _
bExact As Boolean) As Boolean

oGetIEWindowFromTitleHandler = False

On Error GoTo handler
'If the document is of type HTMLDocument, it is an IE window
If TypeName(win.Document) = "HTMLDocument" Then
'Check whether the title contains the passed title
If bExact Then
If (win.Document.title = sTitle) Or ((Not bCaseSensitive) And (LCase(sTitle) = LCase(win.Document.title))) Then oGetIEWindowFromTitleHandler = True
Else
If InStr(1, win.Document.title, sTitle) Or ((Not bCaseSensitive) And (InStr(1, LCase(win.Document.title), LCase(sTitle), vbTextCompare) <> 0)) Then oGetIEWindowFromTitleHandler = True
End If
End If
handler:
'We assume here that if an error is raised it's because
'the window is not of the correct type. Therefore we
'simply ignore it and carry on.

End Function

Devo chamar essa função desta forma:

Dim ie As SHDocVw.InternetExplorer
Dim doc As HTMLDocument 'If you have a reference to the HTML Object Library
'Dim doc as Object 'If you do not have a reference to the HTML Object Library

' Change the title here as required
Set ie = oGetIEWindowFromTitle("My popup window")
Set doc = ie.Document

Debug.Print doc.getElementsByTagName("body").Item(0).innerText