@@ -17,8 +17,8 @@ export class ContextMenu {
1717 private get page ( ) : Page { return this . code . driver . page ; }
1818 private isNativeMenu : boolean ;
1919 private get contextMenu ( ) : Locator { return this . page . locator ( '.monaco-menu' ) ; }
20- private getContextMenuItem ( label : string | RegExp ) : Locator { return this . contextMenu . getByRole ( 'menuitem' , { name : label , exact : true } ) ; }
21- private getContextMenuCheckboxItem ( label : string | RegExp ) : Locator { return this . contextMenu . getByRole ( 'menuitemcheckbox' , { name : label , exact : true } ) ; }
20+ private getContextMenuItem ( label : string | RegExp , exact = false ) : Locator { return this . contextMenu . getByRole ( 'menuitem' , { name : label , exact } ) ; }
21+ private getContextMenuCheckboxItem ( label : string | RegExp , exact = false ) : Locator { return this . contextMenu . getByRole ( 'menuitemcheckbox' , { name : label , exact } ) ; }
2222
2323 constructor ( private code : Code ) {
2424 // Check if we're on macOS AND we have an Electron app instance
@@ -68,12 +68,13 @@ export class ContextMenu {
6868 * @param menuItemLabel The label of the menu item to click
6969 * @param menuItemType The type of the menu item, either 'menuitemcheckbox' or 'menuitem'
7070 * @param menuTriggerButton The mouse button to use when clicking the menu trigger (default: 'left')
71+ * @param exact Whether to use exact match for the menu item label (default: false)
7172 */
72- async triggerAndClick ( { menuTrigger, menuItemLabel, menuItemType = 'menuitem' , menuTriggerButton = 'left' } : ContextMenuClick ) : Promise < void > {
73+ async triggerAndClick ( { menuTrigger, menuItemLabel, menuItemType = 'menuitem' , menuTriggerButton = 'left' , exact = false } : ContextMenuClick ) : Promise < void > {
7374 await test . step ( `Trigger context menu and click '${ menuItemLabel } '` , async ( ) => {
7475 if ( this . isNativeMenu ) {
7576 this . code . logger . log ( `Using native menu to select: ${ menuItemLabel } ` ) ;
76- await this . nativeMenuTriggerAndClick ( { menuTrigger, menuItemLabel, menuTriggerButton } ) ;
77+ await this . nativeMenuTriggerAndClick ( { menuTrigger, menuItemLabel, menuTriggerButton, exact } ) ;
7778 } else {
7879 this . code . logger . log ( `Using web menu to select: ${ menuItemLabel } ` ) ;
7980
@@ -89,8 +90,8 @@ export class ContextMenu {
8990 await expect ( this . contextMenu ) . toBeVisible ( { timeout : 2000 } ) ;
9091
9192 const menuItem = menuItemType === 'menuitemcheckbox'
92- ? this . getContextMenuCheckboxItem ( menuItemLabel )
93- : this . getContextMenuItem ( menuItemLabel ) ;
93+ ? this . getContextMenuCheckboxItem ( menuItemLabel , exact )
94+ : this . getContextMenuItem ( menuItemLabel , exact ) ;
9495
9596 await menuItem . hover ( { timeout : 2000 } ) ;
9697 await this . page . waitForTimeout ( 200 ) ;
@@ -199,8 +200,9 @@ export class ContextMenu {
199200 *
200201 * @param menuTrigger The locator that will trigger the context menu when clicked
201202 * @param menuItemLabel The label of the menu item to click
203+ * @param exact Whether to use exact match (native menus always use exact match for strings)
202204 */
203- private async nativeMenuTriggerAndClick ( { menuTrigger, menuItemLabel, menuTriggerButton = 'left' } : Omit < ContextMenuClick , 'menuItemType' > & { clickButton ?: ClickButton } ) : Promise < void > {
205+ private async nativeMenuTriggerAndClick ( { menuTrigger, menuItemLabel, menuTriggerButton = 'left' , exact = false } : Omit < ContextMenuClick , 'menuItemType' > & { clickButton ?: ClickButton } ) : Promise < void > {
204206 const menuItems = await this . triggerMenu ( menuTrigger , menuTriggerButton ) ;
205207
206208 if ( ! menuItems ) {
@@ -305,4 +307,5 @@ interface ContextMenuClick {
305307 menuItemLabel : string | RegExp ;
306308 menuItemType ?: 'menuitemcheckbox' | 'menuitem' ;
307309 menuTriggerButton ?: ClickButton ;
310+ exact ?: boolean ;
308311}
0 commit comments