【问题标题】:Click text input box based on id根据id点击文本输入框
【发布时间】:2020-02-18 21:56:46
【问题描述】:

我目前正在尝试根据其 id 单击以下文本输入框:VBA 中的 dp1571754895218

<input title="INVOICEDATE" class="half-filter hasDatepicker" id="dp1571754895218" style="margin-right: 2px; opacity: 1;" type="text" placeholder="From" data-bind="attr: { placeholder: 'From', title: $data.Key, 'data-tabgroup': 'itemlistfilter', 'data-tabgroupindex': ($index() + 1) }, datepicker: $data.Range.From, datepickerOptions: { dateFormat: $root.jQformatDate($data.Format) }, style: { 'opacity': $parent.multiSearchOn() ? '0.3' : '1' }" data-tabgroup="itemlistfilter" data-tabgroupindex="7">

到目前为止我尝试过的是:

Dim date1 As Object
Set html = ie.document
Set date1 = html.getElementById("dp1571754895218")
For Each l In date1
    If l.className = "half-filter hasDatepicker" Then
        l.Click
        Exit For
    End If
Next

但我不断收到以下错误:运行时错误“424”:需要对象。 我也已经有了正确的参考资料。我做错了什么?

编辑:对于 QHarr,这里是两个 html 代码 占位符 = 到:

&lt;input title="INVOICEDATE" class="half-filter hasDatepicker" id="dp1571841444746" style="opacity: 1;" type="text" placeholder="To" data-bind="attr: { placeholder: 'To', title: $data.Key, 'data-tabgroup': 'itemlistfilter', 'data-tabgroupindex': ($index() + 1.1) }, datepicker: $data.Range.To, datepickerOptions: { dateFormat: $root.jQformatDate($data.Format) }, style: { 'opacity': $parent.multiSearchOn() ? '0.3' : '1' }" data-tabgroup="itemlistfilter" data-tabgroupindex="7.1"&gt;

占位符 = 来自:

&lt;input title="INVOICEDATE" class="half-filter hasDatepicker" id="dp1571841444745" style="margin-right: 2px; opacity: 1;" type="text" placeholder="From" data-bind="attr: { placeholder: 'From', title: $data.Key, 'data-tabgroup': 'itemlistfilter', 'data-tabgroupindex': ($index() + 1) }, datepicker: $data.Range.From, datepickerOptions: { dateFormat: $root.jQformatDate($data.Format) }, style: { 'opacity': $parent.multiSearchOn() ? '0.3' : '1' }" data-tabgroup="itemlistfilter" data-tabgroupindex="7"&gt;

【问题讨论】:

  • 你在哪里得到错误?
  • 在“For each l In date1”行我得到错误

标签: javascript html vba web-scraping


【解决方案1】:

一些可能性(第一个是可能的罪魁祸首,然后列出了一些其他考虑因素):

1) getElementById 返回单个元素,因此您不会 For Each 结束。只需这样做:

html.getElementById("dp1571754895218").click

2) id 可能是动态的。然后尝试使用titleclass的组合

ie.document.querySelector("[title=INVOICEDATE].hasDatepicker").click

不需要循环

3) 您没有足够长的时间等待元素出现。对元素的存在使用适当的页面加载等待和定时循环

Public Sub test()
    Dim ie As New InternetExplorer, t As Date, ele As Object
    Const MAX_WAIT_SEC As Long = 10


    With ie
        .Visible = True
        .Navigate2 "url"

        While .Busy Or .readyState < 4: DoEvents: Wend
        t = Timer
        Do
            On Error Resume Next
            Set ele = .document.getElementById("dp1571754895218")
            On Error GoTo 0
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop While ele Is Nothing

        If ele Is Nothing Then Exit Sub

        ele.click

        Stop
        .Quit
    End With
End Sub

4) 您的元素位于需要首先导航的 frame/iframe


编辑:

试试:

ie.document.querySelector(".hasDatepicker[placeholder=To]").value = "ABC"
ie.document.querySelector(".hasDatepicker[placeholder=From]").value = "XYZ"

【讨论】:

  • 表示对象不支持“ele.click”行上的这个属性或方法
  • debug.print typename(ele) 的结果是什么?
  • 啊,所以我看了一下您的第二行代码,您对动态 id 的看法是正确的。但问题在于有 2 个日期选择器,一个是 $data.Range.From,另一个是 $data.Range.To。你知道我怎么区分这两者吗?因为您提供的第 3 个解决方案对我来说有点难以融入我的宏中。
  • 你能分享两者的 html 吗?通过edit使用sn-p工具正确插入html。
  • 我将两个 sn-ps 放在问题帖子中:D。我想做的是在这些区域中输入值。我想点击然后使用 Sendkeys (vba) 从 Excel 输入值,但是如果有一种方法可以直接输入这些值而无需点击,那也很棒。
猜你喜欢
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2022-01-12
相关资源
最近更新 更多