node.js - 点击事件触发后不执行任何操作

标签 node.js web-scraping puppeteer

当我在 puppeteer 中以非 headless 模式触发 .click() 事件时,没有任何反应,甚至没有错误。“非 headless 模式,因此我可以直观地监视正在发生的事情点击”

const scraper = {
test: async () => {
        let browser, page;
        try {
            browser = await puppeteer.launch({
                headless: false,
                args: ["--no-sandbox", "--disable-setuid-sandbox"]
            });
            page = await browser.newPage();
        } catch (err) {
            console.log(err);
        }
        try {
            await page.goto("https://www.betking.com/sports/s/eventOdds/1-840-841-0-0,1-1107-1108-0-0,1-835-3775-0-0,", {
                waitUntil: "domcontentloaded"
            });
            console.log("scraping, wait...");
        } catch (err) {
            console.log(err);
        }
        console.log("waiting....");
        try {
            await page.waitFor('.eventsWrapper');
        } catch (err) {
            console.log(err, err.response);
        }

        try {
            let oddsListData = await page.evaluate(async () => {
                let regionAreaContainer = document.querySelectorAll('.areaContainer.region .regionGroup > .regionAreas > div:first-child > .area:nth-child(5)');
                regionAreaContainer = Array.prototype.slice.call(regionAreaContainer);
                let t = []; //Used to monitor the element being clicked
                regionAreaContainer.forEach(async (region) => {
                    let dat = await region.querySelector('div');
                    dat.innerHTML === "GG/NG" ? t.push(dat.innerHTML) : false; //Used to confirm that the right element is being clicked
                    dat.innerHTML === "GG/NG" ? dat.click() : false;
                })
                return t;
            })
            console.log(oddsListData);
        } catch (err) {
            console.log(err);
        }
    }
}

我希望它单击指定的按钮并加载页面上的一些动态数据。

在 Chrome 的控制台中,我收到错误

Transition Rejection($id: 1 type: 2, message: The transition has been superseded by a different transition, detail: Transition#3( 'sportsMultipleEvents'{"eventMarketIds":"1-840-841-0-0,1-1107-1108-0-0,1-835-3775-0-0,"} -> 'sportsMultipleEvents'{"eventMarketIds":"1-840-841-0-0,1-1107-1108-0-0,1-835-3775-535-14,"} ))

最佳答案

问题

通过执行 element.click() (在页面上下文内)或 element.value = '..' 等代码来表现出非人类的行为 (有关类似问题,请参阅 this answer)对于 Angular 应用程序来说似乎存在问题。您想尝试通过使用像 page.click() 这样的 puppeteer 函数来表现得更像人类,因为它们模拟“真正的”鼠标点击,而不是仅仅触发元素的点击事件。

此外,每当单击其中一项时,页面似乎都会重建页面的部分内容。因此,您需要在每次点击后再次执行选择器。

代码示例

为了表现得更人性化并在每次点击后重新查询元素,您可以将代码的后半部分更改为如下所示:

let list = await page.$x("//div[div/text() = 'GG/NG']");
for (let i = 0; i < list.length; i++) {
    await list[i].click();

    // give the page some time and then query the selectors again
    await page.waitFor(500);
    list = await page.$x("//div[div/text() = 'GG/NG']");
}

此代码使用 XPath 表达式来查询包含另一个带有给定文本的 div 元素的 div 元素。之后,在元素上模拟单击,然后再次查询页面内容以尊重 DOM 元素的更改。

关于node.js - 点击事件触发后不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55910796/

相关文章:

javascript - 如何从 Mongoose 中的多个数组更新数组内的值?

ruby - 使用 Mechanize/Nogokiri 按文本搜索

javascript - 下一个代码块在获取之前更早执行我该如何解决这个问题

node.js - 如何使用 Node.js 计算两个日期之间的差异?

javascript - 使用 R to Scrape (rvest) 在 JS 网页上接受条款和条件

javascript - 如何在Python中下载点击播放音频文件

javascript - 捕获 waitForSelector 错误

javascript - 错误 : Evaluation Failed: ReferenceError: util is not defined

async.js - 我如何知道 Puppeteer 中的页面是否已关闭

node.js - 在 Mac 上更新 Node.js : Error while updating Node. js