Как проверить, отображаются ли элементы в цикле while

#javascript #node.js #puppeteer

#javascript #node.js #кукловод

Вопрос:

Я использую puppeteer для сканирования данных, на сайте есть несколько хитрых трюков, чтобы скрыть данные, поэтому мне нужно выполнить цикл while (нажимайте 2 кнопки непрерывно, пока данные не появятся в DOM и не станут видимыми).

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

Это код:

 const puppeteer = require('puppeteer');
const iPhone = puppeteer.devices['iPhone X'];

(async () => {
    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();
    await page.emulate(iPhone);

    await page.goto('https://website.com/abcXyZ/');

    // countData is the number of the ul>li. When nothing show, its value is 0. When appeared, value is >0
    const countData = await page.evaluate(() => document.getElementsByClassName('js-list')[0].getElementsByTagName('li').length)

    while (countData < 1) {
        await page.click('.btn1')
        await page.waitForTimeout(600)
        await page.click('.bt2')
        await page.waitForTimeout(600)

        const isFound = await page.evaluate(() => document.body.contains(document.querySelector('.goWork')))
        if (isFound) break
    }
    await browser.close();
})();
 

Цикл выполняется только один раз и останавливается. Я хочу щелкнуть 2 btns, пока не появятся данные, и остановить цикл. Как я могу исправить этот код?

Спасибо

Ответ №1:

Есть много более простых способов сделать это, но это не ваш вопрос. Чтобы иметь возможность сказать, в чем проблема в вашем коде, нам нужно увидеть исходный код веб-страницы. Так что без этого я собираюсь сделать предположение.

 const isFound = await page.evaluate(() => document.body.contains(document.querySelector('.goWork')))
if (isFound) break
 

Приведенный выше код проверяет , что тело страницы содержит элемент с именем класса goWork . Если тело содержит его, вы разрываете цикл. Так что, возможно, в этом и заключается проблема. Похоже, что тело содержит элемент с goWork классом.

Комментарии:

1. И можете ли вы дать мне решения, чтобы упростить его, мой код кажется сложным. URL-адрес веб-сайта, который я хочу просмотреть, выглядит следующим образом v.douyin.com/Jts3CQf . Вы должны посетить его как мобильное устройство, и если вы не видите данных, вам нужно нажимать кнопки (желтую) непрерывно, пока не появятся данные.

2. Вы можете использовать waitForSelector метод кукольника. Проверьте эту ссылку pptr.dev/…

3. waitForSelector остановит цикл и будет ждать, в данном случае у меня это не работает. У меня есть вопрос, если вместо этого я использую метод http get request / fetch, будет ли он работать как кнопка нажатия?

4. Конечно waitForSelector , цикл остановится и будет ждать. Это то, что он делает. Вам нужно изменить свой код, чтобы работать с ним. Если вы пытаетесь щелкнуть ссылку и получить данные с этого URL, вы можете просто извлечь ее самостоятельно, не нажимая на нее. Он вернет вам исходный код URL-адреса. Вы можете попробовать сами и увидеть результат. Если вы хотите перейти к этому URL-адресу, вы можете просто использовать await page.goto(url)