Изучение chromedp: подробное руководство по выполнению команд CDP

В этой статье блога мы углубимся в мир chromedp и рассмотрим различные методы выполнения команд CDP (протокол Chrome DevTools). Мы предоставим примеры кода для каждого метода, что позволит вам понять и реализовать их в своих проектах. Независимо от того, являетесь ли вы новичком или опытным разработчиком, цель этого руководства — дать вам знания, позволяющие эффективно использовать возможности chromedp.

  1. Использование chromedp.Run:
    Пакет chromedp предоставляет функцию «Выполнить», которая позволяет синхронно выполнять команды CDP. Вот пример:
package main
import (
    "context"
    "log"
    "github.com/chromedp/cdproto/network"
    "github.com/chromedp/chromedp"
)
func main() {
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()
    var response string
    err := chromedp.Run(ctx,
        chromedp.Navigate("https://example.com"),
        chromedp.WaitVisible("body"),
        chromedp.OuterHTML("html", &response),
    )
    if err != nil {
        log.Fatal(err)
    }
    log.Println(response)
}
  1. Использование chromedp.RunResponse:
    Метод RunResponse позволяет выполнять команды CDP и получать ответ. Вот пример:
package main
import (
    "context"
    "log"
    "github.com/chromedp/cdproto/network"
    "github.com/chromedp/chromedp"
)
func main() {
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()
    var response *network.GetResponseBodyResult
    err := chromedp.RunResponse(ctx,
        chromedp.Navigate("https://example.com"),
        chromedp.WaitVisible("body"),
        chromedp.ActionFunc(func(ctx context.Context) error {
            result, err := network.GetResponseBody().Do(ctx)
            if err != nil {
                return err
            }
            response = result
            return nil
        }),
    )
    if err != nil {
        log.Fatal(err)
    }
    log.Println(response.Body)
}
  1. Использование chromedp.Evaluate:
    Метод Evaluate позволяет выполнять код JavaScript в контексте браузера и получать результат. Вот пример:
package main
import (
    "context"
    "log"
    "github.com/chromedp/chromedp"
)
func main() {
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()
    var title string
    err := chromedp.Run(ctx,
        chromedp.Navigate("https://example.com"),
        chromedp.Evaluate(`document.title`, &title),
    )
    if err != nil {
        log.Fatal(err)
    }
    log.Println(title)
}
  1. Использование chromedp.ActionFunc:
    Метод ActionFunc позволяет определять пользовательские действия с помощью команд CDP. Вот пример:
package main
import (
    "context"
    "log"
    "github.com/chromedp/chromedp"
)
func main() {
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()
    var title string
    action := chromedp.ActionFunc(func(ctx context.Context) error {
        var err error
        title, err = chromedp.Title().Do(ctx)
        return err
    })
    err := chromedp.Run(ctx,
        chromedp.Navigate("https://example.com"),
        action,
    )
    if err != nil {
        log.Fatal(err)
    }
    log.Println(title)
}