Excel VBA IE 对象和使用下拉列表
Excel VBA IE Object and using dropdown list
我正在试验 Web 自动化,并在尝试使用下拉列表时遇到一些困难。
我的代码可以搜索公司名称并点击“开始”。在新页面上,我似乎找不到 select 代表下拉列表的元素组的正确代码。然后我想 select “100” 个条目,但我什至无法获取代表此列表的节点。
我一直在浏览 Whosebug 上的多个不同页面,这些页面讨论 CSS select 或查看教程,但这似乎也没有帮助。我要么最终什么也没抓到,要么我抓到的任何东西都不能使用 getElementsByTagName
方法,最终我试图深入到 td
和 select
节点。还不确定如何处理这些,但我什至无法抓住它们。想法?
(注意停止线只是我使用断点停止我的代码的一行)
CSS 帮助网站:https://www.w3schools.com/cssref/trysel.asp
代码:
Option Explicit
Sub test()
On Error GoTo ErrHandle
Dim ie As New InternetExplorer
Dim doc As New HTMLDocument
Dim ws As Worksheet
Dim stopLine As Integer
Dim oSearch As Object, oSearchButton As Object
Dim oForm As Object
Dim oSelect As Object
Dim list As Object
Set ws = ThisWorkbook.Worksheets("Sheet1")
ie.Visible = True
ie.navigate "https://www.sec.gov/edgar/searchedgar/companysearch.html"
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
Set doc = ie.Document
Set oSearch = doc.getElementById("companysearchform")
Set oSearchButton = oSearch.getElementsByTagName("input")(1)
Set oSearch = oSearch.getElementsByTagName("input")(0)
oSearch.Value = "Summit Midstream Partners, LP"
oSearchButton.Click
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
Set doc = ie.Document
Set list = doc.querySelectorAll("td select")
stopLine = 1
Exit Sub
ErrHandle:
MsgBox Err.Number & " - " & Err.Description, vbCritical
Exit Sub
End Sub
td select
将 return 一个节点,因此您只需要 querySelector
。该节点有一个 id,因此您也可以使用更快的 querySelector("#count")
来定位父节点 select
。要更改选项,您可以在父 select 上使用 SelectedIndex
,或者通过其 value
属性 querySelector("[value='100']").Selected = True
来定位子选项。然后,您可能需要附加并触发 change/onchange
htmlevent 到父级 select
以注册更改。
但是,我只是从当前页面中提取公司 CIK,然后使用以下格式将 count=100 参数连接到 url 和 .Navigate2
中:
https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0001549922&type=&dateb=&owner=include&count=100&search_text=
您可以提取 CIK,在初始搜索公司点击并等待页面加载后,使用:
Dim cik As String
cik = ie.document.querySelector("[name=CIK]").value
ie.Navigate2 "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=" & cik & "&type=&dateb=&owner=include&count=100&search_text="
鉴于有几个参数留空,您可以缩短为:
"https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=" & cik & "&owner=include&count=100"
如果您无法获得初始父元素 select,您可能需要一个定时循环,等待该元素在单击搜索按钮后出现。 Whosebug 答案中显示了一个示例 。
我正在试验 Web 自动化,并在尝试使用下拉列表时遇到一些困难。
我的代码可以搜索公司名称并点击“开始”。在新页面上,我似乎找不到 select 代表下拉列表的元素组的正确代码。然后我想 select “100” 个条目,但我什至无法获取代表此列表的节点。
我一直在浏览 Whosebug 上的多个不同页面,这些页面讨论 CSS select 或查看教程,但这似乎也没有帮助。我要么最终什么也没抓到,要么我抓到的任何东西都不能使用 getElementsByTagName
方法,最终我试图深入到 td
和 select
节点。还不确定如何处理这些,但我什至无法抓住它们。想法?
(注意停止线只是我使用断点停止我的代码的一行)
CSS 帮助网站:https://www.w3schools.com/cssref/trysel.asp
代码:
Option Explicit
Sub test()
On Error GoTo ErrHandle
Dim ie As New InternetExplorer
Dim doc As New HTMLDocument
Dim ws As Worksheet
Dim stopLine As Integer
Dim oSearch As Object, oSearchButton As Object
Dim oForm As Object
Dim oSelect As Object
Dim list As Object
Set ws = ThisWorkbook.Worksheets("Sheet1")
ie.Visible = True
ie.navigate "https://www.sec.gov/edgar/searchedgar/companysearch.html"
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
Set doc = ie.Document
Set oSearch = doc.getElementById("companysearchform")
Set oSearchButton = oSearch.getElementsByTagName("input")(1)
Set oSearch = oSearch.getElementsByTagName("input")(0)
oSearch.Value = "Summit Midstream Partners, LP"
oSearchButton.Click
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
Set doc = ie.Document
Set list = doc.querySelectorAll("td select")
stopLine = 1
Exit Sub
ErrHandle:
MsgBox Err.Number & " - " & Err.Description, vbCritical
Exit Sub
End Sub
td select
将 return 一个节点,因此您只需要 querySelector
。该节点有一个 id,因此您也可以使用更快的 querySelector("#count")
来定位父节点 select
。要更改选项,您可以在父 select 上使用 SelectedIndex
,或者通过其 value
属性 querySelector("[value='100']").Selected = True
来定位子选项。然后,您可能需要附加并触发 change/onchange
htmlevent 到父级 select
以注册更改。
但是,我只是从当前页面中提取公司 CIK,然后使用以下格式将 count=100 参数连接到 url 和 .Navigate2
中:
https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0001549922&type=&dateb=&owner=include&count=100&search_text=
您可以提取 CIK,在初始搜索公司点击并等待页面加载后,使用:
Dim cik As String
cik = ie.document.querySelector("[name=CIK]").value
ie.Navigate2 "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=" & cik & "&type=&dateb=&owner=include&count=100&search_text="
鉴于有几个参数留空,您可以缩短为:
"https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=" & cik & "&owner=include&count=100"
如果您无法获得初始父元素 select,您可能需要一个定时循环,等待该元素在单击搜索按钮后出现。 Whosebug 答案中显示了一个示例