Puppeteer JS ожидает выбора нескольких выпадающих меню - PullRequest
0 голосов
/ 25 сентября 2018

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

Когда я загружаю страницу и пытаюсь выбрать выпадающие списки следующим образом:

  await page.evaluate(() => {
  document.querySelector('#paper > option:nth-child(2)').selected = true;
  document.querySelector('#color > option:nth-child(3)').selected = true;
  document.querySelector('#coating > option:nth-child(2)').selected = true;
  })

Яне в состоянии выбрать выпадающие.Я думаю, что это потому, что страница еще не загружена.Чтобы попытаться это исправить, я добавил анодный модуль с именем sleep.

Я импортирую спящий модуль следующим образом:

const sleep = require('sleep');

, а затем пытаюсь сделать сон на одну секунду между каждым селектором, такэто даст ему время для загрузки.

  sleep.sleep(1);
  await page.evaluate(() => {
  document.querySelector('#paper > option:nth-child(2)').selected = true;
  sleep.sleep(1);
  document.querySelector('#color > option:nth-child(3)').selected = true;
  sleep.sleep(1);
  document.querySelector('#coating > option:nth-child(2)').selected = true;
  })

Моя проблема в том, что первый сон работает.Однако sleep.sleep (1) внутри страницы await page.evaluate говорит, что sleep не определен.Я не уверен, почему это происходит, потому что const sleep объявлен в верхней части моего документа, поэтому он должен иметь глобальный охват.Кто-нибудь может подсказать мне, почему сон не работает?

1 Ответ

0 голосов
/ 25 сентября 2018

Вы должны использовать page.waitForSelector(), чтобы убедиться, что элементы загружены, прежде чем пытаться изменить соответствующие атрибуты selected:

await Promise.all([
    page.waitForSelector( '#paper > option:nth-child(2)' ),
    page.waitForSelector( '#color > option:nth-child(3)' ),
    page.waitForSelector( '#coating > option:nth-child(2)' )
]);

await page.evaluate( () => {
    document.querySelector( '#paper > option:nth-child(2)' ).selected   = true;
    document.querySelector( '#color > option:nth-child(3)' ).selected   = true;
    document.querySelector( '#coating > option:nth-child(2)' ).selected = true;
});

Причина, по которой ваш sleepфункция не работает внутри page.evaluate() потому, что код внутри функции выполняется в среде DOM страницы, а не в среде Node.js / Puppeteer.

Вы можете передавать аргументы page.evaluate(), но аргументы должны быть сериализуемыми :

const example = 'Hello, world!';
const result  = await page.evaluate( passed_argument => passed_argument, example );

console.log( result ); // 'Hello, world!'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...