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 respuestas
Deberá utilizar algún tipo de selector.
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")
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:
-
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 mismoHtmlDocument
. -
Método. Devuelve el valor de un atributo específico en el
HtmlElement
especificado. -
Propiedad. Devuelve todo el código HTML ubicado dentro del elemento especificado (pero no el código del elemento en sí).
-
Propiedad. Devuelve todo el texto (despojado del código HTML) ubicado dentro del elemento especificado.
-
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
Nuevas preguntas
vb.net
Visual Basic.NET (VB.NET) es un lenguaje de programación de computadoras orientado a objetos, multi-paradigmático, administrado y seguro. Junto con C # y F #, es uno de los principales lenguajes dirigidos a .NET Framework. VB.NET puede verse como una evolución de Visual Basic 6 (VB6) de Microsoft pero implementado en Microsoft .NET Framework. NO USE esta etiqueta para preguntas VB6, VBA o VBScript.