(menu, action, label = action)
| 285 | } |
| 286 | |
| 287 | async function clickNavigationMenuAction(menu, action, label = action) { |
| 288 | const actions = { |
| 289 | edit: ['#navigationMenuEdit', 'a#navigationMenuEdit', 'a:has-text("Basic settings")'], |
| 290 | share: ['#navigationMenuShare', 'a#navigationMenuShare', 'a:has-text("Share")'], |
| 291 | rename: ['#navigationMenuRename', 'a#navigationMenuRename', 'a:has-text("Rename")'], |
| 292 | newGroup: ['#navigationMenuNewGroup', 'a#navigationMenuNewGroup', 'a:has-text("Add to new group")'], |
| 293 | delete: ['#navigationMenuDelete', 'a#navigationMenuDelete', 'a:has-text("Delete")'], |
| 294 | }; |
| 295 | const selectors = actions[action]; |
| 296 | if (!selectors) { |
| 297 | throw new Error(`Unknown navigation menu action: ${action}`); |
| 298 | } |
| 299 | |
| 300 | for (const selector of selectors) { |
| 301 | const locator = menu.locator(selector).first(); |
| 302 | if (!(await locator.count())) { |
| 303 | continue; |
| 304 | } |
| 305 | try { |
| 306 | await locator.click({ timeout: 8000 }); |
| 307 | return; |
| 308 | } catch (error) { |
| 309 | // try fallback selector |
| 310 | } |
| 311 | } |
| 312 | |
| 313 | throw new Error(`Could not click ${label}. Selectors: ${selectors.join(', ')}`); |
| 314 | } |
| 315 | |
| 316 | async function confirmVisibleDialogs(page, maxDialogs = 3) { |
| 317 | let confirmed = 0; |
no test coverage detected