Vb.net 是否有可能在没有ID的网站上寻址元素?

Vb.net 是否有可能在没有ID的网站上寻址元素?,vb.net,webbrowser-control,Vb.net,Webbrowser Control,在Vb.net中,对于Webbrowser,我通常使用GetElementById来寻址,例如一个按钮。我知道有一个GetElementFromPoint,我觉得它非常费劲 当ID未知时,有没有更好、更简单的方法?您需要使用某种类型的选择器 该方法工作得最好,因为如果HTML文件格式正确,那么应该只有一个元素具有该唯一ID 将基于文档的X、Y坐标返回元素,这最好用于文档的单击事件 如果您知道元素的标记类型,例如。。。或…。为了帮助缩小所需元素的范围,您需要遍历返回的集合,并比较元素的属性(如果您

在Vb.net中,对于Webbrowser,我通常使用GetElementById来寻址,例如一个按钮。我知道有一个GetElementFromPoint,我觉得它非常费劲


当ID未知时,有没有更好、更简单的方法?

您需要使用某种类型的选择器

该方法工作得最好,因为如果HTML文件格式正确,那么应该只有一个元素具有该唯一ID

将基于文档的X、Y坐标返回元素,这最好用于文档的单击事件

如果您知道元素的标记类型,例如。。。或…

。为了帮助缩小所需元素的范围,您需要遍历返回的集合,并比较元素的属性(如果您知道它们各自的值),或者通过InnerHTML属性比较元素的文本

最后一个也是最不有效的方法是返回文档中每个元素的属性。这一效果最差的原因是,至少使用GetElementByTagName,您可以根据标记的名称缩小集合的范围

但是,我们假设您具有以下标记:

看看我的超复杂HTML标记

点击我 不,点击我!
鉴于这个问题时不时被问到,我会看看我是否能一劳永逸地解决这个问题。以下是关于如何查找没有ID的元素的更广泛的指南:

-基础- 可以使用许多内置属性和方法来标识元素。最常见的有:

方法。返回文档/元素中具有指定HTML标记的所有元素的集合。这既可以在HtmlElement上调用,也可以在HtmlDocument本身上调用

方法。返回指定HtmlElement上特定属性的值

财产。返回位于指定元素内的所有HTML代码,但不返回元素本身的代码

财产。返回从位于指定元素内的HTML代码中剥离的所有文本

财产。返回位于指定元素内部的HTML代码,包括元素本身的代码

这些方法和属性都可以以不同的方式用于标识元素,如下例所示

注意:我省略了HtmlElement.OuterText,因为它的行为有点奇怪,我不能100%确定它实际上做了什么

-查找没有ID的元素的示例- 下面是一组示例,说明如何使用前面提到的方法和属性来查找要查找的元素

通过元素的类名查找元素 要根据其类属性查找和元素,必须迭代所有元素并检查每个元素上的GetAttributeclassName。如果您事先知道元素类型标记名,则可以先使用HtmlDocument.GetElementsByTagName而不是HtmlDocument.all获取该类型所有元素的集合,从而缩小搜索范围

HTML代码:

你好,世界!

要定位的元素:

VB.NET代码:

基于位于另一个ID为的元素内的属性查找元素 为了根据子元素的一个属性查找子元素,如果子元素位于具有ID的父元素中,则只需通过其ID获取父元素,然后迭代其所有子元素

HTML代码:

苹果 橙色 香蕉 要定位的元素:

香蕉 VB.NET代码:

基于属性查找元素,该属性位于另一个没有ID的元素内 若要根据子元素的属性之一查找子元素,其中子元素位于没有ID的父元素内,则必须首先创建一个查找父元素的外部循环。然后,当找到时,可以开始迭代子对象

HTML代码:

苹果 橙色 香蕉 要定位的元素:

香蕉 VB.NET代码:

要定位的元素:

版权材料 VB.NET代码:

基于其内部HTML查找元素 基于其InnerHtml查找元素的工作方式与基于其InnerText查找元素的工作方式完全相同,只是您现在检查的字符串还包含HTML代码

HTML代码:

重要信息 继续之前,请仔细阅读此信息

版权材料 本网站上的所有材料文本、图像、视频等版权归公司所有

要定位的元素:

本网站上的所有材料文本、图像、视频等版权归公司所有

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
'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
'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
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
'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