get_by_text 在剧作家中到底返回什么?

问题描述 投票:0回答:1

我已经阅读了文档,但我仍然对剧作家 python 中的

get_by_text
方法有点困惑: 我有一个小代码演示,我尝试获取文本 Sr 的选择器。企业云和雪花架构师 那么我只想知道该选择器的性质,它是 div 还是 span 等..

from playwright.sync_api import sync_playwright
import os

my_path = os.getcwd()

html = open("l.html", "r", encoding="utf-8").read()



with sync_playwright() as p:
    chromium_path = f'{my_path}/chromium-1076/chrome-win/chrome.exe'
    browser = p.chromium.launch(executable_path=chromium_path, headless=False)
    page = browser.new_page()
    page.set_content(html)
    element = page.get_by_text("Sr. Enterprise Cloud & Snowflake Architect", exact=True)
    tag_name = element.evaluate("el => el.tagName")
    print(tag_name)
    browser.close()

我遇到的问题是这种严格模式违规,说实话我不明白:

playwright._impl._api_types.Error: Error: strict mode violation: get_by_text("Sr. Enterprise Cloud & Snowflake Architect", exact=True) resolved to 2 elements:
    1) <span aria-hidden="true">…</span> aka get_by_text("Sr. Enterprise Cloud & Snowflake Architect").first
    2) <span class="visually-hidden">…</span> aka get_by_text("Sr. Enterprise Cloud & Snowflake Architect").nth(1)

=========================== logs ===========================
waiting for get_by_text("Sr. Enterprise Cloud & Snowflake Architect", exact=True)

我想知道的是

get_by_text()
方法是否真的返回匹配文本的定位器或不返回,以及如果可能的话如何解决这个问题

python playwright playwright-python
1个回答
0
投票

page.get_by_text()
返回一个定位器,与
page.locator()
类似,但带有文本查询。

定位器是一种选择元素的声明方式。简单地调用

page.get_by_text("selector")
没有任何作用——它只是一个意图声明。因此,调用定位器变量
element
有点误导,因为尚未检索到任何元素。

稍后,一旦您运行

element.evaluate()
,定位器就会开始工作。 Playwright 运行定位器的选择,必要时等待它存在,然后在浏览器上下文中执行评估。

下一个概念是严格模式。默认情况下,如果您在定位器解析为多个元素时尝试执行单例操作,Playwright 会引发错误。该错误是一种安全措施,旨在避免将新元素引入到页面中,从而导致您之前的选择切换到您不想要的元素。该错误会提示您在定位器中更加具体,并提供代码来消除多个匹配项之间的歧义。

您可以禁用严格模式并始终选择第一个元素,但不鼓励这样做。我只是通过选择错误消息中显示的两个代码选项之一来增加定位器的特异性,或者找到更好的消除歧义的方法,如果您能够找出不同的方法(

l.html
的详细信息)以及你想要实现的目标的背景在这里很重要——没有一种万能的方法可以做到这一点)。

顺便说一句,想要从元素中提取

tagName
有点不寻常。 99% 的情况下,没有必要这样做,因此这要么是任何操作的存根,要么您可能正在追求反模式。您可能想为您正在尝试做的事情提供一些高级上下文。

© www.soinside.com 2019 - 2024. All rights reserved.