2019년 11월 30일
chromedp 패키지의 전체를 파악하기 위해 핵심 타입을 중심으로 설명 정리
흐름을 큰 줄기에서 시작하여 작은 줄기와 말단에 이르는 순서로 구성함
chromedp.Contextchromedp.Actionchromedp.~Option
Context는 크롬 프로세스와 브라우저와 탭의 상태다. (크롬 인스턴스)
- ExecAllocator: 브라우저를 실행하기 위한 설정이자 브라우저 실행기다.
- Browser: 크롬 브라우저 인스턴스다. 브라우저에는 하나 이상의 탭이 있다.
- Target: 탭이다. 탭은 하나의 페이지를 탐색한다.
type Context sturct { // ContextOption이 생성 매개변수.
Allocator Allocator // ExecAllocatorOption이 생성 매개변수.
Browser *Browser // BrowserOption이 생성 매개변수.
Target *Target // ContextOption이 생성 매개변수.
}
// context.Context.inferface의 구현이 아니라 context.Context.Value()의 반환형이다.-
chromedp.FromContext()context.Context에 포함된chromedp.(*Context)를context.Context.Value()로 받아온다. -
chromedp.NewExecAllocator()chromedp.Allocator와chromedp.Context의 생성자로서 결과를context.Context형식으로 반환.- 이를 통해 생성된
Context는Browser와Target이 누락되어 있다.
- 이를 통해 생성된
-
chromedp.NewContext()chromedp.Allocator와chromedp.Browser와chromedp.Target과chromedp.Context의 생성자로서 결과를context.Context형식으로 반환.- 실행설정을 생성하는 용도
Allocator가 누락된context.Context를 기반하면 새로운ExecAllocator가 생성된다.
- 브라우저를 생성하는 용도
Browser가 누락된context.Context를 기반하면 새로운 탭(Target)과 함께 새로운Browser가 생성된다.
- 탭을 생성하는 용도
Browser가 포함된context.Context를 기반하면Browser를 생성하지 않고 기존의 기반Browser에 새로운 탭(Target)만을 생성한다.
- 실행설정을 생성하는 용도
실행 설정 예시
var DefaultExecAllocatorOptions = [...]ExecAllocatorOption{
NoFirstRun,
NoDefaultBrowserCheck,
Headless,
Flag("disable-background-networking", true),
Flag("enable-features", "NetworkService,NetworkServiceInProcess"),
Flag("disable-background-timer-throttling", true),
Flag("disable-backgrounding-occluded-windows", true),
Flag("disable-breakpad", true),
Flag("disable-client-side-phishing-detection", true),
Flag("disable-default-apps", true),
Flag("disable-dev-shm-usage", true),
Flag("disable-extensions", true),
Flag("disable-features", "site-per-process,TranslateUI,BlinkGenPropertyTrees"),
Flag("disable-hang-monitor", true),
Flag("disable-ipc-flooding-protection", true),
Flag("disable-popup-blocking", true),
Flag("disable-prompt-on-repost", true),
Flag("disable-renderer-backgrounding", true),
Flag("disable-sync", true),
Flag("force-color-profile", "srgb"),
Flag("metrics-recording-only", true),
Flag("safebrowsing-disable-auto-update", true),
Flag("enable-automation", true),
Flag("password-store", "basic"),
Flag("use-mock-keychain", true),
}
// Default~ 접두어는 패키지 변수에 쓰임.여러 탭 생성 예시
// new browser, first tab
ctx1, cancel := chromedp.NewContext(context.Background())
defer cancel()
// ensure the first tab is created
if err := chromedp.Run(ctx1); err != nil {
panic(err)
}
// same browser, second tab
ctx2, _ := chromedp.NewContext(ctx1)
// ensure the second tab is created
if err := chromedp.Run(ctx2); err != nil {
panic(err)
}
c1 := chromedp.FromContext(ctx1)
c2 := chromedp.FromContext(ctx2)
fmt.Printf("Same browser: %t\n", c1.Browser == c2.Browser)
fmt.Printf("Same tab: %t\n", c1.Target == c2.Target)- Action은 크롬 인스턴스가 수행하는 행위다.
- Action은
chromedp.Run()의 인자다. - Action은 컴포지트 패턴으로 디자인되었다.
type Action interface {
Do(context.Context) error
}접미사 ~Action이 적용되는 모든 사례
chromedp.QueryActionchromedp.Query()- ...
chromedp.NavigateActionchromedp.Navigate()- ...
chromedp.MouseActionchromedp.MouseClickNode()chromedp.MouseClickXY()chromedp.MouseClickEvent()
chromedp.KeyActionchromedp.KeyEvent()chromedp.KeyEventNode()
chromedp.EvaluateActionchromedp.Evaluate()chromedp.EvaluateAsDevTools()
chromedp.EmulateActionchromedp.Emulate()chromedp.EmulateReset()chromedp.EmulateViewport()chromedp.ResetViewport()
chromedp.ActionFunc는 chromedp.Action.interface를 구현하는 함수 타입이다.
type Tasks []Action의 chromedp.Tasks는 chromedp.Action의 구현이다.
구성 예시
chromedp.Tasks{
chromedp.Navigate(`https://golang.org/pkg/time/`),
chromedp.WaitVisible(`body > footer`),
chromedp.Click(`#pkg-examples > div`, chromedp.NodeVisible),
chromedp.Value(`#example_After .play .input textarea`, &example),
}- Option은 구현체가 아니라 디자인 패턴이다.
- Option은 컴포지트 패턴의 디자인이다.
- Option은 Action이나 Context의 설정이다.
- Option은 Action이나 Context의 생성자의 인자다.
chromedp.ExecAllocatorOptionchromedp.BrowserOptionchromedp.ContextOption
chromedp.QueryOption-->chromedp.QueryActionchromedp.By~: 나머지는 쓸모 없으니 기본값인chromedp.BySearch만 사용할 것을 권장.chromedp.BySearchchromedp.ByIDchromedp.ByQuerychromedp.ByQueryAllchromedp.ByJSPath
chromedp.Node~: 해설 필요시chromedp.Query()주석 참고.chromedp.NodeReadychromedp.NodeVisiblechromedp.NodeNotVisiblechromedp.NodeEnabledchromedp.NodeSelectedchromedp.NodeNotPresent
chromedp.MouseOption-->chromedp.MouseActionchromedp.KeyOption-->chromedp.KeyActionchromedp.EvaluateOption-->chromedp.EvaluateActionchromedp.EmulateViewportOption-->chromedp.EmulateAction
(본문의 끝)