2021-07-22 21:37:20 -07:00
/ * *
* Copyright 2018 Google Inc . All rights reserved .
* Modifications 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 as it , expect } from './pageTest' ;
it ( 'should have a nice preview' , async ( { page , server } ) = > {
await page . goto ( ` ${ server . PREFIX } /dom.html ` ) ;
const outer = page . locator ( '#outer' ) ;
const inner = outer . locator ( '#inner' ) ;
const check = page . locator ( '#check' ) ;
const text = await inner . evaluateHandle ( e = > e . firstChild ) ;
await page . evaluate ( ( ) = > 1 ) ; // Give them a chance to calculate the preview.
2023-09-16 14:24:10 -07:00
expect . soft ( String ( outer ) ) . toBe ( ` locator('#outer') ` ) ;
expect . soft ( String ( inner ) ) . toBe ( ` locator('#outer').locator('#inner') ` ) ;
expect . soft ( String ( text ) ) . toBe ( ` JSHandle@#text=Text,↵more text ` ) ;
expect . soft ( String ( check ) ) . toBe ( ` locator('#check') ` ) ;
2021-07-22 21:37:20 -07:00
} ) ;
it ( 'getAttribute should work' , async ( { page , server } ) = > {
await page . goto ( ` ${ server . PREFIX } /dom.html ` ) ;
const locator = page . locator ( '#outer' ) ;
expect ( await locator . getAttribute ( 'name' ) ) . toBe ( 'value' ) ;
expect ( await locator . getAttribute ( 'foo' ) ) . toBe ( null ) ;
expect ( await page . getAttribute ( '#outer' , 'name' ) ) . toBe ( 'value' ) ;
expect ( await page . getAttribute ( '#outer' , 'foo' ) ) . toBe ( null ) ;
} ) ;
it ( 'inputValue should work' , async ( { page , server } ) = > {
await page . goto ( ` ${ server . PREFIX } /dom.html ` ) ;
2021-08-03 10:22:40 -05:00
await page . selectOption ( '#select' , 'foo' ) ;
expect ( await page . inputValue ( '#select' ) ) . toBe ( 'foo' ) ;
2021-07-22 21:37:20 -07:00
await page . fill ( '#textarea' , 'text value' ) ;
expect ( await page . inputValue ( '#textarea' ) ) . toBe ( 'text value' ) ;
await page . fill ( '#input' , 'input value' ) ;
expect ( await page . inputValue ( '#input' ) ) . toBe ( 'input value' ) ;
2021-07-29 14:09:35 -07:00
const locator = page . locator ( '#input' ) ;
expect ( await locator . inputValue ( ) ) . toBe ( 'input value' ) ;
2021-07-22 21:37:20 -07:00
2021-09-24 20:51:09 -07:00
expect ( await page . inputValue ( '#inner' ) . catch ( e = > e . message ) ) . toContain ( 'Node is not an <input>, <textarea> or <select> element' ) ;
2021-07-29 14:09:35 -07:00
const locator2 = page . locator ( '#inner' ) ;
2021-09-24 20:51:09 -07:00
expect ( await locator2 . inputValue ( ) . catch ( e = > e . message ) ) . toContain ( 'Node is not an <input>, <textarea> or <select> element' ) ;
2021-07-22 21:37:20 -07:00
} ) ;
it ( 'innerHTML should work' , async ( { page , server } ) = > {
await page . goto ( ` ${ server . PREFIX } /dom.html ` ) ;
2021-07-29 14:09:35 -07:00
const locator = page . locator ( '#outer' ) ;
expect ( await locator . innerHTML ( ) ) . toBe ( '<div id="inner">Text,\nmore text</div>' ) ;
2021-07-22 21:37:20 -07:00
expect ( await page . innerHTML ( '#outer' ) ) . toBe ( '<div id="inner">Text,\nmore text</div>' ) ;
} ) ;
it ( 'innerText should work' , async ( { page , server } ) = > {
await page . goto ( ` ${ server . PREFIX } /dom.html ` ) ;
2021-07-29 14:09:35 -07:00
const locator = page . locator ( '#inner' ) ;
expect ( await locator . innerText ( ) ) . toBe ( 'Text, more text' ) ;
2021-07-22 21:37:20 -07:00
expect ( await page . innerText ( '#inner' ) ) . toBe ( 'Text, more text' ) ;
} ) ;
it ( 'innerText should throw' , async ( { page , server } ) = > {
await page . setContent ( ` <svg>text</svg> ` ) ;
const error1 = await page . innerText ( 'svg' ) . catch ( e = > e ) ;
2021-09-24 20:51:09 -07:00
expect ( error1 . message ) . toContain ( 'Node is not an HTMLElement' ) ;
2021-07-29 14:09:35 -07:00
const locator = page . locator ( 'svg' ) ;
const error2 = await locator . innerText ( ) . catch ( e = > e ) ;
2021-09-24 20:51:09 -07:00
expect ( error2 . message ) . toContain ( 'Node is not an HTMLElement' ) ;
2021-07-22 21:37:20 -07:00
} ) ;
2021-09-24 18:55:45 -07:00
it ( 'innerText should produce log' , async ( { page , server } ) = > {
await page . setContent ( ` <div>Hello</div> ` ) ;
const locator = page . locator ( 'span' ) ;
const error = await locator . innerText ( { timeout : 1000 } ) . catch ( e = > e ) ;
2022-11-04 15:19:16 -07:00
expect ( error . message ) . toContain ( 'waiting for locator(\'span\')' ) ;
2021-09-24 18:55:45 -07:00
} ) ;
2021-07-22 21:37:20 -07:00
it ( 'textContent should work' , async ( { page , server } ) = > {
await page . goto ( ` ${ server . PREFIX } /dom.html ` ) ;
2021-07-29 14:09:35 -07:00
const locator = page . locator ( '#inner' ) ;
expect ( await locator . textContent ( ) ) . toBe ( 'Text,\nmore text' ) ;
2021-07-22 21:37:20 -07:00
expect ( await page . textContent ( '#inner' ) ) . toBe ( 'Text,\nmore text' ) ;
} ) ;
it ( 'isEnabled and isDisabled should work' , async ( { page } ) = > {
await page . setContent ( `
< button disabled > button1 < / button >
< button > button2 < / button >
< div > div < / div >
` );
const div = page . locator ( 'div' ) ;
expect ( await div . isEnabled ( ) ) . toBe ( true ) ;
expect ( await div . isDisabled ( ) ) . toBe ( false ) ;
expect ( await page . isEnabled ( 'div' ) ) . toBe ( true ) ;
expect ( await page . isDisabled ( 'div' ) ) . toBe ( false ) ;
const button1 = page . locator ( ':text("button1")' ) ;
expect ( await button1 . isEnabled ( ) ) . toBe ( false ) ;
expect ( await button1 . isDisabled ( ) ) . toBe ( true ) ;
expect ( await page . isEnabled ( ':text("button1")' ) ) . toBe ( false ) ;
expect ( await page . isDisabled ( ':text("button1")' ) ) . toBe ( true ) ;
const button2 = page . locator ( ':text("button2")' ) ;
expect ( await button2 . isEnabled ( ) ) . toBe ( true ) ;
expect ( await button2 . isDisabled ( ) ) . toBe ( false ) ;
expect ( await page . isEnabled ( ':text("button2")' ) ) . toBe ( true ) ;
expect ( await page . isDisabled ( ':text("button2")' ) ) . toBe ( false ) ;
} ) ;
it ( 'isEditable should work' , async ( { page } ) = > {
2024-11-22 11:40:43 +00:00
await page . setContent ( `
< input id = input1 disabled >
< textarea > < / textarea >
< input id = input2 >
< div contenteditable = "true" > < / div >
< span id = span1 role = textbox aria-readonly = true > < / span >
< span id = span2 role = textbox > < / span >
< button > button < / button >
` );
2021-07-22 21:37:20 -07:00
await page . $eval ( 'textarea' , t = > t . readOnly = true ) ;
const input1 = page . locator ( '#input1' ) ;
expect ( await input1 . isEditable ( ) ) . toBe ( false ) ;
expect ( await page . isEditable ( '#input1' ) ) . toBe ( false ) ;
const input2 = page . locator ( '#input2' ) ;
expect ( await input2 . isEditable ( ) ) . toBe ( true ) ;
expect ( await page . isEditable ( '#input2' ) ) . toBe ( true ) ;
const textarea = page . locator ( 'textarea' ) ;
expect ( await textarea . isEditable ( ) ) . toBe ( false ) ;
expect ( await page . isEditable ( 'textarea' ) ) . toBe ( false ) ;
2024-11-22 11:40:43 +00:00
expect ( await page . locator ( 'div' ) . isEditable ( ) ) . toBe ( true ) ;
expect ( await page . locator ( '#span1' ) . isEditable ( ) ) . toBe ( false ) ;
expect ( await page . locator ( '#span2' ) . isEditable ( ) ) . toBe ( true ) ;
const error = await page . locator ( 'button' ) . isEditable ( ) . catch ( e = > e ) ;
expect ( error . message ) . toContain ( 'Element is not an <input>, <textarea>, <select> or [contenteditable] and does not have a role allowing [aria-readonly]' ) ;
2021-07-22 21:37:20 -07:00
} ) ;
2021-09-27 18:58:08 +02:00
it ( 'isChecked should work' , async ( { page } ) = > {
2021-07-22 21:37:20 -07:00
await page . setContent ( ` <input type='checkbox' checked><div>Not a checkbox</div> ` ) ;
const element = page . locator ( 'input' ) ;
expect ( await element . isChecked ( ) ) . toBe ( true ) ;
expect ( await page . isChecked ( 'input' ) ) . toBe ( true ) ;
await element . evaluate ( input = > ( input as HTMLInputElement ) . checked = false ) ;
expect ( await element . isChecked ( ) ) . toBe ( false ) ;
expect ( await page . isChecked ( 'input' ) ) . toBe ( false ) ;
const error = await page . isChecked ( 'div' ) . catch ( e = > e ) ;
expect ( error . message ) . toContain ( 'Not a checkbox or radio button' ) ;
} ) ;
2021-07-29 14:09:35 -07:00
2023-02-10 18:56:45 -08:00
it ( 'isChecked should work for indeterminate input' , async ( { page } ) = > {
it . info ( ) . annotations . push ( { type : 'issue' , description : 'https://github.com/microsoft/playwright/issues/20190' } ) ;
await page . setContent ( ` <input type="checkbox" checked> ` ) ;
await page . locator ( 'input' ) . evaluate ( ( e : HTMLInputElement ) = > e . indeterminate = true ) ;
expect ( await page . locator ( 'input' ) . isChecked ( ) ) . toBe ( true ) ;
await expect ( page . locator ( 'input' ) ) . toBeChecked ( ) ;
await page . locator ( 'input' ) . uncheck ( ) ;
expect ( await page . locator ( 'input' ) . isChecked ( ) ) . toBe ( false ) ;
await expect ( page . locator ( 'input' ) ) . not . toBeChecked ( ) ;
} ) ;
2021-09-27 18:58:08 +02:00
it ( 'allTextContents should work' , async ( { page } ) = > {
2021-07-29 14:09:35 -07:00
await page . setContent ( ` <div>A</div><div>B</div><div>C</div> ` ) ;
expect ( await page . locator ( 'div' ) . allTextContents ( ) ) . toEqual ( [ 'A' , 'B' , 'C' ] ) ;
} ) ;
2021-09-27 18:58:08 +02:00
it ( 'allInnerTexts should work' , async ( { page } ) = > {
2021-07-29 14:09:35 -07:00
await page . setContent ( ` <div>A</div><div>B</div><div>C</div> ` ) ;
expect ( await page . locator ( 'div' ) . allInnerTexts ( ) ) . toEqual ( [ 'A' , 'B' , 'C' ] ) ;
} ) ;
2021-12-02 13:04:15 -08:00
2022-01-26 07:58:58 -08:00
it ( 'should return page' , async ( { page , server } ) = > {
await page . goto ( server . PREFIX + '/frames/two-frames.html' ) ;
const outer = page . locator ( '#outer' ) ;
expect ( outer . page ( ) ) . toBe ( page ) ;
const inner = outer . locator ( '#inner' ) ;
expect ( inner . page ( ) ) . toBe ( page ) ;
const inFrame = page . frames ( ) [ 1 ] . locator ( 'div' ) ;
expect ( inFrame . page ( ) ) . toBe ( page ) ;
} ) ;