# 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(
"""
"""
)
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
\nyo
'
)
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"
)