Обход выбора даты на веб-странице, использование VBA, выполнение функции onclick - PullRequest
0 голосов
/ 27 октября 2019

Я начинающий, так что терпите меня.

Я использую VBA, чтобы взять отчет Excel из нашего веб-приложения и преобразовать его в события календаря ics. Сейчас у меня есть пошаговый процесс вручную, поэтому я хотел бы автоматизировать его, используя vba, чтобы войти в систему и экспортировать список, выбрав даты начала и окончания. Поля даты начала и окончания можно изменить только с помощью средства выбора даты (поля не могут быть введены), и я пытался изменить их с помощью getElementbyId, но это не сработало.

РЕДАКТИРОВАТЬ: Я не смог выяснить, как передать новую дату, используя Id. Я хотел бы щелкнуть значок календаря, чтобы запустить средство выбора даты, но кнопка не имеет идентификатора, а использование getElementsbyTagName доказывает, что существует кошмар, поскольку существует так много записей, и все без идентификаторов. Поэтому я сейчас пытаюсь выполнить код, который происходит с 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

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Я закончил тем, что использовал 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")

Я получу пользовательский ввод, чтобы выбрать день месяца, и, если необходимо,прокручивая месяцы, я сделаю это, выяснив, сколько кликов за текущий месяц. Это кажется неуклюжим, но, вероятно, я буду единственным, кто использует это в любом случае, и, по крайней мере, это должно работать.

0 голосов
/ 28 октября 2019

Из скриншота видно, что в текстовом поле Дата, использующем атрибут readonly, перед использованием сценария 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">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...