2022-02-05 06:27:45 +03:00
/ * *
* Copyright ( c ) Microsoft Corporation .
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
* /
import { test , expect } from './inspectorTest' ;
test . describe ( 'cli codegen' , ( ) = > {
test . skip ( ( { mode } ) = > mode !== 'default' ) ;
test ( 'should click locator.first' , async ( { page , openRecorder } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( `
< button onclick = "console.log('click1')" > Submit < / button >
< button onclick = "console.log('click2')" > Submit < / button >
` );
2022-10-25 01:01:48 +03:00
const locator = await recorder . hoverOverElement ( 'button' ) ;
expect ( locator ) . toBe ( ` getByRole('button', { name: 'Submit' }).first() ` ) ;
2022-02-05 06:27:45 +03:00
const [ message , sources ] = await Promise . all ( [
page . waitForEvent ( 'console' , msg = > msg . type ( ) !== 'error' ) ,
recorder . waitForOutput ( 'JavaScript' , 'click' ) ,
2022-11-15 02:16:25 +03:00
recorder . trustedClick ( )
2022-02-05 06:27:45 +03:00
] ) ;
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . getByRole ( 'button' , { name : 'Submit' } ) . first ( ) . click ( ) ; ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
page . get_by_role ( "button" , name = "Submit" ) . first . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . get_by_role ( "button" , name = "Submit" ) . first . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2022-10-10 22:25:56 +03:00
page . getByRole ( AriaRole . BUTTON , new Page . GetByRoleOptions ( ) . setName ( "Submit" ) ) . first ( ) . click ( ) ; ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2022-11-30 07:56:18 +03:00
await page . GetByRole ( AriaRole . Button , new ( ) { Name = "Submit" } ) . First . ClickAsync ( ) ; ` );
2022-02-05 06:27:45 +03:00
expect ( message . text ( ) ) . toBe ( 'click1' ) ;
} ) ;
test ( 'should click locator.nth' , async ( { page , openRecorder } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( `
< button onclick = "console.log('click1')" > Submit < / button >
< button onclick = "console.log('click2')" > Submit < / button >
` );
2022-10-25 01:01:48 +03:00
const locator = await recorder . hoverOverElement ( 'button >> nth=1' ) ;
expect ( locator ) . toBe ( ` getByRole('button', { name: 'Submit' }).nth(1) ` ) ;
2022-02-05 06:27:45 +03:00
const [ message , sources ] = await Promise . all ( [
page . waitForEvent ( 'console' , msg = > msg . type ( ) !== 'error' ) ,
recorder . waitForOutput ( 'JavaScript' , 'click' ) ,
2022-11-15 02:16:25 +03:00
recorder . trustedClick ( )
2022-02-05 06:27:45 +03:00
] ) ;
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . getByRole ( 'button' , { name : 'Submit' } ) . nth ( 1 ) . click ( ) ; ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
page . get_by_role ( "button" , name = "Submit" ) . nth ( 1 ) . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . get_by_role ( "button" , name = "Submit" ) . nth ( 1 ) . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2022-10-10 22:25:56 +03:00
page . getByRole ( AriaRole . BUTTON , new Page . GetByRoleOptions ( ) . setName ( "Submit" ) ) . nth ( 1 ) . click ( ) ; ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2022-11-30 07:56:18 +03:00
await page . GetByRole ( AriaRole . Button , new ( ) { Name = "Submit" } ) . Nth ( 1 ) . ClickAsync ( ) ; ` );
2022-02-05 06:27:45 +03:00
expect ( message . text ( ) ) . toBe ( 'click2' ) ;
} ) ;
test ( 'should generate frame locators' , async ( { page , openRecorder , server } ) = > {
const recorder = await openRecorder ( ) ;
/ *
iframe
div Hello1
iframe
div Hello2
iframe [ name = one ]
div HelloNameOne
iframe [ name = two ]
dev HelloNameTwo
iframe
dev HelloAnonymous
* /
await recorder . setContentAndWait ( `
< iframe id = frame1 srcdoc = "<div>Hello1</div><iframe srcdoc='<div>Hello2</div><iframe name=one></iframe><iframe name=two></iframe><iframe></iframe>'>" >
` , server.EMPTY_PAGE, 6);
const frameHello1 = page . mainFrame ( ) . childFrames ( ) [ 0 ] ;
const frameHello2 = frameHello1 . childFrames ( ) [ 0 ] ;
2023-10-23 19:31:30 +03:00
const frameOne = page . frame ( { name : 'one' } ) ! ;
2022-02-05 06:27:45 +03:00
await frameOne . setContent ( ` <div>HelloNameOne</div> ` ) ;
2023-10-23 19:31:30 +03:00
const frameTwo = page . frame ( { name : 'two' } ) ! ;
2022-02-05 06:27:45 +03:00
await frameTwo . setContent ( ` <div>HelloNameTwo</div> ` ) ;
2023-10-23 19:31:30 +03:00
const frameAnonymous = frameHello2 . childFrames ( ) . find ( f = > ! f . name ( ) ) ! ;
2022-02-05 06:27:45 +03:00
await frameAnonymous . setContent ( ` <div>HelloNameAnonymous</div> ` ) ;
let [ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'Hello1' ) ,
frameHello1 . click ( 'text=Hello1' ) ,
] ) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . frameLocator ( '#frame1' ) . getByText ( 'Hello1' ) . click ( ) ; ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
page . frameLocator ( "#frame1" ) . getByText ( "Hello1" ) . click ( ) ; ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
page . frame_locator ( "#frame1" ) . get_by_text ( "Hello1" ) . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . frame_locator ( "#frame1" ) . get_by_text ( "Hello1" ) . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . FrameLocator ( "#frame1" ) . GetByText ( "Hello1" ) . ClickAsync ( ) ; ` );
2022-02-05 06:27:45 +03:00
[ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'Hello2' ) ,
frameHello2 . click ( 'text=Hello2' ) ,
] ) ;
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . frameLocator ( '#frame1' ) . frameLocator ( 'iframe' ) . getByText ( 'Hello2' ) . click ( ) ; ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
page . frameLocator ( "#frame1" ) . frameLocator ( "iframe" ) . getByText ( "Hello2" ) . click ( ) ; ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
page . frame_locator ( "#frame1" ) . frame_locator ( "iframe" ) . get_by_text ( "Hello2" ) . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . frame_locator ( "#frame1" ) . frame_locator ( "iframe" ) . get_by_text ( "Hello2" ) . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . FrameLocator ( "#frame1" ) . FrameLocator ( "iframe" ) . GetByText ( "Hello2" ) . ClickAsync ( ) ; ` );
2022-02-05 06:27:45 +03:00
[ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'one' ) ,
frameOne . click ( 'text=HelloNameOne' ) ,
] ) ;
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2023-10-30 23:56:45 +03:00
await page . frameLocator ( '#frame1' ) . frameLocator ( 'iframe' ) . frameLocator ( 'iframe[name="one"]' ) . getByText ( 'HelloNameOne' ) . click ( ) ; ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2023-10-30 23:56:45 +03:00
page . frameLocator ( "#frame1" ) . frameLocator ( "iframe" ) . frameLocator ( "iframe[name=\\" one \ \ "]" ) . getByText ( "HelloNameOne" ) . click ( ) ; ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2023-10-30 23:56:45 +03:00
page . frame_locator ( "#frame1" ) . frame_locator ( "iframe" ) . frame_locator ( "iframe[name=\\" one \ \ "]" ) . get_by_text ( "HelloNameOne" ) . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2023-10-30 23:56:45 +03:00
await page . frame_locator ( "#frame1" ) . frame_locator ( "iframe" ) . frame_locator ( "iframe[name=\\" one \ \ "]" ) . get_by_text ( "HelloNameOne" ) . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2023-10-30 23:56:45 +03:00
await page . FrameLocator ( "#frame1" ) . FrameLocator ( "iframe" ) . FrameLocator ( "iframe[name=\\" one \ \ "]" ) . GetByText ( "HelloNameOne" ) . ClickAsync ( ) ; ` );
2022-02-05 06:27:45 +03:00
[ sources ] = await Promise . all ( [
2023-10-30 23:56:45 +03:00
recorder . waitForOutput ( 'JavaScript' , 'HelloNameAnonymous' ) ,
2022-02-05 06:27:45 +03:00
frameAnonymous . click ( 'text=HelloNameAnonymous' ) ,
] ) ;
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2023-10-30 23:56:45 +03:00
await page . frameLocator ( '#frame1' ) . frameLocator ( 'iframe' ) . frameLocator ( 'iframe >> nth=2' ) . getByText ( 'HelloNameAnonymous' ) . click ( ) ; ` );
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
page . frameLocator ( "#frame1" ) . frameLocator ( "iframe" ) . frameLocator ( "iframe >> nth=2" ) . getByText ( "HelloNameAnonymous" ) . click ( ) ; ` );
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
page . frame_locator ( "#frame1" ) . frame_locator ( "iframe" ) . frame_locator ( "iframe >> nth=2" ) . get_by_text ( "HelloNameAnonymous" ) . click ( ) ` );
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
await page . frame_locator ( "#frame1" ) . frame_locator ( "iframe" ) . frame_locator ( "iframe >> nth=2" ) . get_by_text ( "HelloNameAnonymous" ) . click ( ) ` );
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
await page . FrameLocator ( "#frame1" ) . FrameLocator ( "iframe" ) . FrameLocator ( "iframe >> nth=2" ) . GetByText ( "HelloNameAnonymous" ) . ClickAsync ( ) ; ` );
} ) ;
test ( 'should generate frame locators with special characters in name attribute' , async ( { page , openRecorder , server } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( `
< iframe srcdoc = "<button>Click me</button>" >
` , server.EMPTY_PAGE, 2);
await page . $eval ( 'iframe' , ( frame : HTMLIFrameElement ) = > {
frame . name = 'foo<bar\'"`>' ;
} ) ;
const [ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'Click me' ) ,
page . frameLocator ( 'iframe[name="foo<bar\'\\"`>"]' ) . getByRole ( 'button' , { name : 'Click me' } ) . click ( ) ,
] ) ;
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
await page . frameLocator ( 'iframe[name="foo\\\\<bar\\\\\\' \ \ \ \ "\\\\\`\\\\>" ] ').getByRole(' button ', { name: ' Click me ' } ) . click ( ) ; ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2023-10-30 23:56:45 +03:00
page . frameLocator ( "iframe[name=\\" foo \ \ \ \ < bar \ \ \ \ ' \ \ \ \ \ \ " \ \ \ \ \ ` \ \ \ \ > \ \ "]" ) . getByRole ( AriaRole . BUTTON , new FrameLocator . GetByRoleOptions ( ) . setName ( "Click me" ) ) . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2023-10-30 23:56:45 +03:00
page . frame_locator ( "iframe[name=\\" foo \ \ \ \ < bar \ \ \ \ ' \ \ \ \ \ \ " \ \ \ \ \ ` \ \ \ \ > \ \ "]" ) . get_by_role ( "button" , name = "Click me" ) . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2023-10-30 23:56:45 +03:00
await page . frame_locator ( "iframe[name=\\" foo \ \ \ \ < bar \ \ \ \ ' \ \ \ \ \ \ " \ \ \ \ \ ` \ \ \ \ > \ \ "]" ) . get_by_role ( "button" , name = "Click me" ) . click ( ) ` );
2022-02-05 06:27:45 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2023-10-30 23:56:45 +03:00
await page . FrameLocator ( "iframe[name=\\" foo \ \ \ \ < bar \ \ \ \ ' \ \ \ \ \ \ " \ \ \ \ \ ` \ \ \ \ > \ \ "]" ) . GetByRole ( AriaRole . Button , new ( ) { Name = "Click me" } ) . ClickAsync ( ) ; ` );
2022-10-04 03:14:02 +03:00
} ) ;
2023-01-11 23:53:19 +03:00
test ( 'should generate frame locators with title attribute' , async ( { page , openRecorder , server } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( `
< iframe title = "hello world" srcdoc = "<button>Click me</button>" > < / iframe >
` , server.EMPTY_PAGE, 1);
const [ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'Click me' ) ,
page . frameLocator ( '[title="hello world"]' ) . getByRole ( 'button' , { name : 'Click me' } ) . click ( ) ,
] ) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'JavaScript' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.frameLocator('iframe[title="hello world"]').getByRole('button', { name: 'Click me' }).click(); `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Java' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` page.frameLocator( \ "iframe[title= \\ \ "hello world \\ \ "] \ ").getByRole(AriaRole.BUTTON, new FrameLocator.GetByRoleOptions().setName( \ "Click me \ ")).click(); `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Python' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` page.frame_locator( \ "iframe[title= \\ \ "hello world \\ \ "] \ ").get_by_role( \ "button \ ", name= \ "Click me \ ").click() `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Python Async' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.frame_locator("iframe[title= \\ \ "hello world \\ \ "]").get_by_role("button", name="Click me").click() `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'C#' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.FrameLocator("iframe[title= \\ \ "hello world \\ \ "]").GetByRole(AriaRole.Button, new() { Name = "Click me" }).ClickAsync(); `
) ;
} ) ;
test ( 'should generate frame locators with name attribute' , async ( { page , openRecorder , server } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( `
< iframe name = "hello world" srcdoc = "<button>Click me</button>" > < / iframe >
` , server.EMPTY_PAGE, 1);
const [ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'Click me' ) ,
page . frameLocator ( '[name="hello world"]' ) . getByRole ( 'button' , { name : 'Click me' } ) . click ( ) ,
] ) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'JavaScript' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.frameLocator('iframe[name="hello world"]').getByRole('button', { name: 'Click me' }).click(); `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Java' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` page.frameLocator( \ "iframe[name= \\ \ "hello world \\ \ "] \ ").getByRole(AriaRole.BUTTON, new FrameLocator.GetByRoleOptions().setName( \ "Click me \ ")).click(); `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Python' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` page.frame_locator( \ "iframe[name= \\ \ "hello world \\ \ "] \ ").get_by_role( \ "button \ ", name= \ "Click me \ ").click() `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Python Async' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.frame_locator("iframe[name= \\ \ "hello world \\ \ "]").get_by_role("button", name="Click me").click() `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'C#' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.FrameLocator("iframe[name= \\ \ "hello world \\ \ "]").GetByRole(AriaRole.Button, new() { Name = "Click me" }).ClickAsync(); `
) ;
} ) ;
test ( 'should generate frame locators with id attribute' , async ( { page , openRecorder , server } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( `
< iframe id = "hello-world" srcdoc = "<button>Click me</button>" > < / iframe >
` , server.EMPTY_PAGE, 1);
const [ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'Click me' ) ,
page . frameLocator ( '[id="hello-world"]' ) . getByRole ( 'button' , { name : 'Click me' } ) . click ( ) ,
] ) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'JavaScript' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.frameLocator('#hello-world').getByRole('button', { name: 'Click me' }).click(); `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Java' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` page.frameLocator( \ "#hello-world \ ").getByRole(AriaRole.BUTTON, new FrameLocator.GetByRoleOptions().setName( \ "Click me \ ")).click(); `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Python' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` page.frame_locator( \ "#hello-world \ ").get_by_role( \ "button \ ", name= \ "Click me \ ").click() `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Python Async' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.frame_locator("#hello-world").get_by_role("button", name="Click me").click() `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'C#' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.FrameLocator("#hello-world").GetByRole(AriaRole.Button, new() { Name = "Click me" }).ClickAsync(); `
) ;
} ) ;
test ( 'should generate frame locators with testId' , async ( { page , openRecorder , server } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( `
< iframe data - testid = "my-testid" srcdoc = "<button>Click me</button>" > < / iframe >
` , server.EMPTY_PAGE, 1);
const [ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'my-testid' ) ,
page . frameLocator ( 'iframe[data-testid="my-testid"]' ) . getByRole ( 'button' , { name : 'Click me' } ) . click ( ) ,
] ) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'JavaScript' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.frameLocator('[data-testid="my-testid"]').getByRole('button', { name: 'Click me' }).click(); `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Java' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` page.frameLocator( \ "[data-testid= \\ \ "my-testid \\ \ "] \ ").getByRole(AriaRole.BUTTON, new FrameLocator.GetByRoleOptions().setName( \ "Click me \ ")).click(); `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Python' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` page.frame_locator( \ "[data-testid= \\ \ "my-testid \\ \ "] \ ").get_by_role( \ "button \ ", name= \ "Click me \ ").click() `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'Python Async' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.frame_locator("[data-testid= \\ \ "my-testid \\ \ "]").get_by_role("button", name="Click me").click() `
) ;
2023-10-23 19:31:30 +03:00
expect ( sources . get ( 'C#' ) ! . text ) . toContain (
2023-01-11 23:53:19 +03:00
` await page.FrameLocator("[data-testid= \\ \ "my-testid \\ \ "]").GetByRole(AriaRole.Button, new() { Name = "Click me" }).ClickAsync(); `
) ;
} ) ;
2022-10-04 03:14:02 +03:00
test ( 'should generate role locators undef frame locators' , async ( { page , openRecorder , server } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( ` <iframe id=frame1 srcdoc="<button>Submit</button>"> ` , server . EMPTY_PAGE , 2 ) ;
const frame = page . mainFrame ( ) . childFrames ( ) [ 0 ] ;
const [ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'click' ) ,
frame . click ( 'button' ) ,
] ) ;
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . frameLocator ( '#frame1' ) . getByRole ( 'button' , { name : 'Submit' } ) . click ( ) ; ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2022-10-10 22:25:56 +03:00
page . frameLocator ( "#frame1" ) . getByRole ( AriaRole . BUTTON , new FrameLocator . GetByRoleOptions ( ) . setName ( "Submit" ) ) . click ( ) ; ` );
2022-10-04 03:14:02 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
page . frame_locator ( "#frame1" ) . get_by_role ( "button" , name = "Submit" ) . click ( ) ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . frame_locator ( "#frame1" ) . get_by_role ( "button" , name = "Submit" ) . click ( ) ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2022-11-30 07:56:18 +03:00
await page . FrameLocator ( "#frame1" ) . GetByRole ( AriaRole . Button , new ( ) { Name = "Submit" } ) . ClickAsync ( ) ; ` );
2022-02-05 06:27:45 +03:00
} ) ;
2022-10-04 03:14:02 +03:00
test ( 'should generate getByTestId' , async ( { page , openRecorder } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( ` <div data-testid=testid onclick="console.log('click')">Submit</div> ` ) ;
2022-10-25 01:01:48 +03:00
const locator = await recorder . hoverOverElement ( 'div' ) ;
expect ( locator ) . toBe ( ` getByTestId('testid') ` ) ;
2022-10-04 03:14:02 +03:00
const [ message , sources ] = await Promise . all ( [
page . waitForEvent ( 'console' , msg = > msg . type ( ) !== 'error' ) ,
recorder . waitForOutput ( 'JavaScript' , 'click' ) ,
2022-11-15 02:16:25 +03:00
recorder . trustedClick ( ) ,
2022-10-04 03:14:02 +03:00
] ) ;
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . getByTestId ( 'testid' ) . click ( ) ; ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
page . get_by_test_id ( "testid" ) . click ( ) ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . get_by_test_id ( "testid" ) . click ( ) ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
page . getByTestId ( "testid" ) . click ( ) ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . GetByTestId ( "testid" ) . ClickAsync ( ) ; ` );
expect ( message . text ( ) ) . toBe ( 'click' ) ;
} ) ;
2022-10-04 20:29:26 +03:00
test ( 'should generate getByPlaceholder' , async ( { page , openRecorder } ) = > {
2022-10-04 03:14:02 +03:00
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( ` <input placeholder="Country"></input> ` ) ;
2022-10-25 01:01:48 +03:00
const locator = await recorder . hoverOverElement ( 'input' ) ;
expect ( locator ) . toBe ( ` getByPlaceholder('Country') ` ) ;
2022-10-04 03:14:02 +03:00
const [ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'click' ) ,
2022-11-15 02:16:25 +03:00
recorder . trustedClick ( ) ,
2022-10-04 03:14:02 +03:00
] ) ;
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2022-10-04 20:29:26 +03:00
await page . getByPlaceholder ( 'Country' ) . click ( ) ; ` );
2022-10-04 03:14:02 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2022-10-04 20:29:26 +03:00
page . get_by_placeholder ( "Country" ) . click ( ) ` );
2022-10-04 03:14:02 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2022-10-04 20:29:26 +03:00
await page . get_by_placeholder ( "Country" ) . click ( ) ` );
2022-10-04 03:14:02 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2022-10-04 20:29:26 +03:00
page . getByPlaceholder ( "Country" ) . click ( ) ` );
2022-10-04 03:14:02 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2022-10-04 20:29:26 +03:00
await page . GetByPlaceholder ( "Country" ) . ClickAsync ( ) ; ` );
2022-10-04 03:14:02 +03:00
} ) ;
test ( 'should generate getByAltText' , async ( { page , openRecorder } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( ` <input alt="Country"></input> ` ) ;
2022-10-25 01:01:48 +03:00
const locator = await recorder . hoverOverElement ( 'input' ) ;
expect ( locator ) . toBe ( ` getByAltText('Country') ` ) ;
2022-10-04 03:14:02 +03:00
const [ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'click' ) ,
2022-11-15 02:16:25 +03:00
recorder . trustedClick ( ) ,
2022-10-04 03:14:02 +03:00
] ) ;
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . getByAltText ( 'Country' ) . click ( ) ; ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
page . get_by_alt_text ( "Country" ) . click ( ) ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . get_by_alt_text ( "Country" ) . click ( ) ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
page . getByAltText ( "Country" ) . click ( ) ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2022-10-04 03:14:02 +03:00
await page . GetByAltText ( "Country" ) . ClickAsync ( ) ; ` );
} ) ;
2022-10-05 22:02:15 +03:00
test ( 'should generate getByLabel' , async ( { page , openRecorder } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( ` <label for=target>Country</label><input id=target> ` ) ;
2022-10-25 01:01:48 +03:00
const locator = await recorder . hoverOverElement ( 'input' ) ;
expect ( locator ) . toBe ( ` getByLabel('Country') ` ) ;
2022-10-05 22:02:15 +03:00
const [ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'click' ) ,
2022-11-15 02:16:25 +03:00
recorder . trustedClick ( ) ,
2022-10-05 22:02:15 +03:00
] ) ;
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2022-10-05 22:02:15 +03:00
await page . getByLabel ( 'Country' ) . click ( ) ; ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2022-10-05 22:02:15 +03:00
page . get_by_label ( "Country" ) . click ( ) ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2022-10-05 22:02:15 +03:00
await page . get_by_label ( "Country" ) . click ( ) ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2022-10-05 22:02:15 +03:00
page . getByLabel ( "Country" ) . click ( ) ` );
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2022-10-05 22:02:15 +03:00
await page . GetByLabel ( "Country" ) . ClickAsync ( ) ; ` );
} ) ;
2022-10-18 23:09:54 +03:00
test ( 'should generate getByLabel without regex' , async ( { page , openRecorder } ) = > {
2022-10-05 22:02:15 +03:00
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( ` <label for=target>Coun"try</label><input id=target> ` ) ;
2022-10-25 01:01:48 +03:00
const locator = await recorder . hoverOverElement ( 'input' ) ;
expect ( locator ) . toBe ( ` getByLabel('Coun"try') ` ) ;
2022-10-05 22:02:15 +03:00
const [ sources ] = await Promise . all ( [
recorder . waitForOutput ( 'JavaScript' , 'click' ) ,
2022-11-15 02:16:25 +03:00
recorder . trustedClick ( ) ,
2022-10-05 22:02:15 +03:00
] ) ;
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'JavaScript' ) ! . text ) . toContain ( `
2022-10-18 23:09:54 +03:00
await page . getByLabel ( 'Coun\"try' ) . click ( ) ; ` );
2022-10-05 22:02:15 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python' ) ! . text ) . toContain ( `
2022-10-18 23:09:54 +03:00
page . get_by_label ( "Coun\\" try " ) . click ( ) ` );
2022-10-05 22:02:15 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Python Async' ) ! . text ) . toContain ( `
2022-10-18 23:09:54 +03:00
await page . get_by_label ( "Coun\\" try " ) . click ( ) ` );
2022-10-05 22:02:15 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'Java' ) ! . text ) . toContain ( `
2022-10-18 23:09:54 +03:00
page . getByLabel ( "Coun\\" try " ) . click ( ) ` );
2022-10-05 22:02:15 +03:00
2023-10-23 19:31:30 +03:00
expect . soft ( sources . get ( 'C#' ) ! . text ) . toContain ( `
2022-10-18 23:09:54 +03:00
await page . GetByLabel ( "Coun\\" try " ) . ClickAsync ( ) ; ` );
2022-10-05 22:02:15 +03:00
} ) ;
2023-11-03 23:41:51 +03:00
test ( 'should consume pointer events' , async ( { page , openRecorder } ) = > {
const recorder = await openRecorder ( ) ;
await recorder . setContentAndWait ( `
< button onclick = "console.log('clicked')" > Submit < / button >
< script >
const button = document . querySelector ( 'button' ) ;
const log = [ ] ;
for ( const eventName of [ 'mousedown' , 'mousemove' , 'mouseup' , 'pointerdown' , 'pointermove' , 'pointerup' , 'click' ] )
button . addEventListener ( eventName , e = > log . push ( e . type ) ) ;
< / script >
` );
await recorder . hoverOverElement ( 'button' ) ;
expect ( await page . evaluate ( 'log' ) ) . toEqual ( [ 'pointermove' , 'mousemove' ] ) ;
const [ message ] = await Promise . all ( [
page . waitForEvent ( 'console' , msg = > msg . type ( ) !== 'error' ) ,
recorder . waitForOutput ( 'JavaScript' , 'click' ) ,
recorder . trustedClick ( ) ,
] ) ;
expect ( message . text ( ) ) . toBe ( 'clicked' ) ;
expect ( await page . evaluate ( 'log' ) ) . toEqual ( [
'pointermove' , 'mousemove' ,
'pointermove' , 'mousemove' ,
'pointerdown' , 'mousedown' ,
'pointerup' , 'mouseup' ,
'click' ,
] ) ;
} ) ;
2022-02-05 06:27:45 +03:00
} ) ;