3 回答

TA貢獻(xiàn)1802條經(jīng)驗 獲得超5個贊
他們正在對他們的網(wǎng)站進(jìn)行 A/B 測試,因此當(dāng)您從自己的 chrome 瀏覽器訪問該網(wǎng)站時,您可能會登陸一個選擇器與您檢索到的選擇器截然不同的頁面。
在這種情況下,您可以嘗試使用 XPath 及其contains方法通過文本內(nèi)容獲取元素(不幸的是,在這種特定情況下也會更改設(shè)計) 。例如$x('//span[contains(text(), "Sign In")]')[0]
所以我建議檢測兩個按鈕版本并獲得它們最穩(wěn)定的選擇器,這些也可以基于數(shù)據(jù)屬性:
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']
默認(rèn)情況下,Chromium 在帶有 puppeteer 的小窗口中啟動。

TA貢獻(xiàn)1827條經(jīng)驗 獲得超9個贊
您需要將{ waitUntil: 'networkidle0' }與page.goto
這告訴 puppeteer 等待網(wǎng)絡(luò)空閑(500 毫秒內(nèi)沒有請求)
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)
})()
添加回答
舉報