VBA单击具有不同跨度内文的按钮

时间:2018-08-14 15:26:49

标签: excel vba excel-vba web-scraping

我不知道如何单击下面html中的按钮

<button class="dt-button buttons-collection buttons-colvis" tabindex="0" aria-controls="theDataTable" aria-haspopup="true" title="Choose columns to display from a list">
<span>Show/Hide Columns</span>

我尝试过:

Set goBtn = ie.document.querySelector("dt-button buttons-collection buttons-colvis")
 goBtn.Click
 For Each ele In ie.document.getElementsByTagName("button")
    If InStr(ele.innerText, "Status") > 0 Then ele.Click
 Next

我也不确定如何单击

<button class="dt-button buttons-columnVisibility active" tabindex="0" aria-controls="theDataTable">
<span>Status</span></button>
<button class="dt-button buttons-columnVisibility active" tabindex="0" aria-controls="theDataTable">
<span>Conditions</span></button>

我尝试过:

 Set goBtn = ie.document.querySelector("dt-button buttons-columnVisibility active").innerText("Status")
 goBtn.Click
 ie.document.getElementById("save-list-link").Click

两者都给我一个运行时错误

1 个答案:

答案 0 :(得分:1)

在类名中不能有空格。


对于您的第一个查询:

ie.document.querySelector("dt-button.buttons-collection.buttons-colvis").Click

在此处查看查询:

css query

这假定它是您所追求的具有该类名称的第一个元素。否则,您需要使用.querySelectorAll并索引到返回的nodeList中,以获取所需的商品,例如

ie.document.querySelectorAll("dt-button.buttons-collection.buttons-colvis").item(1).Click '<==random example.

与第二个查询的想法相同:

.dt-button.buttons-columnVisibility.active

这次,您知道有多个匹配的元素,因此您使用.querySelectorAll并索引到nodeList

ie.document.querySelectorAll(".dt-button.buttons-columnVisibility.active").item(0).Click '<==status.
ie.document.querySelectorAll(".dt-button.buttons-columnVisibility.active").item(1).Click '<==conditions.

CSS查询:

query

您需要检查这些是您整个HTML文档的正确索引。


未找到元素:

您需要先确保页面已加载,然后再尝试选择

While ie.Busy Or ie.readyState < 4: DoEvents: Wend

在初始URL导航之后。对于加载速度较慢的页面,您可能需要额外的循环,直到设置了元素为止,并设置超时以避免无限循环。

如果仍然找不到该元素,请查看您要选择的元素是否在带有form/frame/iframe标签的父元素中。如果是这样,请更新显示的html以包含此/这些内容,因为也需要对其进行导航才能设置该元素。


显示/隐藏列和选项:

您可以单击“显示隐藏”,如下所示,然后列出选项并选择一个特定的选项,如下所示:

Option Explicit
Public Sub ClickShowHide()
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    With IE
        .navigate "https://clinicaltrials.gov/ct2/results?cond=&term=&type=Intr&rslt=&recrs=b&recrs=a&age_v=&age=1&gndr=&intr=&titles=&outc=&spons=&lead=&id=&cntry=&state=&city=&dist=&locn=&phase=0&phase=1&phase=2&fund=2&strd_s=&strd_e=&prcd_s=&prcd_e=&sfpd_s=&sfpd_e=&lupd_s=&lupd_e=&sort="
        .Visible = True
        While .Busy Or .readyState < 4: DoEvents: Wend

        .document.querySelector("button[title='Choose columns to display from a list']").Click

        Dim optionsList As Object, i As Long
        Set optionsList = .document.querySelectorAll("button[aria-controls='theDataTable']")

        For i = 1 To optionsList.Length - 1
            Debug.Print optionsList.item(i).innerText
        Next

        optionsList.item(1).Click '<==select a partic option
       '.Quit
    End With
End Sub