setversionNumber = async (index, page) => {
const input = await page.evaluateHandle((i) => {
const versionView = document.getElementsByClassName("mx-dataview mx-name-dataView9")[0];
const inputfield = versionView.getElementsByTagName('input')[i];
if (inputfield.value === null || inputfield.value === '' ) {
console.info('returning input');
return inputfield;
}
console.info('returning null');
return null;
}, index);
if (await input !== null) {
console.info('input is filled');
const content = await page.evaluate((i) => i.value, input);
console.log(content);
await input.type('1');
} else {
console.info('input is empty');
}
我得到了这段代码,它需要获取一个输入字段,如果输入的值为空,则输入“1”。 当我在浏览器中运行它时,控制台会记录“reruning null”,这是预期的,因为输入值为空。
但是当检查返回的输入是否实际上为空时,它会记录“输入已填充”。之后会抛出错误,提示“无法读取 null 的属性“值””。这意味着输入实际上为空。所以我认为我只是没有使用正确的检查来查看这个输入对象是否实际上为空。
是否有其他方法来检查 page.evaluateHandle 返回的对象是否为空/null?
page.evaluateHandle()
总是返回 jsHandle 作为页内 JS 值。当该值为null时,该值的jsHandle本身不为null。
当您为
page.evaluate()
提供 jsHandle 时,它会自动转换为值本身,因此这就是为什么 await input !== null
和 'cannot read property "value" of null'
中的 page.evaluate((i) => i.value, input);
都可以为 true。
要检查 null,请使用
page.evaluate()
返回的值 — 或在 jsHandle.jsonValue()
之后使用 page.evaluateHandle()
:
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch(/* { headless: false, defaultViewport: null } */);
try {
const [page] = await browser.pages();
await page.goto('https://example.org/');
const data = await page.evaluate(() => null);
console.log(data === null); // true
const dataHandle = await page.evaluateHandle(() => null);
console.log(dataHandle === null); // false
console.log(await dataHandle.jsonValue() === null); // true
} catch(err) { console.error(err); } finally { await browser.close(); }
对于我的情况,我使用了这样的快捷方式:
elHandle.toString() === 'JSHandle:undefined'
因为如果它有一个元素,它将是
JSHandle@node
而不是