Проверьте имя кнопки с частичной меткой, включая пробел

Я пытаюсь нажать кнопку со следующей строкой:

await page.getByRole('button', { name: '3 Employees' }).click();

Моя проблема в том, что имя кнопки меняется в зависимости от количества сотрудников, поэтому она не будет работать, если значение жестко запрограммировано. Я бы использовал метод локатора только со словом «Сотрудники», но он будет соответствовать другой кнопке с тем же локатором и тем же текстом «Сотрудники», и я также хотел бы избежать использования метода nth().

Что я действительно хочу сделать, так это использовать свою строку кода, но искать только часть «Сотрудники», то есть я хочу включить пробел между 3 и «Сотрудники». Или в этом случае есть какой-то способ проверить 3 как любое случайное значение, например «{randomvalue} Сотрудники»?

что касается регулярного выражения, вы можете использовать \d+ Employees. См.: regex101.com/r/xoCPlV/latest

DuesserBaest 11.04.2024 11:03

Пожалуйста, поделитесь немного больше контекста. Часто лучший способ выбора элемента зависит от его родительского дерева и других подобных элементов в документе. Но да, {name: /^\d+ employees$/} может подойти именно для этого элемента.

ggorlen 11.04.2024 16:50
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Использование регулярного выражения должно работать для этой конкретной кнопки, при условии, что на странице нет других элементов /^\d+ Employees$/:

import {expect, test} from "@playwright/test"; // ^1.42.1

const html = `<!DOCTYPE html><html><body>
<button></button>
<script>
setTimeout(() => {
  document.querySelector("button").textContent =
    ~~(Math.random() * 100) + " Employees";
}, 3000);
</script>
</body></html>`;

test("{n} Employees button can be clicked", async ({page}) => {
  await page.setContent(html);
  await page.getByRole("button", {name: /^\d+ Employees$/}).click();
});

Обратите внимание на привязки ^ и $, что делает их точным совпадением (кроме начальных/конечных пробелов). Если вы хотите использовать совпадение подстроки, опустите эти привязки.

Если есть другие элементы, соответствующие этому, вы, вероятно, захотите рассмотреть возможность использования родительской цепочки для изоляции конкретной кнопки, а не использования first/last/nth, чего вы правильно хотите избежать.

Наконец, если есть способ гарантировать, что страница отображает определенное количество сотрудников, я бы воспользовался этим. Я бы использовал приведенный выше код только в том случае, если действительно не существует хорошего способа более предсказуемого управления страницей.

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