【问题标题】:How to fill in html autocomplete fields using vba?如何使用 vba 填写 html 自动完成字段?
【发布时间】:2019-01-09 09:38:28
【问题描述】:

我正在编写一个将数据输入在线计算器并获得计算结果的宏

链接:https://www.icao.int/environmental-protection/CarbonOffset/Pages/default.aspx

我正在尝试在网站中填写“来自城市/机场”的值。

这是我的代码:

Sub get_CO2()
 Dim ie As Object
  Set ie = New InternetExplorerMedium
  ie.Navigate "https://applications.icao.int/icec"
  Do While ie.ReadyState <> 4: DoEvents: Loop
  ie.Visible = True
  With ie.Document
      .getElementById("passengerNo").Value = 7
      .getElementById("select1").selectedIndex = 1
      .getElementById("select2").selectedIndex = 1
      ' .getElementByName("frm1").Value = "XXX"
      ' .getElementByName("to1").Value = "XXX"
      .getElementById("computeByInput").Click
   End With
End Sub 

这是行不通的。它显示“对象不支持此属性或方法” 我该如何填写这种类型?我可以使用什么功能?如果不知道机场代码,是否可以输入国家名称并选择出现的第一个选项?

【问题讨论】:

    标签: html excel vba web-scraping


    【解决方案1】:

    我已经想出了如何用 vba 做到这一点。 编辑:请求完整代码

    iedoc.getElementsByName("frm1")(0).innerText = "somecountry"            ' enter string of country
    Set li_arr = iedoc.getElementById("ui-id-1").getElementsByTagName("li")
    Do While li_arr.Length = 0: DoEvents: Loop     ' wait for the drop down menu to come up
    li_arr(0).Click                                ' now click the first option
    

    【讨论】:

    • 那里做得很好+1。请记住,您可以在两天后接受自己的答案。作为一项安全措施,您可以考虑使用定时循环来避免潜在的无限循环。
    • 谢谢!我稍后会实现循环。
    【解决方案2】:

    如果使用浏览器,我会使用Selenium basic 自动化,因为它很容易触发与输入字段相关的事件。注意我直接使用 iframe src url 以避免必须导航包含表单的 iframe。安装 selenium 后,您需要确保最新的 Chrome 和 Chromedriver 与 chromedriver.exe 位于与 selenium 可执行文件相同的文件夹中。另外,转到 vbe > tools > references 并添加对 selenium 类型库的引用。

    我认为,也可以执行一系列 POST xmlhttp 请求,前提是您可以获取并传递正确的 cookie。

    下面的代码行

    .FindElementByCss("#ui-id-1 li.ui-menu-item")
    

    .FindElementByCss("#ui-id-2 li.ui-menu-item")
    

    选择下拉列表中的第一个列表元素。

    在您键入时,从 JSON 响应到 POST 请求不断生成下拉值。我已经一次性发送了整个所需的机场字符串,以确保第一项是所需的。

    Option Explicit
    Public Sub GetInfo()
        Dim d As WebDriver
        Set d = New ChromeDriver
        Const Url = "https://applications.icao.int/icec"
        With d
            .Start "Chrome"
            .get Url
            .FindElementByCss("[name=frm1]").SendKeys "AAD"
            .FindElementByCss("#ui-id-1 li.ui-menu-item").Click
            .FindElementByCss("[name=to1]").SendKeys "MGQ"
            .FindElementByCss("#ui-id-2 li.ui-menu-item").Click
            .FindElementById("computeByInput").Click
    
            Stop   'delete me later
            .Quit
        End With
    End Sub
    

    【讨论】:

    • 谢谢,它可以在我的电脑上运行!但是有什么方法可以在不使用外部库的情况下与下拉列表交互?我想在不安装新东西的情况下使宏可供其他用户使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多