在Vb.net中,使用Web浏览器,我通常使用GetElementById
来解决例如按钮的问题。我知道有GetElementFromPoint
,我觉得极其费力。
当ID未知时,是否有更好,更简单的方法?
答案 0 :(得分:2)
看到这个问题时不时被问到,我会看看我是否无法一劳永逸地解决这个问题。以下是有关如何查找没有ID的元素的更广泛的指南:
您可以使用大量内置属性和方法来识别元素。最常见的包括:
HtmlElement.GetElementsByTagName()
方法。返回具有指定HTML标记的文档/元素中所有元素的集合。这可以在HtmlElement
上调用,也可以在HtmlDocument
本身调用。
方法。返回指定HtmlElement
上的特定属性的值。
性质。返回位于指定元素内的所有HTML代码(但不是元素本身的代码)。
性质。返回位于指定元素内的所有文本(从HTML代码中删除)。
性质。返回位于指定元素内的HTML代码,包括元素本身的代码。
这些方法和属性都可以以不同的方式用于识别元素,如下面的示例所示。
注意:我省略了HtmlElement.OuterText
因为它的行为有点奇怪,而且我不能100%确定它实际上做了什么。
以下是一组示例,说明如何使用前面提到的方法和属性来查找您正在寻找的元素。
要根据其 HTML code: 要定位的元素: VB.NET代码: 为了根据其中一个属性查找子元素,其中子元素位于父元素(具有ID)内,您只需要通过其ID获取父元素,然后迭代其所有子元素。 HTML code: 要定位的元素: VB.NET代码: 为了根据其中一个属性查找子元素,其中子元素位于父元素内( 不 具有ID)首先必须创建一个外部循环来查找父元素。然后,找到后,您可以开始迭代孩子。 HTML code: 要定位的元素: VB.NET代码: 根据 HTML code: 要定位的元素: VB.NET代码: 根据 HTML code: 要定位的元素: VB.NET代码: class
属性查找和元素,您必须迭代所有元素并检查每个元素上的GetAttribute("className")
。如果您事先知道元素类型(标记名称),则可以先使用HtmlDocument.GetElementsByTagName()
而不是HtmlDocument.All
获取该类型的所有元素的集合,从而缩小搜索范围。< / p>
<div class="header">
<div id="title" class="centerHelper">
<img id="logo" src="img/logo.png"/>
</div>
<p class="headerContent">
Hello World!
</p>
</div>
<p class="headerContent">
'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
根据属性查找元素,该元素位于另一个元素(带ID)
内
<select id="items" class="itemsList">
<option value="2">Apple</option>
<option value="3">Orange</option>
<option value="5">Banana</option>
</select>
<option value="5">Banana</option>
'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
根据位于另一个元素(无ID)
内的属性查找元素
<select class="itemsList">
<option value="2">Apple</option>
<option value="3">Orange</option>
<option value="5">Banana</option>
</select>
<option value="5">Banana</option>
'Outer loop, looking for the parent object.
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.
For Each OptionElement As HtmlElement In Element.GetElementsByTagName("option")
If OptionElement.GetAttribute("value") = "5" Then
'Found. Do something with 'OptionElement'...
Exit For 'Exit the inner loop.
End If
Next
Exit For 'Exit the outer loop.
End If
Next
根据
查找元素
InnerText
InnerText
查找元素并不比我们迄今为止所做的任何事情都难。您只需迭代所有元素(或指定标记的所有元素)并检查每个InnerText
属性。
<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>
<h2>Copyrighted material<h2>
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
根据
查找元素
InnerHtml
InnerHtml
查找元素的方式与基于InnerText
查看时的方式完全相同。只需迭代所有元素并检查每个InnerHtml
属性。
<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>
<p>All material (text, images, video, etc.) on this site are <b>copyrighted</b> to COMPANY NAME.</p>
'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
答案 1 :(得分:1)
您需要使用某种类型的选择器。
GetElementByID方法效果最好,因为如果HTML文件格式正确,那么应该只有一个元素具有该唯一ID。
GetElementFromPoint将根据文档的X,Y坐标返回一个元素,最好在Document的Click事件中使用。
GetElementByTagName名称将返回元素集合,如果您知道元素的标记类型,则会有效,例如<button>...</button>
或<p>...</p>
。为了帮助缩小所需的元素范围,您需要遍历返回的集合,并比较元素的属性,如果您通过InnerHTML属性知道它们各自的值或元素的文本。
最后一个也是效率最低的方法是All属性,它返回文档中的每个元素。之所以效率最低,是因为至少使用GetElementByTagName,您可以根据标记的名称缩小集合范围。
但是,我们假设您有以下标记:
<body>
<p>Look at my super complex HTML markup.</p>
<button>Click Me</button>
<button>No, click me!</button>
</body>
&#13;
然后,您可以获得标记为&#34; Click Me&#34;使用以下内容:
Dim click_me As HtmlElement = WebBrowser1.Document.GetElementByTagName("button").SingleOrDefault(Function(e) e.InnerHtml = "Click Me")