marionette_client

package module
v0.0.1 Latest Latest
Warning

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

Go to latest
Published: Nov 23, 2020 License: MIT Imports: 10 Imported by: 2

README

GoDoc Build Status Coverage Status Go Report Card License

marionette_client

Mozilla's Gecko Marionette client in golang

What is Marionette

"Marionette is an automation driver for Mozilla's Gecko engine. It can remotely control either the UI, or the internal JavaScript of a Gecko platform, such as Firefox. It can control both the chrome (i.e. menus and functions) or the content (the webpage loaded inside the browsing context), giving a high level of control and ability to replicate user actions. In addition to performing actions on the browser, Marionette can also read the properties and attributes of the DOM.

If this sounds similar to Selenium/WebDriver then you're correct! Marionette shares much of the same ethos and API as Selenium/WebDriver, with additional commands to interact with Gecko's chrome interface. Its goal is to replicate what Selenium does for web content: to enable the tester to have the ability to send commands to remotely control a user agent."

Resources

https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette

https://w3c.github.io/webdriver/webdriver-spec.html

Examples

Incomplete list. Check the tests for more examples.

Instantiate the client
	client := NewClient()
	client.Connect("", 0) // this are the default marionette values for hostname, and port 
	client.NewSession("", nil) // let marionette generate the Session ID with it's default Capabilities
	
Navigate to page
	client.Navigate("http://www.google.com/")
Change Contexts
    client.SetContext(Context(CHROME))
    //or
	client.SetContext(Context(CONTENT))
	
Find Element
	element, err := client.FindElement(By(ID), "html-element-id-attribute")
	if err != nil {
		// handle your errors
	}

    // else
	println(element.Id())
	println(element.Enabled())
	println(element.Selected())
	println(element.Displayed())
	println(element.TagName())
	println(element.Text())
	println(element.Attribute("id"))
	println(element.CssValue("text-decoration"))
	
	// width, height, x and y
	rect, err := element.Rect()
	if err != nil {
        // handle your errors
	}

	fmt.Printf("%#v", rect)
	
	// size
	w, h, err := element.Size()
	if err != nil {
		// handle your errors
	}
	
    fmt.Printf("width: %f, height: %f", w, h)
    
	//location
	x, y, err := element.Location()
	if err != nil {
	    // handle your errors
	}
	
	fmt.Printf("x: %v, y: %v", x, y)
Find Elements
	collection, err := element.FindElements(By(TAG_NAME), "li")
	if err != nil {
		// handle your errors
	}

    // else
    for var e := range collection {
    	println(e.Id())
    	println(e.Enabled())
    	println(e.Selected())
    	println(e.Displayed())
    	println(e.TagName())
    	println(e.Text())
    	println(e.Attribute("id"))
    	println(e.CssValue("text-decoration"))
    	e.Click()
    }
Execute JS Script
	script := "function mySum(a, b) { return a + b; }; return mySum(arguments[0], arguments[1]);"
	args := []int{1, 3} // arguments to be passed to the function
	timeout := 1000     // milliseconds
	sandbox := false    // new Sandbox
	r, err := client.ExecuteScript(script, args, timeout, sandbox)
	if err == nil {
	    println(r.Value)    // 4 
	}
Wait(), Until() Expected condition is true.
	client.Navigate("http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_get")
	
	timeout := time.Duration(10) * time.Second
	condition := ElementIsPresent(By(ID), "stackH")
	ok, webElement, err := Wait(client).For(timeout).Until(condition)

	if !ok {
		log.Printf("%#v", err)
		// do your error stuff
		return
	}

    // cool, we've the element, let's click on it!
	webElement.Click()
	

Documentation

Index

Constants

View Source
const (
	MARIONETTE_PROTOCOL_V2 = 2
	MARIONETTE_PROTOCOL_V3 = 3

	WEBDRIVER_ELEMENT_KEY = "element-6066-11e4-a52e-4f735466cecf"
)

Variables

View Source
var RunningInDebugMode bool = false

Functions

func ElementIsNotPresent

func ElementIsNotPresent(by By, value string) func(f Finder) (bool, *WebElement, error)

func ElementIsPresent

func ElementIsPresent(by By, value string) func(f Finder) (bool, *WebElement, error)

Types

type By

type By int

strategy type to find elements in the DOM

const (
	ID By = 1 + iota
	NAME
	CLASS_NAME
	TAG_NAME
	CSS_SELECTOR
	LINK_TEXT
	PARTIAL_LINK_TEXT
	XPATH
	ANON
	ANON_ATTRIBUTE
)

:param method: The method to use to locate the element; one of:

"id", "name", "class name", "tag name", "css selector",
"link text", "partial link text", "xpath", "anon" and "anon
attribute". Note that the "name", "link text" and "partial
link test" methods are not supported in the chrome DOM.

:param target: The target of the search. For example, if method =

"tag", target might equal "div".  If method = "id", target would
be an element id.

:param id: If specified, search for elements only inside the element

with the specified id.

"""

func (By) String

func (b By) String() string

String returns the value name of the strategy ("css selector", "link text", ...).

type Capabilities

type Capabilities struct {
	BrowserName                   string
	BrowserVersion                string
	PlatformName                  string
	PlatformVersion               string
	SpecificationLevel            uint
	RaisesAccessibilityExceptions bool
	Rotatable                     bool
	AcceptSslCerts                bool
	TakesElementScreenshot        bool
	TakesScreenshot               bool
	Proxy                         interface{}
	Platform                      string
	XULappId                      string
	AppBuildId                    string
	Device                        string
	Version                       string
	Command_id                    uint32
}

type Client

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

func NewClient

func NewClient() *Client

func (*Client) AcceptDialog

func (c *Client) AcceptDialog() error

AcceptDialog accepts the dialog - like clicking Ok/Yes

func (*Client) ActiveFrame

func (c *Client) ActiveFrame() (*WebElement, error)

ActiveFrame get active frame

func (*Client) Back

func (c *Client) Back() error

Back go back in navigation history

func (*Client) Capabilities

func (c *Client) Capabilities() (*Capabilities, error)

Capabilities Send the current session's capabilities to the client. Capabilities informs the client of which WebDriver features are supported by Firefox and Marionette. They are immutable for the length of the session. The return value is an immutable map of string keys ("capabilities") to values, which may be of types boolean, numerical or string.

func (*Client) CloseWindow

func (c *Client) CloseWindow() (*Response, error)

CloseWindow closes current window.

func (*Client) Connect

func (c *Client) Connect(host string, port int) error

func (*Client) Context

func (c *Client) Context() (*Response, error)

Context Gets the context of the server, either "chrome" or "content".

func (*Client) Cookie

func (c *Client) Cookie(name string) (*Response, error)

Cookie Get cookie by name

func (*Client) Cookies

func (c *Client) Cookies() (*Response, error)

Cookies Get all cookies

func (*Client) CurrentChromeWindowHandle

func (c *Client) CurrentChromeWindowHandle() (*Response, error)

CurrentChromeWindowHandle returns the current chrome window ID "getChromeWindowHandle": GeckoDriver.prototype.getChromeWindowHandle, "getCurrentChromeWindowHandle": GeckoDriver.prototype.getChromeWindowHandle,

func (*Client) CurrentUrl

func (c *Client) CurrentUrl() (string, error)

CurrentUrl deprecated, use Url() instead Deprecated

func (*Client) CurrentWindowHandle

func (c *Client) CurrentWindowHandle() (string, error)

CurrentWindowHandle returns the current window ID

func (*Client) DeleteSession

func (c *Client) DeleteSession() error

DeleteSession Marionette currently only accepts a session id, so if we call delete session can also close the TCP Connection

func (*Client) DismissDialog

func (c *Client) DismissDialog() error

DismissDialog dismisses the dialog - like clicking No/Cancel

func (*Client) ExecuteScript

func (c *Client) ExecuteScript(script string, args []interface{}, timeout uint, newSandbox bool) (*Response, error)

ExecuteScript Execute JS Script

func (*Client) FindElement

func (c *Client) FindElement(by By, value string) (*WebElement, error)

FindElement Find an element using the indicated search strategy.

func (*Client) FindElements

func (c *Client) FindElements(by By, value string) ([]*WebElement, error)

FindElements Find elements using the indicated search strategy.

func (*Client) Forward

func (c *Client) Forward() error

Forward go forward in navigation history

func (*Client) Get

func (c *Client) Get(url string) (*Response, error)

Get deprecated use Navigate() Deprecated

func (*Client) GetWindowRect

func (c *Client) GetWindowRect() (rect *WindowRect, err error)

GetWindowRect gets window position and size

func (*Client) Log

func (c *Client) Log(message string, level string) (*Response, error)

Log Accepts user defined log-level. Deprecated

func (*Client) Logs

func (c *Client) Logs() (*Response, error)

Logs Return all logged messages. Deprecated

func (*Client) MaximizeWindow

func (c *Client) MaximizeWindow() error

MaximizeWindow maximizes window.

func (*Client) Navigate

func (c *Client) Navigate(url string) (*Response, error)

Navigate open url

func (*Client) NewSession

func (c *Client) NewSession(sessionId string, cap *Capabilities) (*Response, error)

NewSession create new session

func (*Client) PageSource

func (c *Client) PageSource() (*Response, error)

PageSource get page source

func (*Client) Quit

func (c *Client) Quit() (*Response, error)

Quit quits the session and request browser process to terminate.

func (*Client) QuitApplication

func (c *Client) QuitApplication() (*Response, error)

QuitApplication deprecated use Quit().

func (*Client) Refresh

func (c *Client) Refresh() error

Refresh refresh

func (*Client) Screenshot

func (c *Client) Screenshot() (string, error)

Screenshot takes a screenshot of the page.

func (*Client) SendKeysToDialog

func (c *Client) SendKeysToDialog(keys string) error

SendKeysToDialog sends text to a dialog

func (*Client) SessionID

func (c *Client) SessionID() string

func (*Client) SetContext

func (c *Client) SetContext(value Context) (*Response, error)

SetContext Sets the context of the subsequent commands to be either "chrome" or "content". Must be one of "chrome" or "content" only.

func (*Client) SetPageTimeout

func (c *Client) SetPageTimeout(milliseconds int) (*Response, error)

SetPageTimeout Set timeout for page loading. Deprecated

func (*Client) SetScriptTimeout

func (c *Client) SetScriptTimeout(milliseconds int) (*Response, error)

SetScriptTimeout Set the timeout for asynchronous script execution. Deprecated

func (*Client) SetSearchTimeout

func (c *Client) SetSearchTimeout(milliseconds int) (*Response, error)

SetSearchTimeout Set timeout for searching for elements. Deprecated

func (*Client) SetWindowRect

func (c *Client) SetWindowRect(rect WindowRect) error

SetWindowRect sets window position and size

func (*Client) SetWindowSize

func (c *Client) SetWindowSize(s *Size) (rv *Size, err error)

SetWindowSize sets window size Deprecated: Use SetWindowRect instead.

func (*Client) SwitchToFrame

func (c *Client) SwitchToFrame(by By, value string) error

SwitchToFrame switch to frame - strategies: By(ID), By(NAME) or name only.

func (*Client) SwitchToParentFrame

func (c *Client) SwitchToParentFrame() error

SwitchToParentFrame switch to parent frame

func (*Client) SwitchToWindow

func (c *Client) SwitchToWindow(name string) error

SwitchToWindow switch to specific window.

func (*Client) TextFromDialog

func (c *Client) TextFromDialog() (string, error)

TextFromDialog gets text from the dialog

func (*Client) Title

func (c *Client) Title() (string, error)

Title get title

func (*Client) Transport

func (c *Client) Transport(t Transporter)

func (*Client) Url

func (c *Client) Url() (string, error)

Url get current url

func (*Client) WindowHandles

func (c *Client) WindowHandles() ([]string, error)

WindowHandles return array of window ID currently opened

func (*Client) WindowSize

func (c *Client) WindowSize() (rv *Size, err error)

WindowSize returns the window size Deprecated: Use GetWindowRect instead

type Context

type Context int
const (
	CHROME Context = 1 + iota
	CONTENT
)

func (Context) String

func (c Context) String() string

String returns the value name of the context ("chrome", "content").

type Cookie struct {
	Domain   string
	HttpOnly bool
	Name     string
	Path     string
	Value    string
}

type Decoder

type Decoder interface {
	Decode(buf []byte, r *Response) error
}

type DecoderEncoder

type DecoderEncoder interface {
	Decoder
	Encoder
}

func NewDecoderEncoder

func NewDecoderEncoder(protoVersion int32) (DecoderEncoder, error)

type DriverError

type DriverError struct {
	ErrorType  string `json:"Error"`
	Message    string
	Stacktrace *string
}

func (DriverError) Error

func (e DriverError) Error() string

func (DriverError) String

func (e DriverError) String() string

type ElementRect

type ElementRect struct {
	Point
	Size
}

type Encoder

type Encoder interface {
	Encode(t Transporter, command string, values interface{}) ([]byte, error)
}

type Finder

type Finder interface {
	FindElement(by By, value string) (*WebElement, error)
	FindElements(by By, value string) ([]*WebElement, error)
}

type MarionetteTransport

type MarionetteTransport struct {
	ApplicationType    string
	MarionetteProtocol int32
	// contains filtered or unexported fields
}

func (*MarionetteTransport) Close

func (t *MarionetteTransport) Close() error

func (*MarionetteTransport) Connect

func (t *MarionetteTransport) Connect(host string, port int) error

func (*MarionetteTransport) MessageID

func (t *MarionetteTransport) MessageID() int

func (*MarionetteTransport) Receive

func (t *MarionetteTransport) Receive() ([]byte, error)

func (*MarionetteTransport) Send

func (t *MarionetteTransport) Send(command string, values interface{}) (*Response, error)
type Navigator interface {
	Navigate(url string) (*Response, error)
	PageSource() (*Response, error)
	Title() (string, error)
	CurrentUrl() (string, error)
	Refresh() error
	Back() error
	Forward() error
}

type Point

type Point struct {
	X float32
	Y float32
}

type ProtoV3DecoderEncoder

type ProtoV3DecoderEncoder struct{}

func (ProtoV3DecoderEncoder) Decode

func (e ProtoV3DecoderEncoder) Decode(buf []byte, r *Response) error

func (ProtoV3DecoderEncoder) Encode

func (e ProtoV3DecoderEncoder) Encode(t Transporter, command string, values interface{}) ([]byte, error)

type Response

type Response struct {
	MessageID   int32
	Size        int32
	Value       string
	DriverError *DriverError
}

type Size

type Size struct {
	Width  float64
	Height float64
}

type Transporter

type Transporter interface {
	MessageID() int
	Connect(host string, port int) error
	Close() error
	Send(command string, values interface{}) (*Response, error)
	Receive() ([]byte, error)
}

type Waiter

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

func Wait

func Wait(f Finder) *Waiter

func (*Waiter) For

func (w *Waiter) For(d time.Duration) *Waiter

func (*Waiter) Until

func (w *Waiter) Until(f func(c Finder) (bool, *WebElement, error)) (bool, *WebElement, error)

type WebElement

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

func (*WebElement) Attribute

func (e *WebElement) Attribute(name string) string

func (*WebElement) Clear

func (e *WebElement) Clear()

func (*WebElement) Click

func (e *WebElement) Click()

func (*WebElement) CssValue

func (e *WebElement) CssValue(property string) string

func (*WebElement) Displayed

func (e *WebElement) Displayed() bool

func (*WebElement) Enabled

func (e *WebElement) Enabled() bool

func (*WebElement) FindElement

func (e *WebElement) FindElement(by By, value string) (*WebElement, error)

func (*WebElement) FindElements

func (e *WebElement) FindElements(by By, value string) ([]*WebElement, error)

func (*WebElement) Id

func (e *WebElement) Id() string

func (*WebElement) Location

func (e *WebElement) Location() (*Point, error)

func (*WebElement) Rect

func (e *WebElement) Rect() (*ElementRect, error)

func (*WebElement) Screenshot

func (e *WebElement) Screenshot() (string, error)

func (*WebElement) Selected

func (e *WebElement) Selected() bool

func (*WebElement) SendKeys

func (e *WebElement) SendKeys(keys string) error

func (*WebElement) Size

func (e *WebElement) Size() (*Size, error)

func (*WebElement) TagName

func (e *WebElement) TagName() string

func (*WebElement) Text

func (e *WebElement) Text() string

func (*WebElement) UnmarshalJSON

func (e *WebElement) UnmarshalJSON(data []byte) error

type WindowRect

type WindowRect struct {
	X      float64
	Y      float64
	Width  float64
	Height float64
}

Jump to

Keyboard shortcuts

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