首页 > 解决方案 > 如何确保点击完成?

问题描述

我使用以下代码查询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收到响应时显示内容?

标签: javascriptnode.jspuppeteer

解决方案


单击链接后,您可以检查加载范围是否可见。如果是这样,您可以等到它被隐藏。它可能是这样的:

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'));
}

您可能需要改进这些选择器。但这就是想法。检查加载状态是否可见并等待它被隐藏。


推荐阅读