【问题标题】:Web Scraper won't fill in a child window that my VBA code launchesWeb Scraper 不会填充我的 VBA 代码启动的子窗口
【发布时间】:2015-09-03 23:22:31
【问题描述】:

我在 VBA 中有以下代码,它打开一个 IE 页面,填充它,然后单击一个打开一个新 IE 窗口的按钮。但是,我的代码无法填写新窗口的第一个下拉菜单。任何帮助将不胜感激。

Sub Van()
    Dim IE As Object
    Dim IE2 As Object

    Set IE = CreateObject("InternetExplorer.Application")
    'Set IE2 = CreateObject("InternetExplorer.Application")

    IE.navigate ("website")
    IE.Visible = True

    Do
        DoEvents
    Loop Until IE.readyState = 4

    Set d = IE.document

    'Code now clicks on buttons or dropdowns etc
    Application.Wait (Now + TimeValue("00:00:03"))

    Set IE2 = GetIE("pop-up page")

    WaitFor IE2

    'Tried this too
    'Application.Wait (Now + TimeValue("00:00:05"))
    IE2.document.getElementsByTagName("select")(0).Value = "X"

    'Also tried the line below
    'IE2.document.GetElementsbyname("name")(0).SelectedIndex = 1

End Sub

Function GetIE(sAddress As String) As Object

    Dim objShell As Object, objShellWindows As Object, o As Object
    Dim retVal As Object, sURL As String

    Set retVal = Nothing
    Set objShell = CreateObject("Shell.Application")
    Set objShellWindows = objShell.Windows

    'see if IE is already open
    For Each o In objShellWindows
        sURL = ""
        On Error Resume Next
        sURL = o.LocationURL
        On Error GoTo 0
        If sURL <> "" Then
            'MsgBox sURL
            If sURL = sAddress Then
                Set retVal = o
                Exit For
            End If
        End If
    Next o

    Set GetIE = retVal
End Function

Sub WaitFor(IE)
    Do
        DoEvents
    Loop Until IE.readyState = 4
End Sub

【问题讨论】:

  • 您传递给GetIE 的URL 中的? 后面真的有这些空格吗?
  • 不,抱歉,这只是我错误地复制到这里的方式 - 我会编辑它

标签: vba bots scraper


【解决方案1】:

当您尝试访问选择时,弹出窗口中的页面可能未完全加载 - 尝试添加等待循环,直到加载完成。我喜欢将“等待”循环拉到一个可重用的函数中:

Set IE2 = GetIE("https://secure.apia.com.au/NASApp/apia/CRQuoteServlet?" & _
                "pageAction=openModelSelectionWindow&currentSequenceNumber=")

WaitFor IE2

IE2.document.getElementsByTagName("select")(0).Value = "JAY"

等待:

Sub WaitFor(IE)
    Do
        DoEvents
    Loop Until IE.readystate = 4
End sub

【讨论】:

  • 谢谢蒂姆 - 由于某种原因它仍然无法正常工作。我已经修改了我的代码(请参阅我已编辑的原始帖子)。我也刚刚尝试过使用我通常的、不太优雅的Application.Wait (Now + TimeValue("00:00:05")) 延迟类型,但这似乎也不起作用。删除评论后,MsgBox 'MsgBox sURL 确实会显示正确的 URL,因此看起来该函数的代码至少在该点上运行良好(因此该函数在此之后可能“无法”执行任何操作,因此延迟还是等待时间有点多余)?
  • 此时,如果我“取消注释” MsgBox,我只会在 MsgBox 中获取弹出窗口的 URL。单击“确定”后,没有其他反应。如果我再把MsgBox注释掉,还是照常生成弹窗,下拉不填,不报错。
  • 没有什么我可以建议的 - 它对我来说是发布的(刚刚重新测试)。您必须进行一些调试。
  • 这真的很奇怪 - 出于某种原因,它可以在我的笔记本电脑上运行。我不知道是不是因为我的台式电脑有两台显示器,而新窗口会在第二台显示器上弹出,或者是因为我更改了新标签设置以在新窗口中打开标签但没有t 重新启动我的台式电脑。非常感谢蒂姆!现在我可以看到隧道尽头的光了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多