如何刮按钮类元素和收集与 puppet 师和nodejs?

pod7payv  于 2022-11-03  发布在  Node.js
关注(0)|答案(1)|浏览(129)

我正在开发一个应用程序,在某种意义上,它可以自动检查你的耐克订单,收集到的数据通过discord embed发送给用户。
我已经做得差不多了,但有一件事我有一个问题。我不能刮的按钮类元素,耐克用来标记跟踪号码。有人有任何想法吗?我已经附上了一个ss的元素相关和我目前的代码。

await page.click(".nds-btn.css-1cxnzw1.css-xxsqkh.ex41m6f0.primary", { delay: 2000 });

    /*
    await page.waitForSelector(".sc-cendjg-0.u2kmlc-0.eIyaJU.iyTHDa.u2kmlc-0.sc-17uic18-0.u2kmlc-0.ggum8u-1.cFnOmG.ldmkHq-0.iumkEx");
    await page.click(".sc-196beyx-0.iumkEx");
         let trackingInfo = await page.evaluate(() => {
         let trackingTag = document.querySelectorAll(".sc-196beyx-0.iumkEx");
         let tracking = [];
         trackingTag.forEach((tag) => {
             tracking.push(tag.innerText)
         })
         return tracking;
     });
        console.log('Tracking number has been collected!')*/```[enter image description here][1]

  [1]: https://i.stack.imgur.com/rzdgS.jpg
zengzsys

zengzsys1#

下面是一个示例,说明如果选择器是动态生成的,我可能如何基于坐标而不是选择器来等待元素。

const wait = ms => new Promise(r => setTimeout(r, ms));

const waitForButton = async (page, coords) => {
    let cntr = 0;
    const LIMIT = 10;
    const WAIT_INTERVAL_MS = 500;
    while (cntr++ < LIMIT) {
        const buttonClass = await page.evaluate((coords) => {
            const {xMin, xMax, yMin, yMax} = coords;
            const buttonFittingCoords = [...document.querySelectorAll("button")].find(btn => {
                const { x, y } = btn.getBoundingClientRect();
                return (
                    ( x < xMax ) &&
                    ( x > xMin ) &&
                    ( y < yMax ) &&
                    ( y > yMin )
                )
            });
            return buttonFittingCoords?.className;
        }, coords);
        if (buttonClass) return buttonClass;
        await wait(WAIT_INTERVAL_MS);
    }
    console.log("Could not find button after "+LIMIT+" attempts waiting " + WAIT_INTERVAL_MS);
    return undefined;
};

(async () => {
    /* 
    got your browser and page and whatnot
    */
    const buttonClassName = await waitForButton(page, {
        xMin: 6, 
        xMax: 9, 
        yMin: 4, 
        yMax: 13
    });
    if (!buttonClassName) throw new Error("button couldn't be found!!!");
    const selector = "." + buttonClassName.replace(/ /g, ".");
    await page.click(selector);
})().catch(err => console.log(err.message));

相关问题