# 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 re import pytest from playwright.async_api import Error, Page, expect async def test_has_text_and_internal_text_should_match_full_node_text_in_strict_mode( page: Page, ) -> None: await page.set_content( """
helloworld
hello
""" ) await expect(page.get_by_text("helloworld", exact=True)).to_have_id("div1") await expect(page.get_by_text("hello", exact=True)).to_have_id("div2") await expect(page.locator("div", has_text=re.compile("^helloworld$"))).to_have_id("div1") await expect(page.locator("div", has_text=re.compile("^hello$"))).to_have_id("div2") await page.set_content( """
helloworld
hello
""" ) await expect(page.get_by_text("helloworld", exact=True)).to_have_id("div1") assert await page.get_by_text("hello", exact=True).evaluate_all( "els => els.map(e => e.id)" ) == ["span1", "span2"] await expect(page.locator("div", has_text=re.compile("^helloworld$"))).to_have_id("div1") await expect(page.locator("div", has_text=re.compile("^hello$"))).to_have_id("div2") async def test_should_work(page: Page) -> None: await page.set_content( """
yo
ya
\nye
""" ) assert await page.eval_on_selector("text=ya", "e => e.outerHTML") == "
ya
" assert await page.eval_on_selector('text="ya"', "e => e.outerHTML") == "
ya
" assert await page.eval_on_selector("text=/^[ay]+$/", "e => e.outerHTML") == "
ya
" assert await page.eval_on_selector("text=/Ya/i", "e => e.outerHTML") == "
ya
" assert await page.eval_on_selector("text=ye", "e => e.outerHTML") == "
\nye
" assert ">\nye " in await page.get_by_text("ye").evaluate("e => e.outerHTML") await page.set_content( """
ye
ye
""" ) assert await page.eval_on_selector('text="ye"', "e => e.outerHTML") == "
ye
" assert "> ye " in await page.get_by_text("ye", exact=True).first.evaluate( "e => e.outerHTML" ) await page.set_content( """
yo
"ya
hello world!
""" ) assert await page.eval_on_selector('text="\\"ya"', "e => e.outerHTML") == '
"ya
' assert ( await page.eval_on_selector("text=/hello/", "e => e.outerHTML") == "
hello world!
" ) assert ( await page.eval_on_selector("text=/^\\s*heLLo/i", "e => e.outerHTML") == "
hello world!
" ) await page.set_content( """
yo
ya
hey
hey
""" ) assert await page.eval_on_selector("text=hey", "e => e.outerHTML") == "
hey
" assert await page.eval_on_selector('text=yo>>text="ya"', "e => e.outerHTML") == "
ya
" assert await page.eval_on_selector('text=yo>> text="ya"', "e => e.outerHTML") == "
ya
" assert await page.eval_on_selector("text=yo >>text='ya'", "e => e.outerHTML") == "
ya
" assert ( await page.eval_on_selector("text=yo >> text='ya'", "e => e.outerHTML") == "
ya
" ) assert await page.eval_on_selector("'yo'>>\"ya\"", "e => e.outerHTML") == "
ya
" assert await page.eval_on_selector("\"yo\" >> 'ya'", "e => e.outerHTML") == "
ya
" await page.set_content( """
yo
yo
""" ) assert ( await page.eval_on_selector_all("text=yo", "es => es.map(e => e.outerHTML).join('\\n')") == '
yo
\n
yo
' ) await page.set_content("
'
\"
\\
x
") assert await page.eval_on_selector("text='\\''", "e => e.outerHTML") == "
'
" assert await page.eval_on_selector("text='\"'", "e => e.outerHTML") == '
"
' assert await page.eval_on_selector('text="\\""', "e => e.outerHTML") == '
"
' assert await page.eval_on_selector('text="\'"', "e => e.outerHTML") == "
'
" assert await page.eval_on_selector('text="\\x"', "e => e.outerHTML") == "
x
" assert await page.eval_on_selector("text='\\x'", "e => e.outerHTML") == "
x
" assert await page.eval_on_selector("text='\\\\'", "e => e.outerHTML") == "
\\
" assert await page.eval_on_selector('text="\\\\"', "e => e.outerHTML") == "
\\
" assert await page.eval_on_selector('text="', "e => e.outerHTML") == '
"
' assert await page.eval_on_selector("text='", "e => e.outerHTML") == "
'
" assert await page.eval_on_selector('"x"', "e => e.outerHTML") == "
x
" assert await page.eval_on_selector("'x'", "e => e.outerHTML") == "
x
" with pytest.raises(Error): await page.query_selector_all('"') with pytest.raises(Error): await page.query_selector_all("'") await page.set_content("
'
\"
") assert await page.eval_on_selector('text="', "e => e.outerHTML") == '
"
' assert await page.eval_on_selector("text='", "e => e.outerHTML") == "
'
" await page.set_content("
Hi''>>foo=bar
") assert ( await page.eval_on_selector("text=\"Hi''>>foo=bar\"", "e => e.outerHTML") == "
Hi''>>foo=bar
" ) await page.set_content("
Hi'\">>foo=bar
") assert ( await page.eval_on_selector('text="Hi\'\\">>foo=bar"', "e => e.outerHTML") == "
Hi'\">>foo=bar
" ) await page.set_content("
Hi>>
") assert await page.eval_on_selector('text="Hi>>">>span', "e => e.outerHTML") == "" assert ( await page.eval_on_selector("text=/Hi\\>\\>/ >> span", "e => e.outerHTML") == "" ) await page.set_content("
a
b
a
") assert await page.eval_on_selector("text=a", "e => e.outerHTML") == "
a
b
" assert await page.eval_on_selector("text=b", "e => e.outerHTML") == "
a
b
" assert await page.eval_on_selector("text=ab", "e => e.outerHTML") == "
a
b
" assert await page.query_selector("text=abc") is None assert await page.eval_on_selector_all("text=a", "els => els.length") == 2 assert await page.eval_on_selector_all("text=b", "els => els.length") == 1 assert await page.eval_on_selector_all("text=ab", "els => els.length") == 1 assert await page.eval_on_selector_all("text=abc", "els => els.length") == 0 await page.set_content("
") await page.eval_on_selector( "div", """div => { div.appendChild(document.createTextNode('hello')) div.appendChild(document.createTextNode('world')) }""", ) await page.eval_on_selector( "span", """span => { span.appendChild(document.createTextNode('hello')) span.appendChild(document.createTextNode('world')) }""", ) assert await page.eval_on_selector("text=lowo", "e => e.outerHTML") == "
helloworld
" assert ( await page.eval_on_selector_all("text=lowo", "els => els.map(e => e.outerHTML).join('')") == "
helloworld
helloworld" ) await page.set_content("Sign inHello\n \nworld") assert ( await page.eval_on_selector("text=Sign in", "e => e.outerHTML") == "Sign in" ) assert len((await page.query_selector_all("text=Sign \tin"))) == 1 assert len((await page.query_selector_all('text="Sign in"'))) == 1 assert ( await page.eval_on_selector("text=lo wo", "e => e.outerHTML") == "Hello\n \nworld" ) assert ( await page.eval_on_selector('text="Hello world"', "e => e.outerHTML") == "Hello\n \nworld" ) assert await page.query_selector('text="lo wo"') is None assert len((await page.query_selector_all("text=lo \nwo"))) == 1 assert len(await page.query_selector_all('text="lo \nwo"')) == 0 await page.set_content("
let'shello
") assert ( await page.eval_on_selector("text=/let's/i >> span", "e => e.outerHTML") == "hello" ) assert ( await page.eval_on_selector("text=/let\\'s/i >> span", "e => e.outerHTML") == "hello" )