Puppeteer page.mouse.down() / up() не совпадает с щелчком физической мыши?

avatar
blitter
8 августа 2021 в 15:39
1230
3
4

На следующем сайте после ввода такой поисковой фразы, как "ребенок" (попробуйте!), вызов Кукловода page.mouse.down() не имеет такого же эффекта, как щелчок и удерживание физической мыши: https: //www.dextools.io/app/bsc

После ввода поисковой фразы появляется фальшивое раскрывающееся меню выбора, которое на самом деле является UL, и я пытаюсь щелкнуть первый результат поиска. Поэтому я использую такой код

await page.mouse.move(200, 350); // let's assume this is inside the element I want
await page.mouse.down();
await new Promise((resolve) => setTimeout(resolve, 2000)); // wait 2 secs
await page.mouse.up();

Ожидаемый эффект от этого кода заключается в том, что в течение 2 секунд, пока Puppeteer «удерживает» кнопку мыши, поддельное раскрывающееся меню остается видимым, а когда Puppeteer «отпускает» кнопку мыши, сайт перенаправляется на результат поиска. для выбранного элемента.

Это именно то, что происходит, когда я использую физическую мышь.

Однако в случае с Puppeteer раскрывающийся список просто исчезает, как если бы я нажал клавишу Escape, а команда page.mouse.up() позже больше не действует.

Мне известно, что PPT имеет некоторые особенности в отношении мыши, клавиатуры, удержания и отпускания кнопок и клавиш-модификаторов, особенно при одновременном выполнении всего вышеперечисленного. Например, Drag & Drop не работает должным образом, но ни один из предложенных здесь способов обхода мне не подходит:

Источник

Ответы (3)

avatar
vsemozhebuty
26 августа 2021 в 21:25
0

Я не могу воспроизвести проблему с этим тестовым скриптом. Ссылка нажата со следующей навигацией:

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({ headless: false, defaultViewport: null });

try {
  const [page] = await browser.pages();

  await page.goto('https://www.dextools.io/app/bsc', { timeout: 0 });

  const input = await page.waitForSelector('.input-container input');
  await input.type('baby');

  const link = await page.waitForSelector('.suggestions-container.is-visible a:not(.text-sponsor)');
  await link.click();
} catch (err) { console.error(err); }
blitter
27 августа 2021 в 22:41
1

Вы правы, ВТФ!?! Теперь мне нужно понять, что такого в моем коде, который дал сбой... и вы выиграете награду!

avatar
Pierre Lovergne
23 августа 2021 в 12:17
0

После того, как у вас есть элемент списка, который вы хотите щелкнуть, вы должны найти первый тег <a> внутри этого элемента и использовать ссылку, которую вы делаете на этот <a>, чтобы выполнить щелчок.

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

const [response] = await Promise.all([
  page.waitForNavigation(waitOptions),
  page.click(selector, clickOptions),
]);

где селектор будет ссылкой на упомянутый тег <a>.

blitter
23 августа 2021 в 16:01
0

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

Pierre Lovergne
24 августа 2021 в 08:10
0

Хм, хорошо, а не могли бы вы убедиться, что при нажатии вы находитесь внутри элемента?

ggorlen
24 августа 2021 в 18:27
0

«сайты, которые не хотят быть заблокированными, могут заметить эти простые способы» — действительно ли вы были заблокированы, делая это, или вы преждевременно оптимизируете? page.click — это макрос для перемещения мыши к элементу, запускающий события вниз/вверх. Он не использует собственный браузер el.click(). Я бы просто сделал это. Если вас заблокируют, почему бы не попробовать сначала slowMo, а потом использовать технику перетаскивания, которая кажется не относящейся к странице? Это похоже на проблему XY или, по крайней мере, косвенно относящуюся к выполнению X, чтобы погрузиться в то, как события Puppeteer работают в целом.

Pierre Lovergne
25 августа 2021 в 06:15
0

puppeteer github - помощник мыши С помощью этого помощника вы можете увидеть, где находится курсор в небезголовом, чтобы вы могли видеть, щелкает ли кукловод элемент.

blitter
25 августа 2021 в 23:01
0

Спасибо, все предложения имеют смысл, но не решают проблему. В любом случае, когда я пытаюсь использовать mouse.down() или page.click(), рассматриваемый элемент «исчезает» (возможно, он становится невидимым?), и я не перенаправляюсь на якорь href. Однако при физическом щелчке мыши элемент остается (не скрывается), а при освобождении он выполняет <a href>, т. е. перенаправляет меня. Поверьте мне, я проверил координаты x, y и физическое положение курсора мыши. Это не вопрос слишком быстрой оптимизации, она также не работает медленным способом. если бы это сработало, я бы жил с замедленной съемкой, но...

avatar
rexessilfie
19 августа 2021 в 04:26
0

Вместо двух отдельных операций мыши вниз и вверх вы можете попробовать это в соответствии с документами puppeteer:

// selector would uniquely identify the button on your page that you would like to click
selector = '#dropdown-btn'
await page.click(selector, {delay: 2000})
blitter
21 августа 2021 в 08:43
0

Спасибо, я последовал вашему совету, но это не имеет значения. Обратите внимание, что моей конечной целью не является удержание фальшивого выпадающего списка в течение любого промежутка времени. Моя цель - выполнить поиск. То, что выпадающее меню исчезает при наведении мыши, а не при поднятии мыши, является скорее симптомом, чем корнем проблемы. Это показывает нам, что физические щелчки мыши (мышь вниз + мышь вверх) «маршрутизируются по-другому» к месту назначения в DOM Chrome, чем «виртуальные щелчки» (события DOM «мышь вниз» и «мышь вверх»). Каким-то образом этому веб-сайту удалось прослушать физический «маршрут» и игнорировать «управляемый событиями» маршрут.

rexessilfie
23 августа 2021 в 00:51
0

Спасибо за более глубокое объяснение проблемы. Это озадачивает. Интересно, не могли бы вы попытаться точно определить, какие события DOM происходят в кукловоде, а какие при использовании физической мыши, чтобы увидеть, какие (если есть) потеряны в экземпляре кукловода. Если он постоянно теряется (возможно, из-за отсутствия физической мыши), возможно, вы могли бы временно попытаться запустить их вручную? Этот суть, по-видимому, вручную инициирует некоторые события. Я надеюсь, что вам повезет в этом!