如果 cdp.dom.getDocument(depth=-1, pierce=True)
回傳 None
,可能有幾個原因,以下是可能的解決方案:
1. 確保 CDP 連線正常
你需要確認 CDP 是否成功連上 Chrome,可以試試執行這段程式碼檢查:
import asyncio
from pyppeteer import launch
async def test_cdp():
browser = await launch(headless=True) # 啟動無頭瀏覽器
page = await browser.newPage()
await page.goto('https://example.com') # 打開一個測試網站
client = await page.target.createCDPSession()
doc = await client.send('DOM.getDocument', {'depth': -1, 'pierce': True})
print(doc) # 應該回傳一個包含 root 節點的 JSON 結構
await browser.close()
asyncio.run(test_cdp())
如果 print(doc)
仍然回傳 None
,那可能是下面幾種問題。
2. 確保瀏覽器已載入 DOM
如果 CDP
嘗試讀取 DOM 時,頁面還沒載入完成,可能會回傳 None
。請試試 加上 await page.waitForSelector()
,確保 DOM 載入:
await page.waitForSelector('body') # 等待 body 出現,確保 DOM 加載完成
完整寫法:
await page.goto('https://example.com', {'waitUntil': 'load'})
await page.waitForSelector('body')
client = await page.target.createCDPSession()
doc = await client.send('DOM.getDocument', {'depth': -1, 'pierce': True})
3. 確保 depth
設定正確
depth=-1
代表遞迴抓取整個 DOM,但某些版本的 CDP 可能不支援 -1
,你可以試著改成 正數值(例如 depth=5
):
doc = await client.send('DOM.getDocument', {'depth': 5, 'pierce': True})
4. 確保 Chrome 版本與 CDP 版本相容
如果你的 Chrome 版本太舊,可能會有 API 不支援的問題,你可以檢查 Chrome CDP 版本:
version = await client.send('Browser.getVersion')
print(version)
如果版本太舊,請升級你的 Chrome 或 Chromium。
5. 嘗試不用 pierce=True
有時候 pierce=True
可能會影響結果,你可以試試:
doc = await client.send('DOM.getDocument', {'depth': -1}) # 移除 pierce 參數
如果這樣能正常回傳,表示問題可能來自 pierce=True
的處理。
總結
如果 cdp.dom.getDocument()
回傳 None
,你可以:
- 確認 CDP 連線是否正常
- 確認頁面是否已載入完成
- 嘗試不同的
depth
設定 - 檢查 Chrome 與 CDP 版本是否相容
- 移除
pierce=True
測試看看