Puppeter - ссылка внутри iFrame - PullRequest
       8

Puppeter - ссылка внутри iFrame

0 голосов
/ 25 февраля 2019

Мне нужно получить рекламную ссылку под маркерами этой страницы .

Я пытаюсь использовать Puppeter, но у меня возникают проблемы, потому что объявление - это iframe!

Я могу успешно получить то, что мне нужно, с помощью консоли Chrome:

document.querySelector('#adContainer a').href

Puppetter

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  page.setViewport({width: 1440, height: 1000})
  await page.goto('https://www.amazon.co.uk/dp/B07DDDB34D', {waitUntil: 'networkidle2'})

  await page.waitFor(2500);

  const elementHandle = await page.$eval('#adContainer a', el => el.href);

  console.log(elementHandle);
  await page.screenshot({path: 'example.png', fullPage: false});

  await browser.close();
})();

Ошибка: ошибка: не удалось найти элементсоответствующий селектор "#adContainer a"

enter image description here

РЕДАКТИРОВАТЬ:

const browser = await puppeteer.launch();
  const page = await browser.newPage();
  page.setViewport({width: 1440, height: 1000})
  await page.goto('https://www.amazon.co.uk/dp/B07DDDB34D', {waitUntil: 'networkidle2'})

const adFrame = page.frames().find(frame => frame.name().includes('"adServer":"cs'))
const urlSelector = '#sp_hqp_shared_inner > div > a';
const url = await adFrame.$eval(urlSelector, element => element.textContent);
console.log(url);


  await browser.close();

Выполнить : https://try -puppeteer.appspot.com /

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

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

async getRequiredLink() {
    return await this.page.evaluate(() => {
        let iframe = document.getElementById('frame_id'); //pass id of your frame
        let doc = iframe.contentDocument; // changing the context to the working frame
        let ele = doc.querySelector('you-selector'); // selecting the required element
        return ele.href;
    });
}
0 голосов
/ 25 февраля 2019

Вам нужно выполнить этот запрос внутри самого фрейма, к которому можно обратиться через page.frames () :

const adFrame = page.frames().find(frame => frame.name().includes('<some text only appearing in name of this iFrame>');
const urlSelector = '#sp_hqp_shared_inner > div > a';
const url = await adFrame.$eval(urlSelector, element => element.textContent);
console.log(url);

Как я получил селектор этого URL: enter image description here

Отказ от ответственности Я сам не пробовал.Кроме того, я думаю, что соответствующий способ получить этот URL внутри iFrame - это что-то вроде this :

const url = await adFrame.evaluate((sel) => {
  return document.querySelectorAll(sel)[0].href;
}, urlSelector);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...