@CanalQb


VBA - Webbrowser - como clicar no botão HTML sem um nome?



CanalQb



Sempre crie uma frase de segurança única para jogos, Airdrops e qualquer outra coisa de origem desconhecida, em vez de usar sua carteira principal.



Inserir o post: 

Às vezes, você se vê na situação de precisar acionar um botão em uma página da internet, e o VBA ou VB simplesmente não possui uma referência de nome para executar o clique, como por exemplo:

HTML:

<input type="submit" value="Login" onclick="submitForm();">

VB:

objIE.document.getElementsByName("Login")(0).Click

Quando você declara, não há um atributo "name" no HTML para o elemento que você está tentando acessar. No entanto, você pode usar um seletor de CSS com o atributo = valor para direcionar os atributos presentes:

objIE.document.querySelector("[onclick='submitForm();']").click

A mesma ideia se aplica a:

objIE.document.querySelector("[value=Login]").click

Ou até mesmo:

objIE.document.querySelector("[type=submit]").click

Além disso, você pode enviar o formulário diretamente usando:

objIE.document.getElementsByTagName("form")(0).submit

Se houver mais de um elemento correspondente ao seletor de atributos, você pode usar o .querySelectorAll para recuperá-los e indexá-los no nodeList retornado, por exemplo:

objIE.document.querySelectorAll("[type=submit]").item(1).click

Onde "1" no exemplo acima seria o segundo botão correspondente. "2" seria o terceiro, e assim por diante.

Você também pode estar procurando por estas referências abaixo:

A parte do HTML onde está seu botão é a seguinte:

<td id="td">

<button type="button" id="botaoFlatConfirmar" onclick="if (critica('frmtela', 'True','', false,false, 'divparametro', this)) { consultar();; }" barraBotao="true" style="white-space: nowrap;background: buttonface url(/Apoio_SitarWeb/Includes/Interface/CoolBar/images/Confirmar.gif) 0px center no-repeat;  HEIGHT: 22px; FONT-FAMILY: Tahoma, Arial, Helvetica; FONT-SIZE: 8pt; FONT-COLOR: menutext; PADDING-LEFT: 12; MARGIN-LEFT: 0; " title="Confirmar">&nbsp;Confirmar&nbsp;</button>

</td>

Para efetuar o clique, você pode utilizar a propriedade ID (id="botaoFlatConfirmar") e, utilizando o xpath, fazer o clique.

Aqui está uma função que você pode colocar em um módulo e chamar, passando como parâmetro o xpath e também o id do elemento:

Public Function getXPathElement(sXPath As String, objElement As Object) As HTMLBaseElement

    Dim sXPathArray() As String

    Dim sNodeName As String

    Dim sNodeNameIndex As String

    Dim sRestOfXPath As String

    Dim lNodeIndex As Long

    Dim lCount As Long


    ' Split the xpath statement

    sXPathArray = Split(sXPath, "/")

    sNodeNameIndex = sXPathArray(1)

    If Not InStr(sNodeNameIndex, "[") > 0 Then

        sNodeName = sNodeNameIndex

        lNodeIndex = 1

    Else

        sXPathArray = Split(sNodeNameIndex, "[")

        sNodeName = sXPathArray(0)

        lNodeIndex = CLng(Left(sXPathArray(1), Len(sXPathArray(1)) - 1))

    End If

    sRestOfXPath = Right(sXPath, Len(sXPath) - (Len(sNodeNameIndex) + 1))


    Set getXPathElement = Nothing

    For lCount = 0 To objElement.ChildNodes().Length - 1

        If UCase(objElement.ChildNodes().Item(lCount).nodeName) = UCase(sNodeName) Then

            If lNodeIndex = 1 Then

                If sRestOfXPath = "" Then

                    Set getXPathElement = objElement.ChildNodes().Item(lCount)

                Else

                    Set getXPathElement = getXPathElement(sRestOfXPath, objElement.ChildNodes().Item(lCount))

                End If

            End If

            lNodeIndex = lNodeIndex - 1

        End If

    Next lCount

End Function

Aqui está como você pode usá-la:

Set ele = getXPathElement("/table/tbody[3]/tr[1]/td[2]/input[1]", HTMLDoc.getElementById("botaoFlatConfirmar"))

 If Len(ele) > 0 Then

  ele.Click

 End If

Neste exemplo, você informa o xpath do objeto

 (getXPathElement("/table/tbody[3]/tr[1]/td[2]/input[1]")) e o ID do elemento a ser acessado (HTMLDoc.getElementById("botaoFlatConfirmar")). 

Certifique-se de verificar o xpath corretamente. O ID já foi fornecido para você.