【问题标题】:Bypassing date picker on webpage, executing onclick function绕过网页上的日期选择器,执行 onclick 功能
【发布时间】:2020-02-22 19:19:42
【问题描述】:

我想将我们名册 web 应用程序中的 Excel 报告转换为 ics 日历事件。

我想使用 VBA 登录并通过选择开始日期和结束日期导出名册。
使用日期选择器更改开始和结束日期字段(无法输入框)。我尝试使用getElementbyId 更改它们。

编辑:我无法弄清楚如何使用 ID 传递新日期。我想单击日历图标以启动日期选择器,但该按钮没有 ID,并且使用 getElementsbyTagName 证明是一场噩梦,因为有这么多条目,都没有 ID。
所以我现在正在尝试执行 onclick (toggleCalendarShow()) 发生的代码

<TD vAlign=middle><IMG onclick=ctl00xContentPlaceHolder1xtxtstartdateClass.toggleCalendarShow() style="CURSOR: pointer" src="/WebResource.axd?d=isQhimlyp5Th1A7pbrVSPZZmakOc3oiCW_ZfNR9fV1S7PA1gESOWQyDsbZ8jC0DpnrCaO5u8n1xsrNzdQvzMJOpZADHN1t7AN4GTQ-viIM4F0-SAccLr5VyKvi3HXEYZ12VD3X7VI7eXCnCANJFULkTRI3M1&amp;t=633521043060000000"></TD>

我可以在 Internet Explorer 控制台中执行这两个函数,它会根据需要更改日期,但它会返回“未定义”。
当我从 VBA 调用它时,它会出现错误 undefined 并且不会更改日期。

'Select Show Hours
IE.document.GetElementById("ContentPlaceHolder1_Select_ShowHours").Checked = True

'Select Staff as "Me Only"
IE.document.GetElementById("ContentPlaceHolder1_Select_Staff").Value = "999"

ie.document.all.Item
Call ie.document.parentWindow.execScript("ct100xContentPlaceHolder1xtxtstartdateClass.toggleCalendarShow();", "JavaScript")
Call ie.document.parentWindow.execScript("ctl00xContentPlaceHolder1xtxtstartdateClass.selectDate ((15));", "JavaScript")

'Run Report
IE.document.GetElementById("ContentPlaceHolder1_btnReport").Click
Do Until Not IE.Busy And IE.readyState = 4
    DoEvents
Loop

【问题讨论】:

    标签: html excel vba internet-explorer browser-automation


    【解决方案1】:

    从截图中,我们可以看到 Date 文本框使用了readonly 属性,在使用VBA 脚本找到这个元素并在其中写入值之前,我们需要删除readonly 属性。然后,使用Application.SendKeys 方法将值发送到日期文本框。更多详细信息,请参考以下示例代码:

        Set startDateText = IE.document.getElementbyId("startdate")
    
        'remove the readonly attribute.
        startDateText.removeAttribute ("readonly")
        startDateText.Focus
    
        'using sendkeys method to enter the date.         
        Application.SendKeys "10/21/2019", True
    
        'Waiting the date value enters (3 second) 
        Application.Wait (Now + TimeValue("0:00:03"))
    
        Set endDateText = IE.document.getElementbyId("enddate")
        endDateText.Focus        
        Application.SendKeys "10/28/2019", True 
        Application.Wait (Now + TimeValue("0:00:03"))
    
        IE.document.all("startdate").Click
    

    Html 资源如下:

    Start Date: <input type="text" id="startdate" name="startdate" value="" readOnly = "readonly" class="form-control" size="30">   
    End Date: <input type="text" id="enddate" name="enddate" value="" class="form-control" size="30">
    

    【讨论】:

    • 无法输入开始和结束日期框。我尝试了这个解决方案,我得到“对象变量或未设置块变量”。我使用了所附屏幕截图中显示的 ID。
    【解决方案2】:

    我最终使用 queryselector 来查找对应于开始和结束日期日历切换的 onclick 事件。

    Dim doc As HTMLDocument
    'Click Calendar icon
    Set doc = ie.document
    doc.querySelector("img[onclick='ctl00xContentPlaceHolder1xtxtstartdateClass.toggleCalendarShow()']").Click
    Call ie.document.parentWindow.execScript("ctl00xContentPlaceHolder1xtxtstartdateClass.selectDate ((12));", "JavaScript")
    
    doc.querySelector("img[onclick='ctl00xContentPlaceHolder1xtxtenddateClass.toggleCalendarShow()']").Click
    Call ie.document.parentWindow.execScript("ctl00xContentPlaceHolder1xtxtenddateClass.selectDate ((02));", "JavaScript")
    

    我将获取用户输入来选择月份中的哪一天,如果需要滚动查看月份,我将通过计算当前月份的点击次数来做到这一点。它看起来很笨重,但无论如何我可能是唯一一个使用它的人,至少它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 2017-02-25
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多