cdp.dom.getDocument(depth=-1, pierce=True) 回傳 None, 該如何處理?

如果 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,你可以:

  1. 確認 CDP 連線是否正常
  2. 確認頁面是否已載入完成
  3. 嘗試不同的 depth 設定
  4. 檢查 Chrome 與 CDP 版本是否相容
  5. 移除 pierce=True 測試看看

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *