cdp

package module
v1.1.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 30, 2020 License: Apache-2.0 Imports: 16 Imported by: 0

README

cdp

ChromeDevToolsProtocol协议封装。

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrLaunchChrome = errors.New("failed to launch chrome")
	ErrCreateTab    = errors.New("failed to create tab")
)
View Source
var (
	ArgDebugPort  = "--remote-debugging-port"
	ArgHeadless   = "--headless"
	ArgIgnoreCert = "--ignore-certificate-errors"
)
View Source
var Browser = struct {
	Close      string
	GetVersion string
}{
	"Browser.close",
	"Browser.getVersion",
}
View Source
var DOM = struct {
	Enable              string
	Disable             string
	DescribeNode        string
	Focus               string
	GetAttributes       string
	GetDocument         string
	QuerySelector       string
	QuerySelectorAll    string
	RemoveAttribute     string
	RemoveNode          string
	RequestChildNodes   string
	RequestNode         string
	ResolveNode         string
	SetAttributeValue   string
	SetAttributesAsText string
	SetNodeName         string
	SetNodeValue        string

	ChildNodeCountUpdated string
	ChildNodeInserted     string
	ChildNodeRemoved      string
	DocumentUpdated       string
}{
	"DOM.enable",
	"DOM.disable",
	"DOM.describeNode",
	"DOM.focus",
	"DOM.getAttributes",
	"DOM.getDocument",
	"DOM.querySelector",
	"DOM.querySelectorAll",
	"DOM.removeAttribute",
	"DOM.removeNode",
	"DOM.requestChildNodes",
	"DOM.requestNode",
	"DOM.resolveNode",
	"DOM.setAttributeValue",
	"DOM.setAttributesAsText",
	"DOM.setNodeName",
	"DOM.setNodeValue",

	"DOM.childNodeCountUpdated",
	"DOM.childNodeInserted",
	"DOM.childNodeRemoved",
	"DOM.documentUpdated",
}
View Source
var Input = struct {
	DispatchKeyEvent   string
	DispatchMouseEvent string
	DispatchTouchEvent string
}{
	"Input.dispatchKeyEvent",
	"Input.dispatchMouseEvent",
	"Input.dispatchTouchEvent",
}

Chrome里有两类Input事件:可信的与非可信的, 可信事件是用户和页面交互触发的事件,如鼠标或键盘, 非可信事件是指由Web API触发的,如document.createEvent()或element.click()。 例如模拟点击事件,可以使用Runtime.Evaluate,传入表达式document.querySelector('xxx').click(), 但这属于非可信事件,如果点击会创建新Tab,浏览器会识别为弹出窗口进行拦截(Page.windowOpen事件仍会触发), 所以对于这种情况,只能使用Input.dispatchMouseEvent。 注:Input.dispatchMouseEvent模拟点击的话需要连续两次调用(type分别为mousePressed和mouseReleased), 并且必须带上button和clickCount参数

View Source
var Network = struct {
	Enable              string
	Disable             string
	ClearBrowserCache   string
	ClearBrowserCookies string
	DeleteCookies       string
	GetAllCookies       string
	GetCookies          string
	GetResponseBody     string
	GetRequestPostData  string

	DataReceived               string
	EventSourceMessageReceived string
	LoadingFailed              string
	LoadingFinished            string
	RequestWillBeSent          string
	ResponseReceived           string
	WebSocketClosed            string
	WebSocketCreated           string
	WebSocketFrameReceived     string
	WebSocketFrameSent         string
}{
	"Network.enable",
	"Network.disable",
	"Network.clearBrowserCache",
	"Network.clearBrowserCookies",
	"Network.deleteCookies",
	"Network.getAllCookies",
	"Network.getCookies",
	"Network.getResponseBody",
	"Network.getRequestPostData",

	"Network.dataReceived",
	"Network.eventSourceMessageReceived",
	"Network.loadingFailed",
	"Network.loadingFinished",
	"Network.requestWillBeSent",
	"Network.responseReceived",
	"Network.webSocketClosed",
	"Network.webSocketCreated",
	"Network.webSocketFrameReceived",
	"Network.webSocketFrameSent",
}
View Source
var Page = struct {
	Enable            string
	Disable           string
	BringToFront      string
	CaptureScreenshot string
	Navigate          string
	Reload            string
	StopLoading       string

	DomContentEventFired string
	FrameAttached        string
	FrameDetached        string
	FrameNavigated       string
	LifecycleEvent       string
	LoadEventFired       string
	WindowOpen           string
}{
	"Page.enable",
	"Page.disable",
	"Page.bringToFront",
	"Page.captureScreenshot",
	"Page.navigate",
	"Page.reload",
	"Page.stopLoading",

	"Page.domContentEventFired",
	"Page.frameAttached",
	"Page.frameDetached",
	"Page.frameNavigated",
	"Page.lifecycleEvent",
	"Page.loadEventFired",
	"Page.windowOpen",
}
View Source
var Runtime = struct {
	Enable                  string
	Disable                 string
	AwaitPromise            string
	CallFunctionOn          string
	CompileScript           string
	Evaluate                string
	GetProperties           string
	GlobalLexicalScopeNames string
	QueryObjects            string
	ReleaseObject           string
	ReleaseObjectGroup      string
	RunScript               string

	ConsoleAPICalled string
	ExceptionRevoked string
	ExceptionThrown  string
}{
	"Runtime.enable",
	"Runtime.disable",
	"Runtime.awaitPromise",
	"Runtime.callFunctionOn",
	"Runtime.compileScript",
	"Runtime.evaluate",
	"Runtime.getProperties",
	"Runtime.globalLexicalScopeNames",
	"Runtime.queryObjects",
	"Runtime.releaseObject",
	"Runtime.releaseObjectGroup",
	"Runtime.runScript",

	"Runtime.consoleAPICalled",
	"Runtime.exceptionRevoked",
	"Runtime.exceptionThrown",
}
View Source
var Target = struct {
	ActivateTarget      string
	AttachToTarget      string
	CloseTarget         string
	CreateTarget        string
	DetachFromTarget    string
	GetTargets          string
	SendMessageToTarget string
	SetDiscoverTargets  string

	AttachedToTarget          string
	DetachedFromTarget        string
	ReceivedMessageFromTarget string
	TargetCreated             string
	TargetDestroyed           string
	TargetCrashed             string
	TargetInfoChanged         string
}{
	"Target.activateTarget",
	"Target.attachToTarget",
	"Target.closeTarget",
	"Target.createTarget",
	"Target.detachFromTarget",
	"Target.getTargets",
	"Target.sendMessageToTarget",
	"Target.setDiscoverTargets",

	"Target.attachedToTarget",
	"Target.detachedFromTarget",
	"Target.receivedMessageFromTarget",
	"Target.targetCreated",
	"Target.targetDestroyed",
	"Target.targetCrashed",
	"Target.targetInfoChanged",
}

Functions

This section is empty.

Types

type Action

type Action interface {
	Method() string
	Params() map[string]interface{}
}

func NewAction

func NewAction(method string, params map[string]interface{}) Action

func NewEvalAction

func NewEvalAction(expressions ...string) Action

type Chrome

type Chrome struct {
	// ChromeDevToolsProtocol的Endpoint(http://host:port/json),
	// 请求该地址返回的是Meta数组
	Endpoint string
	Host     string
	Port     int
	Process  *os.Process
}

func Connect

func Connect(host string, port int) (*Chrome, error)

func Launch

func Launch(bin string, args ...string) (*Chrome, error)

func (*Chrome) Exit

func (c *Chrome) Exit() error

func (*Chrome) NewTab

func (c *Chrome) NewTab(h Handler) (*Tab, error)

type Handler

type Handler interface {
	// 事件通知回调
	OnCdpEvent(*Message)

	// 响应回调,返回false会把Message继续发送到Tab.Call返回的chan中
	OnCdpResponse(*Message) bool
}

type Message

type Message struct {
	// 请求的Id,响应中会带有相同的Id,每次请求Tab.lastMessageId自增后赋值给Message.Id,
	// 事件通知没有该字段
	Id int32 `json:"id,omitempty"`

	// 请求、响应和事件通知都有该字段
	Method string `json:"method,omitempty"`

	// 请求的参数(可选)、事件通知的数据(可选),
	// 响应没有该字段
	Params map[string]interface{} `json:"params,omitempty"`

	// 响应数据(请求和事件通知没有该字段)
	Result map[string]interface{} `json:"result,omitempty"`

	// 一些自定义属性
	What int         `json:"-"`
	Arg  int         `json:"-"`
	Str  string      `json:"-"`
	Obj  interface{} `json:"-"`
	// contains filtered or unexported fields
}

请求/响应/事件通知

func (*Message) GetResultType

func (msg *Message) GetResultType() (string, string)

返回Message的type和subtype(如果type是object), Message可能没有type和subtype(如Page.navigate方法和Page.loadEventFired事件), type和subtype通常是Runtime.evaluate的返回结果, type可能是string/boolean/object/undefined等, subtype可能是null/error

func (*Message) GetResultValue

func (msg *Message) GetResultValue() string

type Meta

type Meta struct {
	Id                   string `json:"id"`
	Type                 string `json:"type"`
	Title                string `json:"title"`
	Url                  string `json:"url"`
	FaviconUrl           string `json:"faviconUrl"`
	Description          string `json:"description"`
	DevtoolsFrontendUrl  string `json:"devtoolsFrontendUrl"`
	WebSocketDebuggerUrl string `json:"webSocketDebuggerUrl"`
}
[ {
   "description": "",
   "devtoolsFrontendUrl": "/devtools/inspector.html?ws=127.0.0.1:9222/devtools/page/5D5FE2210AF9A5DAFAA2D69159C6CD52",
   "id": "5D5FE2210AF9A5DAFAA2D69159C6CD52",
   "title": "新标签页",
   "type": "page",
   "url": "chrome://newtab/",
   "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/page/5D5FE2210AF9A5DAFAA2D69159C6CD52"
}, {
   "description": "",
   "devtoolsFrontendUrl": "/devtools/inspector.html?ws=127.0.0.1:9222/devtools/page/853C0E933FD62DAD9ABBDFC9C3C47084",
   "faviconUrl": "https://www.baidu.com/favicon.ico",
   "id": "853C0E933FD62DAD9ABBDFC9C3C47084",
   "title": "百度一下,你就知道",
   "type": "page",
   "url": "https://www.baidu.com/",
   "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/page/853C0E933FD62DAD9ABBDFC9C3C47084"
}, {
   "description": "",
   "devtoolsFrontendUrl": "/devtools/inspector.html?ws=127.0.0.1:9222/devtools/page/CF2C261EEFA71ACB7803D25CFE93386C",
   "faviconUrl": "https://www.jd.com/favicon.ico",
   "id": "CF2C261EEFA71ACB7803D25CFE93386C",
   "title": "京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!",
   "type": "page",
   "url": "https://www.jd.com/",
   "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/page/CF2C261EEFA71ACB7803D25CFE93386C"
} ]

type Tab

type Tab struct {
	// contains filtered or unexported fields
}

func (*Tab) Activate

func (t *Tab) Activate()

func (*Tab) Call

func (t *Tab) Call(method string, params map[string]interface{}) (int32, chan *Message)

func (*Tab) CallAttr

func (t *Tab) CallAttr(method string, params map[string]interface{}, what, arg int, str string, obj interface{}) (int32, chan *Message)

func (*Tab) Close

func (t *Tab) Close()

func (*Tab) Closed

func (t *Tab) Closed() bool

func (*Tab) Fire

func (t *Tab) Fire(event string, params map[string]interface{})

func (*Tab) Subscribe

func (t *Tab) Subscribe(events ...string)

func (*Tab) Unsubscribe

func (t *Tab) Unsubscribe(events ...string)

type Task

type Task struct {
	// contains filtered or unexported fields
}

func NewTask

func NewTask(c *Chrome) *Task

func (*Task) Action

func (t *Task) Action(action Action) *Task

func (*Task) Finish

func (t *Task) Finish()

func (*Task) OnCdpEvent

func (t *Task) OnCdpEvent(msg *Message)

func (*Task) OnCdpResponse

func (t *Task) OnCdpResponse(msg *Message) bool

func (*Task) Run

func (t *Task) Run(h Handler) *Task

func (*Task) Until

func (t *Task) Until(event string) *Task

func (*Task) Wait

func (t *Task) Wait(duration time.Duration) *Task

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL