Я прочитал новейшую документацию Puppeteer v22.x о XPath, но до сих пор не знаю, как использовать XPath в Puppeteer 22.x.
Я хочу щелкнуть элемент, содержащий текст «Далее». Вот HTML-код с кнопкой «Далее»:
<div class = "bla bla bla" role = "button" tabindex = "0">Next</div>
Вот поведение, которое я проанализировал:
role = "button" в качестве индикатора кнопки, потому что на этой странице много тегов, использующих role = "button" в своих атрибутах.Вот что я пробовал:
await page.waitForSelector("xpath/div[@role='button' and text()='Next']");
await page.waitForSelector("//div[@role='button' and text()='Next']");



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Когда вы используете XPath, вам обычно нужно добавить к выражению префикс //, чтобы глубже погрузиться в дерево HTML:
const puppeteer = require("puppeteer"); // ^22.7.1
const html = `<div class = "bla bla bla" role = "button" tabindex = "0">Next</div>`;
let browser;
(async () => {
browser = await puppeteer.launch();
const [page] = await browser.pages();
await page.setContent(html);
const el = await page.waitForSelector(
"xpath///div[@role='button' and text()='Next']"
);
console.info(await el.evaluate(el => el.textContent)); // => Next
await el.click();
})()
.catch(err => console.error(err))
.finally(() => browser?.close());
Я бы также использовал normalize-space() вместо text(), чтобы справиться с наличием пробелов.
А еще лучше использовать p-селектор вместе с CSS: '[role = "button"]::-p-text(Next)' вместо XPath (хотя это будет совпадение текста подстроки, что может не подойти для вашего варианта использования).
Смотрите также:
Это
await page.waitForSelector("xpath///div[@role='button' and text()='Next']");илиawait page.waitForSelector("::-p-xpath(//div[@role='button' and text()='Next'])");