使用相同名称定位网页元素

时间:2017-02-07 04:29:39

标签: excel-vba vba excel

简短版本:

我需要一种方法来使用Excel的VBA脚本与一个页面上的下拉列表小部件进行交互,该页面上有许多这样的小部件,每个小部件都有相同的类名。

长版:

我正在尝试编写一个vba脚本,该脚本将提供指向以下站点的文档的链接:

https://support.industry.siemens.com/cs/products/6es7516-3an01-0ab0/cpu-1516-3-pn-dp-1mb-prog-5mb-data?pid=578298&mlfb=6ES7516-3AN01-0AB0&mfn=ps&lc=en-WW

上面的链接适用于单个产品。 显然,我希望脚本能够获得任何产品的文档。

我遇到的问题是我需要与嵌套列表进行交互,该列表嵌套在文档中。 我可以创建一个循环来定位页面中的列表:

'Dim NamePeek
Set ie = New InternetExplorer
ie.Visible = 1
ie.navigate "https://support.industry.siemens.com/cs/products/6es7516-3an01-0ab0/cpu-1516-3-pn-dp-1mb-prog-5mb-data?pid=578298&mlfb=6ES7516-3AN01-0AB0&mfn=ps&lc=en-WW"
Set Divs = ie.document.getElementsByTagName("div")
For Each Div In Divs
    'NamePeek = Div.className
    If Div.className = "productfilter mfn" Then
        Trigger01 = True
        Trigger02 = False
        Trigger03 = False
    End If
    If Div.className = "filtertitle" Then
        Trigger02 = True
        Trigger03 = False
    End If
    If Div.className = "dropdown" Then
        Trigger03 = True
    End If
    If Trigger01 And Trigger02 And Trigger03 Then
        'This is where the list I'd like to interact with is located.
        'Div.selectedIndex = 2
        Trigger01 = False
        Trigger02 = False
        Trigger03 = False
    End If
Next Div

我知道'Div.selectedIndex = 2不起作用,因为HTMLDivElement对象没有.selectedIndex方法可以将网站数据加载到Excel中。

我尝试使用一个简单的下拉菜单制作一个简单的测试网页,并使用以下内容成功与之互动:

Dim target As MSHTML.IHTMLSelectElement

Set ie = New InternetExplorer
ie.Visible = 1

ie.navigate "file:///C:/xxxxxx/dropdowntestwebsite.html"

Set target = ie.document.getElementById("DDList")
target.selectedIndex = 3

所以我想知道是否可以使用IHTMLSelectElement与西门子站点上的下拉列表进行交互,因为没有ID且IHTMLSelectElement对象不支持.getElement(s)ByTagName方法。

2 个答案:

答案 0 :(得分:0)

西门子网站看起来好像正在使用某种jquery插件来控制它的元素。小部件是一个插件吗?选择框不是硬编码的,因此您无法像简单的选择框那样控制它们,比如说

ie.getelementbyid("selectbox_div").selectedindex = 2.  

你必须找到删除并填充下拉列表的javascript命令,然后通过vba发出该命令,例如

Call IE.document.parentWindow.execScript("nameofFunctionHere()", "JavaScript") 

我在网站上遇到类似的问题,使用插件" Select2"用于下拉框。

答案 1 :(得分:0)

我花了几周时间尝试使用select2 dropin修复网页,所以我知道你正在经历什么。我不知道MSHTML不能使用getelementbyTagname。也许你应该尝试设置它。这是我用来控制开放网页的代码。当然,页面必须已在MSIE中打开,您必须至少知道文档标题的一部分。

以下代码将为您设置,然后您可以使用getElementByTagName。有时您可以获得所需的父元素作为parentsID.firschild ....

Sub getSiemensBrowserAlreadyOpen()

    Set objShell = CreateObject("Shell.Application")
    Set objAllWindows = objShell.Windows

    Boolean_indicator = False

    Do While Not Boolean_indicator
    For Each ow In objAllWindows
        If (InStr(1, ow, "Internet Explorer", vbTextCompare)) Then

            Set objIterator = CreateObject("Shell.Application")
            For x = 0 To objIterator.Windows.Count
                On Error Resume Next
                current_title = objIterator.Windows(x).Document.Title
                current_url = objIterator.Windows(x).Document.Location

                If InStr(1, current_title, "Industry Support Siemens") > 0 Then 'is this my webpage?
                    Set IE = objIterator.Windows(x)
                    MsgBox "IE was properly set"
                    GoTo startProcess
                     Boolean_indicator = True
                    Exit For
                End If
            Next x
        End If
        Set objIterator = Nothing
    Next ow
    Boolean_indicator = True
    Loop
    MsgBox "Webpage was not found."
    Exit Sub 
startProcess:
    Set myDoc = IE.Document

'****************************************
'   Your operative code here






'****************************************/
    Set objShell = Nothing
    Set myDoc = Nothing
    Set IE = Nothing
 End Sub