我是 pupeeteer 的新手,首先我要做的是加載一個頁面并單擊一個按鈕。但是,它無法找到該元素。我認為這是因為我需要找到父元素或父元素的父元素。
<button role="button" data-testid="uc-accept-all-button" class="sc-gsDKAQ fHGlTM" style="border: 2px solid rgb(247, 196, 0); padding: 0.375rem 1.125rem; margin: 0px 6px;">Accept All</button>
這是從檢查中獲取的完整 css 選擇器
#focus-lock-id > div.sc-furwcr.lhriHG > div >
div.sc-bYoBSM.egarKh > div > div > div.sc-dlVxhl.bEDIID >
div > button:nth-child(3)
這是我的代碼:
const puppeteer = require("puppeteer");
async function launch() {
const browser = await puppeteer.launch({
headless: false,
defaultViewport: false,
});
const page = await browser.newPage();
await page
.goto("", {
waitUntil: "networkidle0",
})
.catch((err) => console.log("error loading url", err));
page.click('button[data-testid="uc-deny-all-button"]');
}
launch();
這是一個簡單的接受和條件塊,我想單擊“全部接受”按鈕將其關閉并繼續進行。我需要先等待父元素然后進一步挖掘什么通常的操作?或者有什么簡單的方法?
這是我試圖關閉條款和條件的網站:https ://www.partslink24.com/
uj5u.com熱心網友回復:
幾個問題:
- 選擇器在頁面加載后動態顯示,因此您應該
waitForSelector而不是假設networkidle0足以捕捉按鈕。 - 您想要的選擇器位于陰影根中,因此選擇根并使用
.shadowRoot. - 你的
.click()電話必須被await編輯。
const puppeteer = require("puppeteer"); // ^18.0.4
let browser;
(async () => {
browser = await puppeteer.launch({headless: true});
const [page] = await browser.pages();
const url = "https://www.partslink24.com/";
await page.goto(url, {waitUntil: "domcontentloaded"});
const rootSel = "#usercentrics-root";
const btnSel = 'button[data-testid="uc-deny-all-button"]';
const rootContainer = await page.waitForSelector(rootSel);
const root = await rootContainer.evaluateHandle(el => el.shadowRoot);
const btn = await root.waitForSelector(btnSel);
await btn.click();
await page.waitForFunction(`
!document.querySelector("${rootSel}").querySelector('${btnSel}')
`);
await page.screenshot({path: "test.png", fullpage: true});
})()
.catch(err => console.error(err))
.finally(() => browser?.close())
;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/516727.html
上一篇:無限回圈測驗
