Кукловод, возвращающий пустой объект - PullRequest
0 голосов
/ 06 марта 2019

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

document.querySelector('#sb-site > div.sticky_footer > div:nth-child(9)')

Однако, когда я запускаю это в моей программе, консоль регистрирует это и возвращает '{}'

const inputContent = await page.evaluate(() => {
return document.querySelector('#sb-site > div.sticky_footer > div:nth-child(9)'); });

Ответы [ 3 ]

1 голос
/ 07 марта 2019

puppeteer может передавать два типа данных между Node.js и контекстом браузера: сериализуемые данные (т.е. данные, которые поддерживаются JSON.stringify() / JSON.parse()) и идентификаторы объектов JavaScript (включая элементы DOM) - JSHandle и ElementHandle.Более поздние имеют немного более сложный API (см. Методы JSHandle и ElementHandle или методы, которые их упоминают).

page.evaluate() может передавать только сериализуемые данные, а вместо несериализуемых данных возвращает undefined илипустые предметы.Элементы DOM не сериализуемы, поскольку содержат циклические ссылки и методы.

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

0 голосов
/ 06 марта 2019

В вашем случае вы пытаетесь выбрать пользовательский объект dom, внедренный в страницу, что приводит к некоторому странному поведению при использовании селектора nth-child() css. Так что вместо этого вы должны попытаться напрямую нацелиться на узел DOM. Допустим, вы пытались получить подобный элемент здесь https://wefunder.com/chattanoogafc

Вы можете сделать:

const inputContent = await page.evaluate(async () => {
  var elements =  document.querySelectorAll("#sb-site > div.sticky_footer > div")[3].querySelectorAll("*")[0];
  return elements.getAttribute("company-json");
});

console.log("test:" + inputContent);

И это должно вернуть JSON, который вы хотите. Затем вы можете разобрать его, используя JSON.parse(inputContent)

0 голосов
/ 06 марта 2019

Убедитесь, что страница полностью загружена перед очисткой.

page.goto(url, {waitUntil: 'networkidle0'})

Также, согласно , документы , .evaluate вернут promise, не вернут элемент DOM.

На консоли будет напечатано {} или значение, разрешенное обещанием, на консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...