Stuck - Need help !
I\'m trying to automate actioning items in an IE web page on our internal company site. I\'m able to fill out any kind of text object
This is how to select the first row of the kendoGrid:
ie.Document.parentWindow.execScript "$('#drgdLease').data('kendoGrid').select('tr:eq(0)');"
Below is a demo showing the equivalent code working on the official Kendo UI Grid Widget Demo page.
Note the work-around for the possible race condition. While it may be that this particular race condition also applies in your case, there is another race condition that you need to be aware of.
It's possible that, after having initiated the search for the lease number, and before the kendoGrid has finished updating, your code might attempt to select the first row. This would result in the first row of the default displayed data/previous search data being selected, and then the grid being updated, causing the selection to disappear.
The work-around employed in the code below will not work in this case, as it will always (incorrectly) detect a selected row. A different workaround is needed. (I can think of a few - the most suitable probably depending on your exact use case.)
'============================================================================================
' 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
From the official Kendo UI API documentation for the select
method1:
Example - select the first and second table rows
...var grid = $("#grid").data("kendoGrid"); grid.select("tr:eq(1), tr:eq(2)");
Note that this is actually wrong. The first row is at index 0, not index 1. A string parameter for the select method is treated as a jQuery selector, and from the official jQuery API documentation for the :eq()
selector2:
eq selector
Description: *Select the element at index
n
within the matched set.*
jQuery(":eq(index)")
index: Zero-based index of the element to match.
Interestingly, the official Kendo UI API documentation for the tbody
object gets it right though3:
Example - get the first table row
...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