2019년 11월 30일
chromedp 패키지의 전체를 파악하기 위해 핵심 타입을 중심으로 설명 정리
흐름을 큰 줄기에서 시작하여 작은 줄기와 말단에 이르는 순서로 구성함
chromedp.Context
chromedp.Action
chromedp.~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.QueryAction
chromedp.Query()
- ...
chromedp.NavigateAction
chromedp.Navigate()
- ...
chromedp.MouseAction
chromedp.MouseClickNode()
chromedp.MouseClickXY()
chromedp.MouseClickEvent()
chromedp.KeyAction
chromedp.KeyEvent()
chromedp.KeyEventNode()
chromedp.EvaluateAction
chromedp.Evaluate()
chromedp.EvaluateAsDevTools()
chromedp.EmulateAction
chromedp.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.ExecAllocatorOption
chromedp.BrowserOption
chromedp.ContextOption
chromedp.QueryOption
-->chromedp.QueryAction
chromedp.By~
: 나머지는 쓸모 없으니 기본값인chromedp.BySearch
만 사용할 것을 권장.chromedp.BySearch
chromedp.ByID
chromedp.ByQuery
chromedp.ByQueryAll
chromedp.ByJSPath
chromedp.Node~
: 해설 필요시chromedp.Query()
주석 참고.chromedp.NodeReady
chromedp.NodeVisible
chromedp.NodeNotVisible
chromedp.NodeEnabled
chromedp.NodeSelected
chromedp.NodeNotPresent
chromedp.MouseOption
-->chromedp.MouseAction
chromedp.KeyOption
-->chromedp.KeyAction
chromedp.EvaluateOption
-->chromedp.EvaluateAction
chromedp.EmulateViewportOption
-->chromedp.EmulateAction
(본문의 끝)