TypeError: объект «Локатор» нельзя вызвать с помощью .first() в Playwright

У меня есть кнопка на веб-странице, которая выглядит следующим образом:

<button rpl = "" aria-controls = "comment-children" aria-expanded = "true" aria-label = "Toggle Comment Thread" class = "text-neutral-content-strong bg-neutral-background overflow-visible w-md h-md
button-small px-[var(--rem6)]
button-plain


icon
items-center justify-center
button inline-flex "> <!--?lit$747127195$--><!----><span class = "flex items-center justify-center"> <!--?lit$747127195$--><span class = "flex"><!--?lit$747127195$--><svg rpl = "" fill = "currentColor" height = "16" icon-name = "leave-outline" viewBox = "0 0 20 20" width = "16" xmlns = "http://www.w3.org/2000/svg"> <!--?lit$747127195$--><!--?lit$747127195$--><path d = "M14 10.625H6v-1.25h8v1.25ZM20 10a10 10 0 1 0-10 10 10.011 10.011 0 0 0 10-10Zm-1.25 0A8.75 8.75 0 1 1 10 1.25 8.76 8.76 0 0 1 18.75 10Z"></path><!--?--> </svg></span> <!--?lit$747127195$--> </span> <!--?lit$747127195$--><!--?--><!----><!----><!----> </button>

Я хочу реализовать это с помощью Playwright в своем коде Python. Я написал:

page.locator('button[aria-label = "Toggle Comment Thread"]').first().click()

К сожалению, это выдает мне ошибку TypeError: 'Locator' object is not callable. Когда я не использую first(), там написано

Error: Error: strict mode violation: locator("button[aria-label=\"Toggle Comment Thread\"]") resolved to 3 elements:

и это правда, на странице 3 кнопки. Я просто хочу нажать на первый.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
462
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте .first вместо .first():

page.locator('button[aria-label = "Toggle Comment Thread"]').first.click()

Запускаемый пример:

from playwright.sync_api import sync_playwright # 1.40.0

html = '<button aria-label = "Toggle Comment Thread"></button>'

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.set_content(html)
    page.locator('button[aria-label = "Toggle Comment Thread"]').first.click()
    browser.close()

Тем не менее, get_by_role предпочтительнее:

page.get_by_role("button", name = "Toggle Comment Thread").first.click()

И старайтесь избегать .first; найдите более строгий способ уникальной идентификации элемента (возможно, с использованием одного из многих его свойств), а не полагайтесь на порядок элементов на странице, который может неожиданно измениться.

Другие вопросы по теме