Короткий ответ
page.evaluate(() => document.querySelector('SELECTOR').click());
просто запускает событие click
page.click('SELECTOR')
пытается имитировать c поведение человека при нажатии
Объяснение
Давайте проверим документацию для обоих методов, чтобы действительно понять, что происходит.
page.evaluate(() => document.querySelector('SELECTOR').click());
Давайте посмотрим, что документация MDN говорит:
[...] Он запускает событие щелчка элемента.
Это все, что он делает. Он just запускает событие click
, так что вызываются все обработчики, прослушивающие это событие нажатия элемента. Это означает, что ему все равно, находится ли элемент за пределами текущего окна просмотра. Элемент может быть даже скрыт (через CSS), и событие click
будет по-прежнему срабатывать.
Давайте сравним это с «пути кукловода»:
page.click
Часть документации кукловода , касающаяся page.click
:
Этот метод выбирает элемент с selector
, прокручивает его, если необходимо, и затем использует page.mouse
, чтобы щелкнуть в центре элемента. [...]
Это означает, что кукловод подражает человеческому поведению здесь. Сначала элемент прокручивается в поле зрения, затем мышь перемещается поверх элемента (вызывая любые другие события, такие как mouseover
, mouseenter
, et c. В пути). Наконец, кнопка нажата путем симуляции мыши (см. Соответствующий класс Mouse
в коде кукловода). Это также вызывает любые связанные события (например, mousedown
).
Сложным библиотекам пользовательского интерфейса может не понравиться, когда вы сами запускаете JavaScript события. Имейте в виду, они часто оптимизированы для взаимодействия с человеком, а не для взаимодействия с ботами. Это означает, что библиотека пользовательского интерфейса может прослушивать событие mousedown
или mouseenter
(в качестве примера) вместо непосредственного прослушивания события click
.
"Человекоподобный"
При взаимодействии с неизвестным веб-сайтом лучше всего стараться вести себя как можно более человечно. Даже на страницах, которые не имеют каких-либо определенных c "противоботовых" мер, могут использоваться фреймворки, которые ожидают определенного c потока событий.
Кстати, вы не единственный, кто имеет это проблема. Проверьте эти вопросы на наличие похожих проблем: