无效的选择器/错误:找不到选择器的节点

发布于 2025-01-09 10:40:35 字数 887 浏览 1 评论 0原文

我正在尝试使用我的代码使用 puppeteer 单击按钮,但由于某种原因,该按钮始终无法找到(无效选择器/错误:找不到选择器节点)或 waitFor 过期,这是我的代码:

const puppeteer = require('puppeteer');

const product_url = "https://www.amazon.co.uk/Usoun-Multi-Angle-Heat-Vent-Adjustable-Compatible/dp/B086HNM8F7/ref=sr_1_7?crid=16VVWBHJOOAYE&keywords=laptop+stand+adjustable&qid=1645642193&sprefix=laptop+stand+adjustable%2Caps%2C75&sr=8-7"

async function givePage(){
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
return page;
}
async function buyNow(page){
await page.goto(product_url);
await page.waitFor(20000);
await page.click("button[class='a-button a-button-oneclick a-button-icon onml-buy-now- 
button buybox-button-enhancement-size']", elem => elem.click());
}
async function checkout(){
var page = await givePage();
await buyNow(page);
}
checkout();

I am trying use my code to click on a button using puppeteer but for some reason the button is always unable to be found (Not valid Selector/Error: No node found for selector) or the waitFor expires, this is my code:

const puppeteer = require('puppeteer');

const product_url = "https://www.amazon.co.uk/Usoun-Multi-Angle-Heat-Vent-Adjustable-Compatible/dp/B086HNM8F7/ref=sr_1_7?crid=16VVWBHJOOAYE&keywords=laptop+stand+adjustable&qid=1645642193&sprefix=laptop+stand+adjustable%2Caps%2C75&sr=8-7"

async function givePage(){
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
return page;
}
async function buyNow(page){
await page.goto(product_url);
await page.waitFor(20000);
await page.click("button[class='a-button a-button-oneclick a-button-icon onml-buy-now- 
button buybox-button-enhancement-size']", elem => elem.click());
}
async function checkout(){
var page = await givePage();
await buyNow(page);
}
checkout();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迷路的信 2025-01-16 10:40:35

运行此代码时,我遇到了一些问题:

  • 需要接受 Cookie 同意(加载页面时弹出大窗口)
  • 按钮的选择器是正确的,但要使其工作,您需要单击
    在它的父元素上。

幸运的是,亚马逊在其元素中使用了大量的 id,我建议您只要 id 在页面加载之间保持不变(通常是这样!),就始终使用该 id。

这是固定代码

const product_url = "https://www.amazon.co.uk/Usoun-Multi-Angle-Heat-Vent-Adjustable-Compatible/dp/B086HNM8F7/ref=sr_1_7?crid=16VVWBHJOOAYE&keywords=laptop+stand+adjustable&qid=1645642193&sprefix=laptop+stand+adjustable%2Caps%2C75&sr=8-7"

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

// helper function which checks for a possible cookie popup (in puppeteer this will always occur except you work with `data_dir` property.
async function acceptCookies(page) {
    try {
        console.log('try accepting cookie consent.')
        // accept cookies. Button is clickable via id!
        const btn = await page.waitForSelector('#sp-cc-accept')
        await btn.click()

        console.log('Cookie consent accepted!')
    } catch(err) {
        console.error('Could not accept cookies..')
    }
}

async function buyNow(page) {

    // using networkidle0 for waiting for the page to be loaded correctly.
    // No other waiting needed then!
    await page.goto(product_url, { waitUntil: 'networkidle0'})

    // make sure to accept cookies on page load
    await acceptCookies(page)

    // the very parent element of the ID button makes the click finally work.
    // clicking on the input itself did not work for me
    const selector = '#buyNow_feature_div'

    // use waitForSelector in case something gets rendered. This 
    // returns the element immediatly if found. 
    const el = await page.waitForSelector(selector)

    // element handles can directly be pressed!
    await el.click()

    // wait for the navigation to occur!.
    await page.waitForNavigation()

    console.log('naviagtion done..')
    // show an alert after the buy button was clicked..
    await page.evaluate(() => alert('Buy button was pressed!'))
   
    // ... other code
    
    // await browser.close()

}

async function checkout() {
    var page = await givePage();
    await buyNow(page);
}


checkout();

I experienced few problems when running this code:

  • The Cookie consent needed to be accepted (big popup when page is loaded)
  • The selector for the button was correct but for making it work you need to click
    on a parent element of it.

Luckily amazon uses lots of id's for their elements and I suggest you to always use the id whenever the id stays the same between page loads (it normally does!).

Here is the fixed code

const product_url = "https://www.amazon.co.uk/Usoun-Multi-Angle-Heat-Vent-Adjustable-Compatible/dp/B086HNM8F7/ref=sr_1_7?crid=16VVWBHJOOAYE&keywords=laptop+stand+adjustable&qid=1645642193&sprefix=laptop+stand+adjustable%2Caps%2C75&sr=8-7"

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

// helper function which checks for a possible cookie popup (in puppeteer this will always occur except you work with `data_dir` property.
async function acceptCookies(page) {
    try {
        console.log('try accepting cookie consent.')
        // accept cookies. Button is clickable via id!
        const btn = await page.waitForSelector('#sp-cc-accept')
        await btn.click()

        console.log('Cookie consent accepted!')
    } catch(err) {
        console.error('Could not accept cookies..')
    }
}

async function buyNow(page) {

    // using networkidle0 for waiting for the page to be loaded correctly.
    // No other waiting needed then!
    await page.goto(product_url, { waitUntil: 'networkidle0'})

    // make sure to accept cookies on page load
    await acceptCookies(page)

    // the very parent element of the ID button makes the click finally work.
    // clicking on the input itself did not work for me
    const selector = '#buyNow_feature_div'

    // use waitForSelector in case something gets rendered. This 
    // returns the element immediatly if found. 
    const el = await page.waitForSelector(selector)

    // element handles can directly be pressed!
    await el.click()

    // wait for the navigation to occur!.
    await page.waitForNavigation()

    console.log('naviagtion done..')
    // show an alert after the buy button was clicked..
    await page.evaluate(() => alert('Buy button was pressed!'))
   
    // ... other code
    
    // await browser.close()

}

async function checkout() {
    var page = await givePage();
    await buyNow(page);
}


checkout();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文