@@ -12,10 +12,12 @@ export enum ObjectSummaryTab {
12
12
Schema = 'Schema' ,
13
13
}
14
14
export class ObjectSummary {
15
+ private page : Page ;
15
16
private tabs : Locator ;
16
17
private schemaViewer : Locator ;
17
18
private tree : Locator ;
18
19
private treeRows : Locator ;
20
+ private treeLoaders : Locator ;
19
21
private primaryKeys : Locator ;
20
22
private actionsMenu : ActionsMenu ;
21
23
private aclWrapper : Locator ;
@@ -34,8 +36,10 @@ export class ObjectSummary {
34
36
private overviewWrapper : Locator ;
35
37
36
38
constructor ( page : Page ) {
39
+ this . page = page ;
37
40
this . tree = page . locator ( '.ydb-object-summary__tree' ) ;
38
41
this . treeRows = page . locator ( '.ydb-tree-view' ) ;
42
+ this . treeLoaders = page . locator ( '.ydb-navigation-tree-view-loader' ) ;
39
43
this . tabs = page . locator ( '.ydb-object-summary__tabs' ) ;
40
44
this . schemaViewer = page . locator ( '.schema-viewer' ) ;
41
45
this . primaryKeys = page . locator ( '.schema-viewer__keys_type_primary' ) ;
@@ -166,6 +170,16 @@ export class ObjectSummary {
166
170
return true ;
167
171
}
168
172
173
+ async isTreeLoaded ( ) {
174
+ const loaders = await this . treeLoaders . all ( ) ;
175
+
176
+ for ( const loader of loaders ) {
177
+ await loader . waitFor ( { state : 'hidden' , timeout : VISIBILITY_TIMEOUT } ) ;
178
+ }
179
+
180
+ return true ;
181
+ }
182
+
169
183
async isTreeHidden ( ) {
170
184
await this . tree . waitFor ( { state : 'hidden' , timeout : VISIBILITY_TIMEOUT } ) ;
171
185
return true ;
@@ -181,8 +195,49 @@ export class ObjectSummary {
181
195
return true ;
182
196
}
183
197
198
+ async getTreeItem ( text : string ) {
199
+ await this . isTreeVisible ( ) ;
200
+ await this . isTreeLoaded ( ) ;
201
+
202
+ const itemLocator = this . treeRows . filter ( { hasText : text } ) . first ( ) ;
203
+
204
+ if ( await itemLocator . isVisible ( { timeout : 1000 } ) ) {
205
+ return itemLocator ;
206
+ }
207
+
208
+ // Element could be in not rendered (virtualized) part of the tree
209
+ // Such element cannot be found by playwright
210
+ // Scroll 200px * 10 from top to bottom to find element
211
+ await this . tree . hover ( ) ;
212
+ await this . tree . evaluate ( ( e ) => {
213
+ e . scrollTo ( { top : 0 , behavior : 'instant' } ) ;
214
+ } ) ;
215
+
216
+ // Wait after scroll for elements to become stable
217
+ await this . page . waitForTimeout ( 50 ) ;
218
+
219
+ let i = 0 ;
220
+ while ( i < 10 ) {
221
+ i ++ ;
222
+
223
+ await this . page . mouse . wheel ( 0 , 200 ) ;
224
+
225
+ // Wait after scroll for elements to become stable
226
+ await this . page . waitForTimeout ( 50 ) ;
227
+
228
+ // Some nested nodes could be loading
229
+ await this . isTreeLoaded ( ) ;
230
+
231
+ if ( await itemLocator . isVisible ( { timeout : 500 } ) ) {
232
+ return itemLocator ;
233
+ }
234
+ }
235
+
236
+ throw new Error ( `Tree item ${ text } was not found` ) ;
237
+ }
238
+
184
239
async isOpenPreviewIconVisibleOnHover ( text : string ) : Promise < boolean > {
185
- const treeItem = this . treeRows . filter ( { hasText : text } ) . first ( ) ;
240
+ const treeItem = await this . getTreeItem ( text ) ;
186
241
await treeItem . hover ( ) ;
187
242
188
243
const openPreviewIcon = treeItem . locator ( 'button[title="Open preview"]' ) ;
@@ -196,15 +251,15 @@ export class ObjectSummary {
196
251
}
197
252
198
253
async clickPreviewButton ( text : string ) : Promise < void > {
199
- const treeItem = this . treeRows . filter ( { hasText : text } ) . first ( ) ;
254
+ const treeItem = await this . getTreeItem ( text ) ;
200
255
await treeItem . hover ( ) ;
201
256
202
257
const openPreviewIcon = treeItem . locator ( 'button[title="Open preview"]' ) ;
203
258
await openPreviewIcon . click ( ) ;
204
259
}
205
260
206
261
async clickActionsButton ( text : string ) : Promise < void > {
207
- const treeItem = this . treeRows . filter ( { hasText : text } ) . first ( ) ;
262
+ const treeItem = await this . getTreeItem ( text ) ;
208
263
await treeItem . hover ( ) ;
209
264
210
265
const actionsIcon = treeItem . locator ( '.g-dropdown-menu__switcher-button' ) ;
0 commit comments