关于在方法或我的主要 .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); } );
让我的代码工作。
我正在尝试创建一种方法来概括我经常使用的某些操作,但它似乎不起作用,我也不知道为什么。 我在我的主要 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); } );
让我的代码工作。