在Vb.net,具有web浏览器,我通常使用GetElementById
来解决(例如按钮)。 我知道有GetElementFromPoint
,我觉得费力的极端。
有没有更好的,更简单的方法,当ID是未知的?
在Vb.net,具有web浏览器,我通常使用GetElementById
来解决(例如按钮)。 我知道有GetElementFromPoint
,我觉得费力的极端。
有没有更好的,更简单的方法,当ID是未知的?
You will need to use some type of selector.
The GetElementByID method works best because if the HTML file is formatted correctly then there should only be one element with that unique ID.
The GetElementFromPoint will return an element based on the X,Y coordinate of the document, this is best used in the Document's Click event.
The GetElementByTagName name will return a collection of elements and works if you know the tag type of the element, such as <button>...</button>
or <p>...</p>
. To help narrow down which element you want, you will need to then iterate through the returned collection and compare either the element's attributes if you know their respective values or the element's text via the InnerHTML property.
The last and least effective method is the All property which returns every element in the document. The reason why this is the least effective is because at least with GetElementByTagName, you can narrow down the collection based on the tag's name.
However, let's assume that you have the following markup:
<body>
<p>Look at my super complex HTML markup.</p>
<button>Click Me</button>
<button>No, click me!</button>
</body>
You could then get the button tag that says "Click Me" by using the following:
Dim click_me As HtmlElement = WebBrowser1.Document.GetElementByTagName("button").SingleOrDefault(Function(e) e.InnerHtml = "Click Me")
见此,因为这问题是问每一个现在,然后我会看看我能不能试图解决这个一劳永逸。 下面是关于如何找到没有一个ID元素更广泛的指导:
有很多内置的属性和方法,你可以为了识别元素使用。 最常见的包括:
HtmlElement.GetElementsByTagName()
方法。 返回的文档/元素具有指定的HTML标签的所有元素的集合。 这可以在一个被称为双方HtmlElement
也是对HtmlDocument
本身。
HtmlElement.GetAttribute()
方法。 返回位于指定特定属性的值HtmlElement
。
HtmlElement.InnerHtml
属性。 返回位于指定元素中所有的HTML代码(而不是元素本身的代码)。
HtmlElement.InnerText
属性。 返回位于指定元素中的所有文本(HTML从代码剥离)。
HtmlElement.OuterHtml
属性。 返回位于指定的元素内的HTML代码,包括用于元件本身的代码。
这些方法和属性都可以以不同的方式被用于识别一个元件中,通过下面的实施例所示。
注意:我省略HtmlElement.OuterText
,因为它的行为有点奇怪,我不是100%确定其实际作用。
以下是一组的,你可以如何使用前面提到的方法和属性,以找到您正在寻找的元素的例子。
要查找并根据其元素class
属性,你必须遍历所有元素,并检查GetAttribute("className")
上的每个。 如果您知道元素类型(标签名称)事先可以通过首先得到使用该类型的所有元素的集合缩小搜索范围HtmlDocument.GetElementsByTagName()
而不是HtmlDocument.All
。
HTML代码:
<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">
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
为了找到基于它的属性,在孩子所在的父元素内部(即有一个ID),你只需要通过其ID获取父元素,然后遍历所有的孩子中的一个子元素。
HTML代码:
<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>
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
为了找到基于它的属性,在孩子所在的父元素中的一个子元素(即不具有ID),您必须首先创建一个外环,看起来父元素。 然后,当发现你就可以开始迭代孩子。
HTML代码:
<select class="itemsList"> <option value="2">Apple</option> <option value="3">Orange</option> <option value="5">Banana</option> </select>
元素定位:
<option value="5">Banana</option>
VB.NET代码:
'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
属性。
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>
元素定位:
<h2>Copyrighted material<h2>
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
InnerHtml
查找基于其元素InnerHtml
作品完全相同的方式,当你根据它看起来相同InnerText
。 只需要遍历所有元素,并检查各的InnerHtml
属性。
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>
元素定位:
<p>All material (text, images, video, etc.) on this site are <b>copyrighted</b> to COMPANY NAME.</p>
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