Node.js 木偶演员点击a<;td>;选择之后

Node.js 木偶演员点击a<;td>;选择之后,node.js,puppeteer,Node.js,Puppeteer,我在chrome开发工具中测试了xpath选择器,它找到了我试图选择的 我尝试了几种方法,使用page.x$,然后使用以下命令确保元素被正确选择: page.waitForXPath("//td[contains(., 'All Projects')]") .then(selector => { page.click(selector); }) 执行确实到达页面。单击(),我得到以下错误。我很困惑,因为我认为我没有改变上下文。 UnhandledPromisejectionWar

我在chrome开发工具中测试了xpath选择器,它找到了我试图选择的

我尝试了几种方法,使用page.x$,然后使用以下命令确保元素被正确选择:

page.waitForXPath("//td[contains(., 'All Projects')]")
.then(selector => {
    page.click(selector);
})
执行确实到达
页面。单击()
,我得到以下错误。我很困惑,因为我认为我没有改变上下文。
UnhandledPromisejectionWarning:错误:只能在创建JSHandles的上下文中对其求值

编辑:这是HTML代码。它是一个有角度的网格,由HTML表格组成。
位于底部。

下面是代码的其余部分。其他一切都很好。对不起,这太笨重了

const puppeteer = require('puppeteer');
const kindle = puppeteer.devices['Kindle Fire HDX landscape'];

async function main() {
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();

    //go to page and log in
    await page.emulate(kindle);
    await page.goto('http://localhost:4201/#/login');
    await page.waitForSelector('input[id="usr"]');
    await page.type('#usr', 'myusername');
    await page.type('#pwd', '');
    await page.click('button');

    //wait for homepage to load
    await page.waitForSelector('#menuData');
    await page.click('#menuData');
    await page.waitForSelector('#drCreate');
    await page.click('#drCreate');
    await page.waitForSelector('.mat-input-element'); //a request piece is loaded
    //populate fields

    var date = new Date();

    await page.type('#mat-input-0', humanReadableDate(date));
    date.setDate(date.getDate() + 1);
    await page.type('#mat-input-1', humanReadableDate(date));
    date.setDate(date.getDate() + 5)
    await page.type('#mat-input-3', humanReadableDate(date));

    await page.click('.pi-angle-double-right');

    page.waitForXPath("//td[contains(., 'All Projects')]")
    .then(selector => {
        page.click(selector);
    })
}

function humanReadableDate(date) {
    if (!date) {
        date = new Date();
    }
    return (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();
}

main();

它看起来像是无效的页面上下文。试着这样做:

await page.waitForXPath("//td[contains(., 'All Projects')]")
const [ projects ] = await page.$x("//td[contains(., 'All Projects')]");
projects.click()
或简短版本:

page.waitForXPath("//td[contains(., 'All Projects')]").then(selector => selector.click())
问题 需要一个字符串(选择器)作为参数,但您正在传递一个元素句柄

从以下文件中引用:


返回:您可以添加HTML代码吗?您正在代码中导航。请添加更多代码。感谢回复,我添加了我的JS代码和生成的Angular html代码的屏幕截图(编辑:Yevhen提供了解决问题的答案),这很有效!你能告诉我为什么我最初的尝试没有成功吗?谢谢你的解释。我试过这个,它也很管用。如果我再次遇到问题,我会记得检查文档中预期的参数类型。