关于在方法或我的主要 .js 中使用评估

About using evaluate in a method or in my main .js

我正在尝试创建一种方法来概括我经常使用的某些操作,但它似乎不起作用,我也不知道为什么。 我在我的主要 js 和我在支持 js 中声明的方法中使用相同的代码(除了试图让它更通用)但在我的主要它有效而在支持 js 中没有。

这是主要的 js(我只报告我试图插入方法的代码和对我完成的方法的调用以及主要 js 的一般结构)

    const puppeteer = require('puppeteer');
const Console = require('../core/console');
const login = require('../core/login/login');
const Utility = require('../core/utility');
const utility = new Utility();
const localConfig = {
    target: 'https://xyz.it/',
    userName: 'xyz',
    password: 'xyz',
    windowWidth: 1920,
    windowHeight: 1080,
    headless: false
};

async function runTest() {
    // ...some code here

        const numPagineObj = await page.evaluate(
            () => Array.from(document.querySelectorAll('.ui-grid-pager-max-pages-number'),
                e => e.innerHTML)
        );
        let numPagine = (Utility.convertHtmlToString(numPagineObj[0])).replace('/ ','');

        let zzzz = await utility.getTextFromSelectorArray(page, '.ui-grid-pager-max-pages-number', 0, 'innerHTML');

        // ...some other code here
}

runTest();

接下来是我在另一个js中声明的方法

 getTextFromSelectorArray = async (page, selector, indexElem, attributeName) => {
    try {
        await page.waitForSelector(selector);
        let elems = [];
        console.error(Console.FgRed, 'selector ' + selector);
        console.error(Console.FgRed, 'attributeName ' + attributeName);
        switch(attributeName){
            case 'outerHTML':
                elems = await page.evaluate( (selector) => { Array.from( document.querySelectorAll(selector),el => el.outerHTML); } );
                break;
            case 'innerHTML':
                elems = await page.evaluate( (selector) => { Array.from( document.querySelectorAll(selector),el => el.innerHTML); } );
                break;
            case 'textContent':
                elems = await page.evaluate( (selector) => { Array.from( document.querySelectorAll(selector),el => el.textContent); } );
                break;
        }

        console.error(Console.FgRed, 'elems ' + elems);
        return ((elems !== undefined && elems.length > 0) ? Utility.convertHtmlToString(elems[indexElem]) : 'xxx- NotFound -xxx');
    } catch (e) {
        console.error(Console.FgRed, e.message);
    }
};

在我的 main 中,我尝试打印变量 numPagine 和 zzzz,我在我的控制台上得到了以下内容

numPagine: '4' 和 zzzz:'xxx- NotFound -xxx'(注意:如果我尝试创建的数组未定义或为空,则这是我在方法中使用的默认值)

我做错了什么? 感谢大家!


编辑: 在 Code-Apprentice 的建议之后,我尝试使该方法与主要方法完全相同并且它起作用了。使它起作用的是直接使用选择器而不是通过变量传递它。

我现在的方法是怎样的:

    getTextFromSelectorArray = async (page, selector, indexElem, attributeName) => {
            try {
                const numPagineObj = await page.evaluate(
                    () => Array.from(document.querySelectorAll('.ui-grid-pager-max-pages-number'),
                        e => e.innerHTML)
                );
                let numPagine = Utility.convertHtmlToString(numPagineObj[indexElem]);
                return numPagine;
            } catch (e) {
                console.error(Console.FgRed, e.message);
            }
        };

现在的问题是我怎样才能让它在变量中传递选择器?


编辑 2:我得到了我所缺少的东西! 像这样编写代码 'elems = await page.evaluate( (s) => { return Array.from( document.querySelectorAll(s),el => el.outerHTML); }, selector );' 而不是 'elems = await page.evaluate( (selector) => { Array.from( document.querySelectorAll(selector),el => el.outerHTML); } );' 可以使我的代码工作。

elems = await page.evaluate( (selector) => { Array.from( document.querySelectorAll(selector),el => el.outerHTML); } );

问题(我认为)是您声明回调以接受名为 selector 的参数,但您没有将任何值传递给 evaluate() 以传递此参数。相反,您应该只使用 SelectorArray 接受的 selector 变量。换句话说,不要将 selector 声明为新变量:

elems = await page.evaluate( () => { Array.from( document.querySelectorAll(selector),el => el.outerHTML); } );

我找到了我所缺少的东西!像这样写代码

elems = await page.evaluate( (s) => { return Array.from( document.querySelectorAll(s),el => el.outerHTML); }, selector ); 

而不是

elems = await page.evaluate( (selector) => { Array.from( document.querySelectorAll(selector),el => el.outerHTML); } );

让我的代码工作。