Получение списка элементов списка с помощью Playwright

Я пытаюсь написать приложение, где оно перейдет на Amazon и получит список книг на странице. Я использую Драматург как инструмент. Я могу попасть в нужный раздел, но не могу получить список книг. В Интернете в примерах используется page.$$(selector), но когда я пытаюсь это сделать, я получаю пустой массив. Эту информацию нашел здесь и здесь. Читая документы на $$, это кажется правильным решением, поскольку все элементы списка имеют одно и то же имя класса. Понятия не имею, что делаю не так, какие-нибудь советы по этому поводу?

Вот мой код на данный момент;

const AMAZON_KINDLE_EBOOK_STORE_URL = 'https://www.amazon.com/Best-Sellers-Kindle-Store-eBooks/zgbs/digital-text/154606011/ref=zg_bs_nav_kstore_1_kstore/';
(async () => {
    const browser = await chromium.launch();
    try {
        const amazonPage = await browser.newPage();
        await amazonPage.goto(AMAZON_KINDLE_EBOOK_STORE_URL);

        await amazonPage.waitForSelector('"Best Sellers in"');
        await amazonPage.click('"Self-Help"');
        await amazonPage.click('"Creativity"')

        const books = await amazonPage.$$('li[class="zg-item-immersion"]');
        console.log(books);
    } finally {
        await browser.close();
    }
})();

Для селектора я тоже пробовал множество способов;

  • li[class="zg-item-immersion"] - Это действительно работало, проверяя на консоли разработчика
  • 'zg-item-immersion'
  • #zg-item-immersion

person Dan    schedule 16.02.2021    source источник


Ответы (1)


Кажется, единственная проблема в том, что Plawright работает слишком быстро, и вы не ждете этих элементов li[class="zg-item-immersion"].

Я отлаживал скрипт, и с селектором все в порядке, поэтому в этой строке он возвращает 50 дескрипторов элементов:

const { chromium } = require('playwright');

const AMAZON_KINDLE_EBOOK_STORE_URL = 'https://www.amazon.com/Best-Sellers-Kindle-Store-eBooks/zgbs/digital-text/154606011/ref=zg_bs_nav_kstore_1_kstore/';
(async () => {
    const browser = await chromium.launch({ headless: false});
    try {
        const amazonPage = await browser.newPage();
        await amazonPage.goto(AMAZON_KINDLE_EBOOK_STORE_URL);

        await amazonPage.waitForSelector('"Best Sellers in"');
        await amazonPage.click('"Self-Help"');

        await Promise.all([
            amazonPage.waitForNavigation(),
            amazonPage.click('"Creativity"')
        ]);
        
        const books = await amazonPage.$$('li[class="zg-item-immersion"]');
        console.log(books);
    } finally {
        await browser.close();
    }
})();

возможно, вы сможете сделать то, что сделали несколькими строками выше и для селектора:

const { chromium } = require('playwright');

const AMAZON_KINDLE_EBOOK_STORE_URL = 'https://www.amazon.com/Best-Sellers-Kindle-Store-eBooks/zgbs/digital-text/154606011/ref=zg_bs_nav_kstore_1_kstore/';
(async () => {
    const browser = await chromium.launch({ headless: false});
    try {
        const amazonPage = await browser.newPage();
        await amazonPage.goto(AMAZON_KINDLE_EBOOK_STORE_URL);

        await amazonPage.waitForSelector('"Best Sellers in"');
        await amazonPage.click('"Self-Help"');
        await amazonPage.click('"Creativity"')

        await amazonPage.waitForSelector('li[class="zg-item-immersion"]');
        const books = await amazonPage.$$('li[class="zg-item-immersion"]');
        console.log(books);
    } finally {
        await browser.close();
    }
})();

Это тоже работает.

person pavelsaman    schedule 16.02.2021
comment
Спасибо @pavelsaman, это доставило мне удовольствие. Поэтому в любое время при изменении / обновлении страниц всегда используйте waitForSelector перед выполнением каких-либо действий. - person Dan; 17.02.2021