Выбор / действие элементов в виджетах Kendo UI с использованием Excel VBA

Застрял – нужна помощь!

Я пытаюсь автоматизировать действия элементов на веб-странице IE на нашем внутреннем сайте компании. Я могу заполнить любой текстовый объект , нажать кнопку отправки и т. Д., Но несколько элементов находятся либо в таблице / таблице (сетке Kendo), либо в выпадающем списке. Я просто не могу понять, как выбрать из этих сеток / таблиц или выпадающих списков.

Я пробовал все, что мог, без толку. Я использовал getElementById() , getElementsByTagName() , getElementsByName() и даже некоторые методы веб-скрепок.

К сожалению, поскольку веб-страница находится на внутреннем сайте, никто другой не сможет протестировать ее.

Это основная часть моего кода

  'After opening the web page, inserting a number, selecting the "search" ' (all from the VBA script), I have to use a "mousemove", "mousedown" and ' "mouseup" to select the item, whick is what the "myClick" subroutine does myClick '<<< THIS IS WHAT I WANT TO GET RID OF >>> 'I left the following segment in to show that I'm able to do several other functions myDocs = ie.Document.getElementById("DispatchComments").Value If myInfo = True Then ie.Document.getElementById("DispatchComments").Value = "__" & myCell5 & "__" & myDocs Else: End If 'IF ESTIMATED TIME IS LESS THAN 0, ENTER 120 - Enter estimated time If ie.Document.getElementById("TotalEstimatedTime").Value < 10 Then ie.Document.getElementById("TotalEstimatedTime").Value = 120 Else: End If End With End Sub 

`

Это снимок экрана после ввода номера аренды и нажатия кнопки поиска. Единственный способ, которым мне удалось выбрать строку, – это программно щелкнуть мышью в одной из трех выделенных областей белого фона. Мой код использует mousemove и координаты, чтобы выбрать строку, прокрутите вниз до выпадающего списка и нажмите его, чтобы я мог вручную выбрать номер цистерны.

Эта часть кода – это то место, где я застрял

 Set myChoice1 = ie.Document.getElementById("drgdLease").getElementsByTagName("tr")(1) With myChoice1 .getElementsByTagName("td")(0).Focus '<<---Works all the way to here .FireEvent ("onmouseover") '<<---No errors from this point on .FireEvent ("onmousedown") 'but doesn't do anything .FireEvent ("onmouseup") .FireEvent ("onclick") '<<---some other things tried .FireEvent ("ondblclick") .FireEvent ("onselect") td.innerText = value td.innerHTML = value End With '<tr role="row" data-uid="db62d811-4337-477c-a0fd-0e9e036670bb"> ' <td role="gridcell">998262</td> '<<---This is the info/row I need to select ' <td role="gridcell">HENDERSON (SMACKOVER) STORAGE</td> ' <td role="gridcell">ORYAN OIL &amp; GAS</td> 

Проверка элемента для области, которую я пытаюсь выбрать, показывает этот HTML-код.

  name="Result"> <div class="k-widget k-grid" id="drgdLease" style="-ms-touch-action: double-tap-zoom pinch-zoom;" data-role="grid"> <table class="k-selectable" role="grid" style="-ms-touch-action: double-tap-zoom pinch-zoom;" data-role="selectable"> <colgroup> <col> <col> <col> </colgroup> <thead class="k-grid-header" role="rowgroup"> <tr role="row"> <th class="k-header k-with-icon" scope="col" data-title="Lease Number" data-index="0" data-field="LeaseCode" data-role="columnsorter"> <a tabindex="-1" class="k-header-column-menu" href="#"> <span class="k-icon ki-arrowhead-s"></span> </a> <a class="k-link" href="/LeaseProfiles/GetLeasesSearch?Length=9&amp;drgdLease-sort=LeaseCode-asc">Lease Number</a> </th> <th class="k-header k-with-icon" scope="col" data-title="Lease Name" data-index="1" data-field="LeaseName" data-role="columnsorter"> <a tabindex="-1" class="k-header-column-menu" href="#"> <span class="k-icon ki-arrowhead-s"></span> </a> <a class="k-link" href="/LeaseProfiles/GetLeasesSearch?Length=9&amp;drgdLease-sort=LeaseName-asc">Lease Name</a> </th> <th class="k-header k-with-icon" scope="col" data-title="Lease Operator" data-index="2" data-field="LeaseOperator.OperatorName" data-role="columnsorter"> <a tabindex="-1" class="k-header-column-menu" href="#"> <span class="k-icon ki-arrowhead-s"></span> </a> <a class="k-link" href="/LeaseProfiles/GetLeasesSearch?Length=9&amp;drgdLease-sort=LeaseOperator.OperatorName-asc">Lease Operator</a> </th> </tr> </thead> <!-- This is what the code looks like before selecting the item. ie: before clicking anywhere on the row. --> <tbody role="rowgroup"> <tr role="row" data-uid="db62d811-4337-477c-a0fd-0e9e036670bb"> <td role="gridcell">998262</td> <td role="gridcell">HENDERSON (SMACKOVER) STORAGE</td> <td role="gridcell">ORYAN OIL &amp; GAS</td> </tr> </tbody> </table> <!-- This is what the code changes to after clicking the row. Note the class and arial are added on the `tr role` line, which may be binding the data. --> <tr role="row" data-uid="db62d811-4337-477c-a0fd-0e9e036670bb" class = "k-state- selected" arial = "true"> <td role="gridcell">998262</td> <td role="gridcell">HENDERSON (SMACKOVER) STORAGE</td> <td role="gridcell">ORYAN OIL &amp; GAS</td> 

Вот как выбрать первую строку kendoGrid:

 ie.Document.parentWindow.execScript "$('#drgdLease').data('kendoGrid').select('tr:eq(0)');" 

Ниже приведена демонстрационная версия, показывающая эквивалентный код, работающий на официальной демонстрационной странице виджета Kendo UI Grid Widget .

Обратите внимание на обход для возможного состояния гонки. Хотя может быть и то, что это конкретное состояние гонки также применяется в вашем случае, есть еще одно условие гонки, о котором вам нужно знать.

Возможно, после начала поиска номера аренды и до того, как kendoGrid завершит обновление, ваш код может попытаться выбрать первую строку. Это приведет к тому, что первая строка отображаемых данных по умолчанию / предыдущих поисковых данных по умолчанию будет выбрана, а затем обновлена ​​сетка, в результате чего выбор исчезнет.

В этом случае работа, используемая в приведенном ниже коде , не будет работать , так как она всегда (неправильно) обнаруживает выбранную строку. Требуется другое обходное решение. (Я могу думать о нескольких – наиболее подходящих, возможно, в зависимости от вашего конкретного варианта использования.)

 '============================================================================================ ' Module : <in any standard module> ' Version : 0.1 ' Part : 1 of 1 ' References : Microsoft Internet Controls [SHDocVw] ' Source : https://stackoverflow.com/a/46483783/1961728 '============================================================================================ ' Required if late binding SHDocVw Private Enum tagREADYSTATE READYSTATE_UNINITIALIZED = 0 READYSTATE_LOADING READYSTATE_LOADED READYSTATE_INTERACTIVE READYSTATE_COMPLETE End Enum Public Sub AutomateKendoUI() ' Create and use a new instance of IE With New SHDocVw.InternetExplorer '##Late Binding: CreateObject("InternetExplorer.Application") .Visible = True ' False is default .Navigate "http://demos.telerik.com/kendo-ui/grid/index" Do Until .Busy = False And .ReadyState = SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE: DoEvents: Loop '##Late Binding: = tagREADYSTATE.READYSTATE_COMPLETE ##No Enums: = 4 ' Get and use the main DOM With .Document ' Race Condition Work-Around ' Kendo UI may not have finished loading the Grid data before we invoke its select method. ' Therefore, we continue to invoke the method until a selected row is detected. Do .parentWindow.execScript "$('#grid').data('kendoGrid').select('tr:eq(0)');" On Error Resume Next Dim elm_tr As MSHTML.HTMLTableRow: Set elm_tr = .querySelector("#grid tr.k-state-selected") On Error GoTo 0 Loop While elm_tr Is Nothing End With End With End Sub 

Источники:

Из официальной документации API API Kendo для метода select 1 :

Пример – выберите первую и вторую строки таблицы

 var grid = $("#grid").data("kendoGrid"); grid.select("tr:eq(1), tr:eq(2)"); 

Обратите внимание, что это на самом деле неправильно . Первая строка имеет индекс 0, а не индекс 1. Строковый параметр для метода select рассматривается как селектор jQuery и из официальной документации API jQuery для :eq() селектора 2 :

селектор эквалайзера

Описание: * Выберите элемент с индексом n внутри согласованного набора. *

jQuery(":eq(index)")

index: нулевой индекс элемента для соответствия.

Интересно, что официальная документация API API Kendo для объекта tbody получает это право, хотя 3 :

Пример. Получите первую строку таблицы.

 var grid = $("#grid").data("kendoGrid"); var row = grid.tbody.find("tr:eq(0)"); 


1 http://docs.telerik.com/kendo-ui/api/javascript/ui/grid#methods-select
2 https://api.jquery.com/eq-selector/
3 http://docs.telerik.com/kendo-ui/api/javascript/ui/grid#fields-tbody

вот выстрел в темноте …. lol

это может быть аналогичная страница

один шаг код

 Option Explicit Sub extractKendo() ' Dim IE As Object ' Set IE = CreateObject("InternetExplorer.Application") Dim ie As InternetExplorer Set ie = New InternetExplorer ie.Visible = True ie.navigate "http://demos.telerik.com/kendo-ui/grid/index" While ie.readyState <> 4 Or ie.Busy DoEvents Wend Dim doc As HTMLDocument Set doc = ie.Document Dim elm As IHTMLElementCollection Set elm = doc.getElementsByClassName("k-link k-pager-nav") elm(0).Click elm(4).Click elm(0).Click elm(3).Click elm(3).Click elm(3).Click elm(0).Click Set elm = doc.getElementsByClassName("k-list-scroller") Set elm = elm(1).getElementsByTagName("li") elm(0).Click elm(1).Click elm(2).Click elm(3).Click ie.Quit Set ie = Nothing End Sub 

Вот моя попытка. Я попытался объяснить как можно больше комментариев. Дайте мне знать, как это происходит, основываясь на размещенном HTML, похоже, что это должно работать, но, пожалуйста, сообщите нам об этом 🙂

Я предполагаю, что у вас уже открыто окно IE, и вам нужно получить указатель на это окно. Обновите « myWebSiteURL » в функции getIEPointer, чтобы быть URL-адресом сайта, к которому вы пытаетесь получить доступ. Меньше в этом случае больше, поскольку я делаю подстановочный знак. Например, поиск «goo» будет соответствовать URL-адресу «Good» и «Google».

 Option Explicit Public Sub getElements() Dim ie As Object 'I'm assuming you already have it open in IE, if not, then load the page Set ie = getIEPointer("myWebSiteURL") 'Exit if the window couldn't be located If ie Is Nothing Then Debug.Print "No Window Found!" Exit Sub End If Dim element As Object 'get the Div element which contains all the elements we are interested in 'If this doesn't work, make sure your pages doesn't contain FRAMES 'Here's a page about Frames 'https://stackoverflow.com/questions/16699267/vba-ie-automation-read-iframe Set element = ie.Document.getElementById("drgdLease") 'Select the first instance of the tbody element in the drgdLease div Set element = element.getElementsByTagName("tbody")(0) 'Select the first instance of the td, inside the TBody Set element = element.getElementsByTagName("td")(0) 'Interact with the element element.Click element.Value = "12345" End Sub 'This function will return an IE object, I'm assuming the page is already open Private Function getIEPointer(ByRef UrlPart As String) As Object Dim window As Object For Each window In CreateObject("Shell.Application").Windows() If window.LocationURL Like "*" & UrlPart & "*" Then Set getIEPointer = window Exit Function End If Next Set getIEPointer = Nothing End Function 
  • Экспорт сетки Kendo в заголовок заголовка excel отображает символы html
  • Kendo Grid распечатывает все данные, чтобы улучшить, а не только видимые данные
  • Пользовательский интерфейс Kendo: необходимо экспортировать сетку с разноцветными ячейками, чтобы преуспеть
  • Экспорт в Excel непосредственно из источника данных с сортировкой и группировкой для пользовательского интерфейса Kendo
  • kendo UI Экспорт данных и изображений в файл excel
  • Экспорт Kendo-UI Excel с содержимым заголовка и нижнего колонтитула
  • Я изменил название столбца Kendo UI Grid, но не повлиял на экспорт excel
  • Interesting Posts

    VBA SYNTAX для EXCLUDE. Файлы типов .XLS, прикрепленные к массовой электронной почте

    Отключение сохранения предупреждений из макроса, в котором сохраняется несколько файлов в Excel

    Почему некоторая раскраска ячеек не возникает, и существует ли связь между этим и «Не удается выполнить привязку времени выполнения» err msg?

    Как добавить apache poi в java?

    Использование MS Excel с использованием ASP.NET WebForms без Excel?

    добавьте новый столбец в GridView DevExpress

    Формула Excel (для условного форматирования), которая смотрит только на ячейки, где есть дублирующее значение

    Автоматизация импорта данных из листа excel в SQL-сервер с использованием python

    Имена листов списка Excel + значения

    Простой способ экспорта DataGridView в Excel

    Как изменить строку даты с помощью стрелок влево / вправо в Excel?

    Подсчет ячеек определенного цветного текста в разных столбцах на разных листах одной и той же книги

    SeriesCollection.Name to Range? превосходить

    Python Преобразование вкладки ограниченный файл в csv

    Как использовать if then statement на sql?

    Давайте будем гением компьютера.