Puppeteer 在页面中查找数组元素然后点击 [英] Puppeteer find array elements in page and then click

查看:60
本文介绍了Puppeteer 在页面中查找数组元素然后点击的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我有一个 url 由 javascript 呈现的站点.我想在我的网站中找到所有脚本标签,然后找到数学脚本 src 并只返回有效的标签.接下来找到脚本的父级,最后点击链接.这就是我所拥有的:

Hello I have site that url are rendered by javascript. I want to find all script tags in my site, then math script src and return only valid ones. Next find parent of script and finally click on link. This is what i have:

const scripts = await page.$$('script').then(scripts => {
    return scripts.map(script => {
        if(script.src.indexOf('aaa')>0){
            return script
        }
    });
});
scripts.forEach(script => {
    let link = script.parentElement.querySelector('a');
    link.click();
});

我的问题是我的 script.src 未定义.当我删除该条件时,我移动到 forEach 循环,但我得到 querySelector 未定义.我可以在调试模式控制台内的 js 中编写该代码,但我无法将其移动到 Puppeteer API.

My problem is that i have script.src is undefined. When i remove that condition i move to forEach loop but i get querySelector is undefined. I can write that code in js inside of console of debug mode but i cant move it to Puppeteer API.

从控制台我得到预期的结果

from console i get results as expected

let scripts = document.querySelectorAll('script');
scripts.forEach(script=>{
let el = script.parentElement.querySelector('a');
console.log(el)
})

推荐答案

当你使用 $$$ 时,会返回一个 JSHandle,它与在 evaluate 中运行 querySelector 时返回的 HTML 节点或节点列表.所以 script.src 将始终返回 undefined.

When you use $$ or $, it will return a JSHandle, which is not same as a HTML Node or NodeList that returns when you run querySelector inside evaluate. So script.src will always return undefined.

您可以改用以下代码,$$eval 将评估一个选择器并为您映射 NodeList/Array of Nodes.

You can use the following instead, $$eval will evaluate a selector and map over the NodeList/Array of Nodes for you.

page.$$eval('script', script => {
    const valid = script.getAttribute('src').indexOf('aaa') > 0 // do some checks
    const link = valid && script.parentElement.querySelector('a') // return the nearby anchor element if the check passed;
    if (link) link.click(); // click if it exists
})

还有其他方法可以实现这一点,但我将所有方法合二为一.即,如果它适用于浏览器,那么您也可以使用 .evaluate 并运行确切的代码并获得确切的所需结果.

There are other ways to achieve this, but I merged all into one. Ie, If it works on browser, then you can also use .evaluate and run the exact code and get exact desired result.

page.evaluate(() => {
    let scripts = document.querySelectorAll('script');
    scripts.forEach(script => {
        let el = script.parentElement.querySelector('a');
        console.log(el) // it won't show on your node console, but on your actual browser when it is running;
        el.click();
    })
})

这篇关于Puppeteer 在页面中查找数组元素然后点击的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆