绕过网页上的日期选择器,执行onclick函数
Bypassing date picker on webpage, executing onclick function
我想将来自我们名册网络应用程序的 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&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
从截图中我们可以看到日期文本框使用了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">
我最终使用 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")
我将让用户输入以选择每月的日期,如果需要滚动浏览月份,我将通过计算当月的点击次数来做到这一点。它看起来很笨重,但无论如何我可能是唯一一个使用它的人,至少它应该可以工作。
我想将来自我们名册网络应用程序的 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&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
从截图中我们可以看到日期文本框使用了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">
我最终使用 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")
我将让用户输入以选择每月的日期,如果需要滚动浏览月份,我将通过计算当月的点击次数来做到这一点。它看起来很笨重,但无论如何我可能是唯一一个使用它的人,至少它应该可以工作。