Как убедиться, что клик завершен? - PullRequest
0 голосов
/ 21 октября 2019

Я использую следующий код для запроса https://www.genecards.org/cgi-bin/carddisp.pl?gene=BSCL2

#!/usr/bin/env node
// vim: set noexpandtab tabstop=2:

const puppeteer = require('puppeteer');
const fs = require('fs').promises;

const url = process.argv[2];

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    try {
        await page.goto(url, { waitUntil: 'networkidle2' });
        const content = await page.content();
        //console.log(content);
        page.on('response', async response => {
            console.log("xxx" + response.url());
            response.buffer().then(function(data) {
                fs.writeFile('/tmp/response.json', data);
                //console.log(data);
            });
        });
        const linkHandlers = await page.$x('//div[@data-ga-category = "GeneHancer"]//a[@data-role = "show-all"]');
        if (linkHandlers.length > 0) {
            await linkHandlers[0].click();
        } else {
            throw new Error("Link not found");
        }

        const content1 = await page.content();
        //console.log(content1);
    } catch (e) {
        console.error(e);
        process.exit(1);
    } finally {
        await browser.close();
    }
})();

Команда вызывается таким образом.

./main.js 'https://www.genecards.org/cgi-bin/carddisp.pl?gene=BSCL2'

Но строка console.log("xxx" + response.url()); не вызывается.

Когда я раскомментирую //console.log(content1);, можно напечатать URL https://www.genecards.org/gene/api/data/Enhancers?geneSymbol=BSCL2. Но в печатном контенте не все записи, показанные в таблице GeneHancer (GH) Regulatory Elements for BSCL2 Gene.

Я думаю, что эффект click() не был достигнут полностью. Как ждать, пока он полностью обновит веб-страницу? А как показать содержание https://www.genecards.org/gene/api/data/Enhancers?geneSymbol=BSCL2 при получении ответа?

1 Ответ

0 голосов
/ 21 октября 2019

После нажатия на ссылку вы можете проверить, виден ли диапазон загрузки. Если это так, вы можете подождать, пока он не будет скрыт. Это может быть что-то вроде этого:

if ((await page.$$('#enhancerControllerComponent > div > div.ng-scope > div > div:nth-child(2) > span.gc-loading:not(.ng-hide)')).length) {
    await page.waitForSelector('#enhancerControllerComponent > div > div.ng-scope > div > div:nth-child(2) > span.gc-loading.ng-hide'));
}

Возможно, вам нужно улучшить эти селекторы. Но это идея. Проверьте, отображается ли состояние загрузки, и дождитесь его скрытия.

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