Puppeteer报Cannot read property 'getProperty' of undefined错误求解
报错原因
该报错的直接原因是执行getProperty的planTitle变量为undefined,说明page.$x('/html/body/center[1]/p[1]/table/tbody/tr[2]/td')返回的是空数组,没有匹配到对应元素。
你在浏览器中能定位到元素,但代码中查询不到的核心诱因有两个:
- 点击登录按钮后,没有等待页面跳转、新内容渲染完成就立即执行元素查询,此时目标元素还没被加载到DOM中
- 浏览器F12开发者工具中复制的XPath会自动为
<table>标签补全<tbody>节点,但实际页面源码中可能不存在该节点,导致XPath匹配失效
解决方案
- 登录操作后增加页面跳转等待逻辑
点击登录按钮的操作和页面跳转等待需要并行触发,避免跳转执行过快导致等待逻辑漏捕获跳转事件,代码修改如下:await Promise.all([ // 等待页面跳转完成,网络空闲 page.waitForNavigation({ waitUntil: 'networkidle0' }), page.evaluate(() => { document.evaluate('/html/body/div[1]/div[2]/div/div/div[2]/form/div[3]/div[1]/button', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click(); }) ]) - 替换直接查询元素的逻辑为显式等待查询
用page.waitForXPath代替page.$x,指定超时时间等待元素渲染完成后再操作:// 最多等待5秒,直到目标元素出现 const planTitle = await page.waitForXPath('/html/body/center[1]/p[1]/table/tbody/tr[2]/td', { timeout: 5000 }); const planTitleTxt = await planTitle.getProperty('textContent') const planTitleRawTxt = await planTitleTxt.jsonValue(); - 修正XPath的冗余tbody节点
如果上述修改后还是报错,可以删除XPath中的/tbody段,修改后XPath为:'/html/body/center[1]/p[1]/table/tr[2]/td' - 增加容错判断避免程序崩溃
所有元素操作前先校验元素是否存在:const [planTitle] = await page.$x('你的XPath路径'); if (!planTitle) { console.error('未匹配到目标元素'); await browser.close(); return; }
内容的提问来源于stack exchange,提问作者Lauritz Tieste
相关产品推荐
相关产品推荐

