En Vb.net, con un navegador web, normalmente uso GetElementById para abordar, por ejemplo, un botón. Sé que hay GetElementFromPoint, que encuentro extremadamente laborioso.

¿Existe una forma mejor y más sencilla cuando se desconoce la identificación?

2
Cyrill 15 feb. 2018 a las 20:41

2 respuestas

La mejor respuesta

Deberá utilizar algún tipo de selector.

GetElementByID < El método / a> funciona mejor porque si el archivo HTML está formateado correctamente, solo debería haber un elemento con ese ID único.

GetElementFromPoint devolverá un elemento basado en las coordenadas X, Y del documento, esto se usa mejor en el evento Click del documento.

GetElementByTagName name devolverá una colección de elementos y funciona si conoce el tipo de etiqueta del elemento, como <button>...</button> o <p>...</p>. Para ayudar a delimitar qué elemento desea, deberá iterar a través de la colección devuelta y comparar los atributos del elemento si conoce sus valores respectivos o el texto del elemento a través de la propiedad InnerHTML.

El último método y el menos efectivo es el All propiedad que devuelve todos los elementos del documento. La razón por la que esto es menos efectivo es porque al menos con GetElementByTagName, puede reducir la colección en función del nombre de la etiqueta.

Sin embargo, supongamos que tiene el siguiente marcado:

<body>
  <p>Look at my super complex HTML markup.</p>
  <button>Click Me</button>
  <button>No, click me!</button>
</body>

A continuación, puede obtener la etiqueta del botón que dice "Haga clic en mí" mediante lo siguiente:

Dim click_me As HtmlElement = WebBrowser1.Document.GetElementByTagName("button").SingleOrDefault(Function(e) e.InnerHtml = "Click Me")
2
David 15 feb. 2018 a las 18:57

Dado que esta pregunta se hace de vez en cuando, veré si no puedo tratar de abordar esto de una vez por todas. Aquí hay una guía más extensa sobre cómo encontrar elementos que no tienen una identificación:

- Los basicos -

Hay muchas propiedades y métodos incorporados que puede utilizar para identificar un elemento. Los más comunes incluyen:

  • {{X0 }}

    Método. Devuelve una colección de todos los elementos del documento / elemento que tienen la etiqueta HTML especificada. Esto se puede llamar tanto en un HtmlElement como en el mismo HtmlDocument.

  • {{X0 }}

    Método. Devuelve el valor de un atributo específico en el HtmlElement especificado.

  • {{X0 }}

    Propiedad. Devuelve todo el código HTML ubicado dentro del elemento especificado (pero no el código del elemento en sí).

  • {{X0 }}

    Propiedad. Devuelve todo el texto (despojado del código HTML) ubicado dentro del elemento especificado.

  • {{X0 }}

    Propiedad. Devuelve el código HTML ubicado dentro del elemento especificado, incluido el código del propio elemento.

Todos estos métodos y propiedades se pueden utilizar de diferentes formas para identificar un elemento, como se ilustra en los ejemplos siguientes.

NOTA: omití HtmlElement.OuterText porque su comportamiento es un poco extraño y no estoy 100% seguro de lo que realmente hace.


- Ejemplos de búsqueda de elementos sin ID -

A continuación se muestra un conjunto de ejemplos de cómo puede utilizar los métodos y propiedades mencionados anteriormente para encontrar el elemento que está buscando.


Encontrar un elemento por su clase (-nombre)

Para encontrar un elemento basado en su atributo class, debe iterar todos los elementos y marcar GetAttribute("className") en cada uno. Si conoce el tipo de elemento (nombre de etiqueta) de antemano, puede limitar la búsqueda obteniendo primero una colección de todos los elementos de ese tipo usando HtmlDocument.GetElementsByTagName() en lugar de HtmlDocument.All.

Código HTML:

<div class="header">
    <div id="title" class="centerHelper">
        <img id="logo" src="img/logo.png"/>
    </div>
    <p class="headerContent">
        Hello World!
    </p>
</div>

Elemento para localizar:

<p class="headerContent">

Código VB.NET:

'Iterate all elements.
For Each Element As HtmlElement In WebBrowser1.Document.All
    If Element.GetAttribute("className") = "headerContent" Then
        'Found. Do something with 'Element'...
        Exit For 'Stop looping.
    End If
Next


Encontrar un elemento basado en un atributo, ubicado dentro de otro elemento (con ID)

Para encontrar un elemento secundario basado en uno de sus atributos, donde el elemento secundario se encuentra dentro de un elemento principal (que tiene una ID), simplemente necesita obtener el elemento principal por su ID y luego iterar todos sus elementos secundarios.

Código HTML:

<select id="items" class="itemsList">
    <option value="2">Apple</option>
    <option value="3">Orange</option>
    <option value="5">Banana</option>
</select>

Elemento para localizar:

<option value="5">Banana</option>

Código VB.NET:

'Iterate all children of the element with ID "items".
For Each Element As HtmlElement In WebBrowser1.Document.GetElementByID("items").Children
    If Element.getAttribute("value") = "5" Then
        'Found. Do something with 'Element'...
        Exit For 'Stop looping.
    End If
Next


Encontrar un elemento basado en un atributo, ubicado dentro de otro elemento (sin ID)

Para encontrar un elemento secundario en función de uno de sus atributos, donde el elemento secundario se encuentra dentro de un elemento principal (que no tiene un ID), primero debe crear bucle externo que busca el elemento parent . Luego, cuando lo encuentre, puede comenzar a iterar los elementos secundarios.

Código HTML:

<select class="itemsList">
    <option value="2">Apple</option>
    <option value="3">Orange</option>
    <option value="5">Banana</option>
</select>

Elemento para localizar:

<option value="5">Banana</option>

Código VB.NET:

'Variable keeping track of whether we found the element we're looking for or not.
Dim ElementFound As Boolean = False

'Outer loop, looking for the parent object (<select class="itemsList">).
For Each Element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("select") 'Iterate all <select> tags. You can use Document.All here as well.
    If Element.getAttribute("className") = "itemsList" Then

        'Parent found.
        'Inner loop, looking for the child element we want (<option value="5">Banana</option>).
        For Each OptionElement As HtmlElement In Element.GetElementsByTagName("option")
            If OptionElement.GetAttribute("value") = "5" Then
                'Found. Do something with 'OptionElement'...

                ElementFound = True
                Exit For 'Exit the inner loop.
            End If
        Next

        'Exit the outer loop if we found the element we're looking for.
        If ElementFound Then Exit For

    End If
Next


Encontrar un elemento basado en su InnerText

En algunos casos, el elemento que desea ubicar no tiene ningún atributo o simplemente es demasiado similar a muchos otros elementos del sitio. En este caso, si su contenido es siempre el mismo, puede identificarlo a través de sus propiedades InnerText o InnerHtml.

Código HTML:

<h1>Important information</h1>
<p>Please read this information through <b>carefully</b> before continuing.</p>

<h2>Copyrighted material<h2>
<p>All material (text, images, video, etc.) on this site are <b>copyrighted</b> to COMPANY NAME.</p>

Elemento para localizar:

<h2>Copyrighted material<h2>

Código VB.NET:

For Each Element As HtmlElement In WebBrowser.Document.All
    If Element.InnerText = "Copyrighted material" Then
        'Found. Do something with 'Element'...
        Exit For 'Stop looping.
    End If
Next


Encontrar un elemento basado en su InnerHtml

Encontrar un elemento basado en su InnerHtml funciona exactamente de la misma manera que cuando mira basado en su InnerText, aparte de eso, la cadena que está comprobando ahora también incluye código HTML.

Código HTML:

<h1>Important information</h1>
<p>Please read this information through <b>carefully</b> before continuing.</p>

<h2>Copyrighted material<h2>
<p>All material (text, images, video, etc.) on this site are <b>copyrighted</b> to COMPANY NAME.</p>

Elemento para localizar:

<p>All material (text, images, video, etc.) on this site are <b>copyrighted</b> to COMPANY NAME.</p>

Código VB.NET:

'Iterate all <p> tags.
For Each Element As HtmlElement In WebBrowser.Document.GetElementsByTagName("p")
    If Element.InnerHtml.Contains("<b>copyrighted</b>") Then
        'Found. Do something with 'Element'...
        Exit For 'Stop looping.
    End If
Next
2
Visual Vincent 27 nov. 2019 a las 07:02