Мне удалось успешно просмотреть веб-сайт, войти в систему и получить необходимую информацию. Однако, когда я переключаюсь на использование того же кода с безголовым, который является правдой, время ожидания истекает в каждой строке, где я пытаюсь ждать.

const self = {
  browser: null,
  page: null,

  initialize: async () => {
    self.browser = await puppeteer.launch({
      headless: true,
    });

    self.page = await self.browser.newPage();

    /* Go to homepage */
    await self.page.goto(SHIPT_URL, { waitUntil: "networkidle0" });
  },

getResults: async () => {
    await self.page.type("#email", email, { delay: 100 });
    await self.page.type("#password", password, { delay: 100 });
    let loginButton = await self.page.$("button.sc-fzplWN");
    if (loginButton) {
      await loginButton.click();
      await self.page.waitForNavigation({ waitUntil: "networkidle0" }); // Hangs here

      await self.page.waitForSelector("a.pointer.link.gray900"); // Hangs here if I remove above waitForNavigation

Я пытался исследовать это и пробовал несколько разных подходов, таких как настройка моего пользовательского агента, добавление .click и waitForNavigation в promise.all, удаление «waitUntil» в waitForNavigation и удаление ожидания на .click, но ничего не работает.

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

1
BillTaha 14 Апр 2020 в 19:21

1 ответ

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

Puppeteer устанавливает начальный размер страницы 800×600 пикселей, что определяет размер снимка экрана.

getResults: async () => {
await page.screenshot({path: 'example.png'});
await self.page.type("#email", email, { delay: 100 });
await self.page.type("#password", password, { delay: 100 });
let loginButton = await self.page.$("button.sc-fzplWN");
1
deepfriedmars 14 Апр 2020 в 19:31
Хм, так что вы правы насчет размера. На скриншоте показана только форма электронной почты. Значит, селекторы могут существовать только в том случае, если элемент виден на скриншоте? Я проведу некоторое исследование по этому поводу, так как я новичок в кукольнике. Спасибо за помощь
 – 
BillTaha
14 Апр 2020 в 19:39
Самый простой способ избежать проблем — попытаться установить размер экрана в puppeteer на размер, с которым вы работаете. https://github.com/puppeteer/puppeteer/ blob/v2.1.1/docs/api.md#pagesetviewportviewport
 – 
deepfriedmars
14 Апр 2020 в 19:50
Этот ответ, вероятно, спас меня от размышлений о том, что происходит. Спасибо. Вы можете установить область просмотра во время запуска: const browser = await puppeteer.launch({ headless: true, defaultViewport: { width: 1200, height: 900 } })
 – 
Trott
5 Ноя 2021 в 19:54