亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Puppeteer 單擊選擇器

使用 Puppeteer 單擊選擇器

肥皂起泡泡 2023-02-17 10:17:11
所以我在點擊耐克網站上的登錄按鈕時遇到了問題。我不確定為什么它一直崩潰,好吧,因為它找不到我猜的選擇器,但我不確定我做錯了什么。我還想說我在 puppeteer 崩潰之前遇到了某種內存泄漏,如果我不及時在控制臺內取消進程,有時它甚至會使我的 macbook 完全崩潰。編輯:如果我沒有足夠快地取消應用程序,此代碼也會在崩潰時導致內存泄漏,迫使我不得不硬重置我的 mac。節點版本:14.4.0 Puppeteer 版本:5.2.1當前代碼:const puppeteer = require('puppeteer');(async () => {    const browser = await puppeteer.launch({        headless: false,        defaultViewport: null,        args: ['--start-maximized']    })    const page = await browser.newPage()    await page.goto('https://www.nike.com/')    const winner = await Promise.race([        page.waitForSelector('[data-path="join or login"]'),        page.waitForSelector('[data-path="sign in"]')    ])    await page.click(winner._remoteObject.description)})()我也試過:await page.click('button[data-var]="loginBtn"');
查看完整描述

3 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

嘗試一下:

await page.click('button[data-var="loginBtn"]');


查看完整回答
反對 回復 2023-02-17
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

他們正在對他們的網站進行 A/B 測試,因此當您從自己的 chrome 瀏覽器訪問該網站時,您可能會登陸一個選擇器與您檢索到的選擇器截然不同的頁面。

在這種情況下,您可以嘗試使用 XPath 及其contains方法通過文本內容獲取元素(不幸的是,在這種特定情況下也會更改設計) 。例如$x('//span[contains(text(), "Sign In")]')[0]

所以我建議檢測兩個按鈕版本并獲得它們最穩定的選擇器,這些也可以基于數據屬性:

A

$('[data-path="sign in"]')

$('[data-path="join or login"]')

然后使用 aPromise.race你可以檢測到哪個按鈕存在,然后從JSHandle@node這樣的中提取它的選擇器._remoteObject.description::

{

  type: 'object',

  subtype: 'node',

  className: 'HTMLButtonElement',

  description: 'button.nav-btn.p0-sm.body-3.u-bold.ml2-sm.mr2-sm',

  objectId: '{"injectedScriptId":3,"id":1}'

}

=>


button.nav-btn.p0-sm.prl3-sm.pt2-sm.pb2-sm.fs12-nav-sm.d-sm-b.nav-color-grey.hover-color-black

例子:


const browser = await puppeteer.launch({

  headless: false,

  defaultViewport: null,

  args: ['--start-maximized']

})

const page = await browser.newPage()

await page.goto('https://www.nike.com/')

const winner = await Promise.race([

  page.waitForSelector('[data-path="join or login"]'),

  page.waitForSelector('[data-path="sign in"]')

])


await page.click(winner._remoteObject.description)

僅供參考:同時最大化瀏覽器窗口以確保元素具有相同的選擇器名稱。


defaultViewport: null, args: ['--start-maximized']

默認情況下,Chromium 在帶有 puppeteer 的小窗口中啟動。


查看完整回答
反對 回復 2023-02-17
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

您需要將{ waitUntil: 'networkidle0' }page.goto

這告訴 puppeteer 等待網絡空閑(500 毫秒內沒有請求)

const puppeteer = require('puppeteer');


(async () => {

    const browser = await puppeteer.launch({

        headless: false,

        defaultViewport: null,

        args: ['--start-maximized']

    })


    const page = await browser.newPage()


    // load the nike.com page and wait for it to fully load (inc A/B scripts)

    await page.goto('https://www.nike.com/', { waitUntil: 'networkidle0' })


    // select whichever element appears first

    var el = await page.waitForSelector('[data-path="join or login"], [data-path="sign in"]', { timeout: 1000 })


    // execute click

    await page.click(el._remoteObject.description)

})()


查看完整回答
反對 回復 2023-02-17
  • 3 回答
  • 0 關注
  • 327 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號