page.$eval и page.$$eval оба метода возвращают значение, если сам pageFunction возвращает обещание (я полагаю, что это очень редкий случай с кукловодом, если они этого не сделают, большинство методов кукловода возвращают обещания).

page. $$ eval (селектор, pageFunction [, ... args])

Все задокументированные варианты использования возвращают значение:

const divCount = await page.$$eval('div', divs => divs.length);
const options = await page.$$eval('div > span.options', options => options.map(option => option.textContent));

Вопрос

Но можем ли мы использовать page.$eval / page.$$eval для выполнения методов, которые взаимодействуют только с браузером без возврата полезного значения (например, page.click или page.type), особенно если по очень похожей причине мы считаем это плохой практикой использования Array.map, когда мы не используем возвращенный массив? Мне любопытно, потому что таким образом мы могли бы упростить сценарии, в которых использование Array.forEach проблематично.

Он работает, но стоит ли его использовать?

const clickAll = await page.$$eval('button', links => links.forEach(link => link.click()));

Примечание. Для меня создание const не имеет смысла, поскольку мы не можем использовать ссылку clickAll где-либо еще. Я бы предпочел использовать это само по себе, не объявляя об этом.

3
theDavidBarton 25 Июн 2020 в 17:12

1 ответ

Лучший ответ

Вы можете рассматривать это как обычный javascript function, он может возвращать значение или нет, и вы можете использовать эту функцию возврата или нет. Вам не нужна эта переменная clickAll.

await page.$$eval('button', links => links.forEach(link => link.click()));
1
hardkoded 26 Июн 2020 в 18:29