Skip to content

Instantly share code, notes, and snippets.

@NaniteFactory
Last active November 29, 2019 15:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NaniteFactory/a07ccb00bc5b7e5fe67e93a0d6743eb4 to your computer and use it in GitHub Desktop.
Save NaniteFactory/a07ccb00bc5b7e5fe67e93a0d6743eb4 to your computer and use it in GitHub Desktop.

chromedp 구성요소 정리 요약

2019년 11월 30일

chromedp 패키지의 전체를 파악하기 위해 핵심 타입을 중심으로 설명 정리

흐름을 큰 줄기에서 시작하여 작은 줄기와 말단에 이르는 순서로 구성함


목차

  1. chromedp.Context
  2. chromedp.Action
  3. chromedp.~Option

1. chromedp.Context

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.Allocatorchromedp.Context의 생성자로서 결과를 context.Context 형식으로 반환.

    • 이를 통해 생성된 ContextBrowserTarget이 누락되어 있다.
  • chromedp.NewContext()

    chromedp.Allocatorchromedp.Browserchromedp.Targetchromedp.Context의 생성자로서 결과를 context.Context 형식으로 반환.

    1. 실행설정을 생성하는 용도
      • Allocator가 누락된 context.Context를 기반하면 새로운 ExecAllocator가 생성된다.
    2. 브라우저를 생성하는 용도
      • Browser가 누락된 context.Context를 기반하면 새로운 탭(Target)과 함께 새로운 Browser가 생성된다.
    3. 탭을 생성하는 용도
      • 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)

2. chromedp.Action

  • Action은 크롬 인스턴스가 수행하는 행위다.
  • Action은 chromedp.Run()의 인자다.
  • Action은 컴포지트 패턴으로 디자인되었다.

2-1. chromedp.Action.interface

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()

2-2. chromedp.ActionFunc

chromedp.ActionFuncchromedp.Action.interface를 구현하는 함수 타입이다.

2-3. chromedp.Tasks

type Tasks []Actionchromedp.Taskschromedp.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),
}

3. chromedp.~Option

접미사 ~Option

  • Option은 구현체가 아니라 디자인 패턴이다.
  • Option은 컴포지트 패턴의 디자인이다.
  • Option은 Action이나 Context의 설정이다.
  • Option은 Action이나 Context의 생성자의 인자다.

Context와의 쓰임

  • chromedp.ExecAllocatorOption
  • chromedp.BrowserOption
  • chromedp.ContextOption

Action과의 쓰임

  • 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

(본문의 끝)

선행지식 context.Context

2019년 11월 30일

context.Context가 무엇이며 어떤 목적과 용도로 왜 어떻게 사용하는 도구인지 이해하여야 한다.


context.Context

  • builtin 패키지에 정의된 인터페이스다.

  • 동시성 있는 작업 하나당 하나를 할당하여 작업 개개를 식별하고 생명주기를 제어하기 위한 용도로 존재한다.

  • 작업에서 하위 작업이 갈라져 나오는 계층구조를 표현하는 데에 적합하다. 예컨대 부모가 죽으면 자식이 따라 죽는다. 그러나 자손이 죽는다고 부모가 따라 죽지는 않는다. 사본 생성시 사본이 원본을 런타임에 상속하여 계층 구조를 반영한다.

    • fork()의 동작처럼 프로세스에서 프로세스를 생성하는 경우의 프로세스와 같다.
    • new Thread()의 동작처럼 쓰레드에서 쓰레드를 생성하는 경우의 쓰레드와 같다.
    • go func(){}()의 동작처럼 고루틴에서 고루틴을 생성하는 경우에, context.Context 하나가 하나의 고루틴을 나타낼 수 있다.
    • 하나의 웹 브라우저 아래에 여러 탭을 만드는 경우에, context.Context 하나가 하나의 웹 브라우저나 하나의 탭을 나타낼 수 있다.
  • 생성

    context.Context의 구현은 생성소멸이 인정되지만 값의 변경이 불가능한 Immutable 구조체다. 빈 context.Context를 생성하는 기본 생성자를 제외한 모든 생성자는 context.Context를 런타임에 상속하여 새로운 context.Context를 생성하는데, 이는 작업에서 하위 작업이 갈라져 나오는 특징을 반영한다.

    • 기본 생성자
      • context.Background()
    • 사본 생성자
      • context.WithCancel()
      • context.WithDeadline()
      • context.WithTimeout()
      • context.WithValue()
  • 기능

    • CancelFunc()

      작업을 죽이기; 작업 실행 취소

    • context.Context.Deadline()

      작업의 수명 확인

    • context.Context.Done()

      생사 여부 확인

    • context.Context.Err()

      생사 여부 및 사인 확인

    • context.Context.Value()

      부차적인 기능으로서 TLS(Thread Local Storage)의 개념과 유사하게 context.Context에 임의 자료형의 값을 저장해 두고 열람할 수 있음


(선행지식 보습교육 끝)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment