Читая документацию, я обнаружил, что использование функции click() элемента page не рекомендуется, как мы видим здесь.
Вместо этого мы можем использовать метод locator.click(), как показано здесь.
Мне интересно понять, есть ли какая-то техническая разница между этими двумя методами, и если да, то в чем именно эта разница.
Недавно я обновляю кучу старых функций, созданных год назад или около того, и по некоторым причинам, когда меняю, например
await this.page.click('.add-card')
с
await this.page.locator('.add-card').click()
поведение меняется, и некоторые элементы больше не ждут; поэтому тест не пройден.
Я почти уверен, что мне нужно изменить остальную часть кода, прежде чем пытаться запустить все снова, поскольку я думаю, что проблема связана не с этим изменением, а с наличием различных старых функций.
Но тем не менее мне интересно лучше понять, меняется ли что-то в функции click, или вообще ничего не меняется.
Спасибо! В каком-то смысле это интересно, однако предложение использовать await page.$() не очень полезно, так как это тоже не рекомендуется ( playwright.dev/docs/api/class-page#page-query-selector ), но это уже шаг вперед впереди для меня
да, не полагайтесь на $, $$ и .$eval, они устарели. Вам следует использовать locator() или getBy....().
@KlimBim Спасибо за ресурс, но мне эта статья кажется не очень хорошей, поскольку она предлагает всевозможные устаревшие методы, такие как page.$. Тем не менее, это действительно хороший момент в отношении строгости.
@ggorlen, ты прав, извини. Интересна была бы только часть «Зачем использовать locator.click() вместо page.click()».





page.click() выполняет автоматическое ожидание, так что это не имеет значения. Я могу предложить ряд причин отдать предпочтение локаторам:
page.click() по умолчанию не обеспечивает строгости, поэтому, если на странице два элемента, он без ошибки щелкнет первый, тогда как locator.click() выдаст ошибку, если есть какая-либо двусмысленность. Это позволяет избежать регрессий и помогает гарантировать, что обнаруженный вами элемент останется стабильным.page.action() не существует, что приводит к созданию согласованных наборов тестов, которые в основном состоят из getByRole и нескольких других ключевых методов. У Playwright довольно обширный и сложный API, поэтому все, что вы можете сделать, чтобы запретить часть его методов, — это хорошо.page.click() вам придется перезаписывать строку селектора (или использовать строковую константу) при каждом вызове, что наносит ущерб возможности повторного использования. С помощью локаторов вы можете объявить локатор один раз в конструкторе POM, а затем со временем выполнять с ним множество различных действий.page.locator(selector).action(options) снова и снова в разных формах, есть определенный ритм, не нарушаемый идиомой page.action(selector, options). Некоторые пользователи Playwright не понимают, где расположены параметры, и, возможно, не используют TypeScript, поэтому последовательное соблюдение второго шаблона может улучшить ясность.page.locator(). Другими локаторами являются page.getByRole(), page.getByLabel(), page.getByText() и подобные методы, которые обеспечивают видимый пользователю выбор лучших практик. Если вы используете page.click(), вы, скорее всего, используете CSS или XPath, которые не рекомендуются. API пытается заставить вас использовать page.getByRole(), даже вместо обычного page.locator(), а также page.click(), page.$() и т. д.page.action(). Отсутствие цепочек может привести к чрезмерному использованию CSS и XPath для устранения неоднозначности выбора.page.click() — это экономия нескольких нажатий клавиш.Вы написали
Недавно я обновляю кучу старых функций, созданных год назад или около того, и по некоторым причинам, когда меняю, например
await this.page.click('.add-card')сawait this.page.locator('.add-card').click()поведение меняется, и некоторые элементы больше не ждут; поэтому тест не пройден.
Это не имеет смысла. locator.click() определенно авто-ожидание, поэтому единственная ошибка, которую я могу себе представить, связана со строгостью (соответствие более чем одному элементу). Чтобы получить помощь, вам нужно будет поделиться минимальным, воспроизводимым примером и полной трассировкой стека или ошибкой утверждения. Распространенной ошибкой является невыполнение await действия локатора, поэтому сначала проверьте это.
спасибо за четкое объяснение, это именно то, что мне нужно! К сожалению, я не могу привести пример, потому что код не зависит от меня (я занимаюсь контролем качества в компании), поэтому я задал этот вопрос, чтобы точно узнать поведение двух функций и попытаться самостоятельно понять, в чем проблема. Вероятно, проблема связана с кодом приложения, а не с тестовым кодом, поэтому мне нужно найти ее и сообщить об этом. Я почти уверен, что проблема в строгости и ошибке видимости пары элементов.
Все равно было бы неплохо попытаться создать минимальный пример с нуля. Проблема может быть в чем-то другом, чем вы предполагаете.
Поможет ли вам статья ?