【发布时间】:2020-08-31 20:25:32
【问题描述】:
仍然在抓取网站,从网页打印等掠夺,但遇到了一个障碍,我希望有人能帮助我。下图显示了我想激活的选项卡,我有代码可以让我直接到达那里,但无法激活该选项卡。虽然最后一行代码可以在我的台式电脑上运行,但我无法让它在我的其他电脑上运行。我可能可以将 IE 并置在另一台 PC 上以使其工作,但我知道我只是识别错误的元素,如果我正确地做它应该一直工作,而不必弄乱 IE 设置。
在不同的浏览器上使用 Selenium,我能够确定该选项卡的标识如下::
css=#ext-gen42 .x-tab-strip-text
xpath=//a[@id='ext-gen42']/em/span/span
xpath=//div[3]/div/div/div/div/div/ul/li[2]/a[2]/em/span/span
我的代码在这里:
Private Sub TriggerEvent(htmlDocument As Object, htmlElementWithEvent As Object, eventType As String)
Dim theEvent As Object
htmlElementWithEvent.Focus
Set theEvent = htmlDocument.createEvent("HTMLEvents")
theEvent.initEvent eventType, True, False
htmlElementWithEvent.dispatchEvent theEvent
End Sub
Sub Oasis_Test()
LocnAddr = "1 park Ave"
LocnBoro = "Manhattan"
Dim IE As Object
Dim htmlDoc As Object
Dim Field1 As Object
Dim Field2 As Object
Dim Field3 As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate "http://www.oasisnyc.net/map.aspx"
Do Until IE.readyState = 4: DoEvents: Loop
Application.Wait (Now + TimeSerial(0, 0, 3))
'ShowWindow IE.hWnd, SW_SHOWMAXIMIZED ' off for test purposes
Set htmlDoc = IE.document
On Error Resume Next
Set Field1 = htmlDoc.getElementById("ext-comp-1076")
On Error GoTo 0
Call TriggerEvent(htmlDoc, Field1, "compositionstart")
Field1.value = LocnAddr
Call TriggerEvent(htmlDoc, Field1, "compositionend")
Application.Wait (Now + TimeSerial(0, 0, 2))
' there's probably a better way to do this drop-down but this works
Set Field2 = htmlDoc.getElementById("ext-comp-1078")
Call TriggerEvent(htmlDoc, Field2, "compositionstart")
Field2.value = LocnBoro
Call TriggerEvent(htmlDoc, Field2, "compositionend")
Application.SendKeys "{TAB}"
Application.Wait (Now + TimeSerial(0, 0, 2))
htmlDoc.getElementById("ext-gen118").Click
Application.Wait (Now + TimeSerial(0, 0, 2))
' I don't get an error on the next line and it actually works on my desktop
' but can't get it to work anywhere else.
htmlDoc.getElementById("ext-gen42").Click
Application.Wait (Now + TimeSerial(0, 0, 2))
htmlDoc.getElementById("ext-gen44").Click
Application.Wait (Now + TimeSerial(0, 0, 2))
htmlDoc.getElementById("ext-gen46").Click
Application.Wait (Now + TimeSerial(0, 0, 2))
htmlDoc.getElementById("ext-gen42").Click '##### NG ######
End Sub
所以我的问题是识别“ext-gen42”元素的正确方法是什么,以便我可以单击或按下它以显示该选项卡,以便我可以从中刮取信息? 我相信我会在继续的过程中遇到更多的“css”元素(或其他任何元素),因此我们将不胜感激。
【问题讨论】:
-
我认为您的代码基于我的这个答案。 stackoverflow.com/questions/63294113/… 但是您会犯一些错误,因为您不了解我认为的代码是如何工作的。例如。您的地址字段没有
compositionstart和compositionend事件。 -
查看链接答案中的屏幕截图,然后查看哪些事件可用于您需要的元素。我没有测试必须触发哪些事件才能执行您想要的操作。但是选项卡有一个
mousover事件,所有选项卡一起都有一个mousedown事件。我认为您需要同时切换选项卡。或许我以后有时间再看一看。 -
是的。我确实使用了您在另一个网站的其他答案中给我的代码,我真的很感激并从中学到了很多东西。我最初无法让那个“boro”下拉菜单在这个上工作,所以我尝试了你的作文开始/结束,它确实有效。我刚刚用 {TAB} 替换了它,它可以在没有 comp 开始/结束的情况下工作。不知道为什么,但我仍在学习。那个“ext-gen42”是这个代码给我带来问题的原因,这就是我发布这个问题的原因。于舟似乎想出了一种新颖的方法来解决这个问题,并让我到达我需要的地方,我很感谢他。
标签: excel vba internet-explorer ie-automation