Когда я использую document.querySelector в консоли Chrome, я что-то получаю, однако когда я использую тот же запрос с puppeeter. Я получаю «undefined» или «Promise {}».

    const text = await page.evaluate(() => document.querySelector('div.tagCloud-slotAble.space--mv-2 > button:nth-child(1)'));
console.log(text)

Спасибо

5
Gryz 15 Сен 2018 в 14:13

2 ответа

Лучший ответ

Насколько я могу судить, причина, по которой вы не можете вернуть свой текст и вывести его на консоль, происходит по двум причинам:

  • Вы не возвращаете значение из своего метода evaluate.
  • Вы получаете элемент, но не текстовое содержимое элемента.

Если вы сделаете что-то вроде следующего, это должно решить вашу проблему:

const text = await page.evaluate(() => {
  const uiElement = document.querySelector('div.tagCloud-slotAble.space--mv-2 > button:nth-child(1)'));
  return uiElement.textContent;
});
console.log(text);

Альтернативой указанной выше функции является использование метода кукловодов $eval следующим образом:

const elementSelector = 'div.tagCloud-slotAble.space--mv-2 > button:nth-child(1)';
const text = await page.$eval(elementSelector, (uiElement) => {
  return uiElement.textContent;
});
console.log(text);

Я лично предпочитаю второй вариант (с использованием $eval), но это вопрос предпочтений. Оба делают одно и то же.

Следует отметить, что все, что вы запускаете в методах evaluate или $eval, выполняется в вашем контексте страницы , т.е. он выполняется на веб-странице, которая в данный момент открыта в удаленном браузере. Вы можете в основном использовать этот метод для внедрения новых элементов пользовательского интерфейса в вашу веб-страницу во время теста, выполнения кода JavaScript внутри вашей веб-страницы и т. Д.

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

1
AJC24 17 Сен 2018 в 08:25

Это потому, что querySelector возвращает узел. Попробуйте вернуть innerText,

const text = await page.evaluate(() => document.querySelector('div.tagCloud-slotAble.space--mv-2 > button:nth-child(1)').innerText);
console.log(text)
2
Md. Abu Taher 15 Сен 2018 в 13:05