在网页上绕过日期选择器,使用VBA,执行onclick函数

问题描述 投票:0回答:2

我是一个完整的初学者,请多多包涵。

我正在使用VBA从我们的名册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控制台中执行这两个功能,它会根据需要更改日期,但返回的是'undefined'。当我从VBA调用它时,它会出现未定义的错误,并且不会更改日期。

'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
2个回答
0
投票

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

    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">

0
投票

我最终使用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")

我将获得用户输入以选择月份中的某天,如果需要滚动浏览月份,我将通过计算出当月的点击次数来完成。似乎很笨拙,但无论如何我可能是唯一使用它的人,至少它应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.