# testdriver.js Automation testdriver.js provides a means to automate tests that cannot be written purely using web platform APIs. Outside of automation contexts, it allows human operators to provide expected input manually (for operations which may be described in simple terms). It is currently supported only for [testharness.js](testharness) tests. ## API testdriver.js exposes its API through the `test_driver` variable in the global scope. NB: presently, testdriver.js only works in the top-level test browsing context (and not therefore in any frame or window opened from it). ### action_sequence Usage: `test_driver.action_sequence(actions)` * `actions`: an array of `Action` objects This function causes a sequence of actions to be sent to the browser. It is based on the [WebDriver API](https://w3c.github.io/webdriver/#actions). The action can be a keyboard action, a pointer action or a pause. It returns a `Promise` that resolves after the actions have been sent or rejects if an error was thrown. Test authors are encouraged to use the builder API to generate the sequence of actions. The builder API can be accessed via the `new test_driver.Actions()` object. Example: ```js let text_box = document.getElementById("text"); let actions = new test_driver.Actions() .pointerMove(0, 0, {origin: text_box}) .pointerDown() .pointerUp() .addTick() .keyDown("p") .keyUp("p"); actions.send(); ``` Calling into `send()` is going to dispatch the action sequence (via `test_driver.action_sequence`) and also returns a `Promise` which should be handled however is appropriate in the test. The other functions in the `Actions()` object are going to modify the state of the object by adding a new action in the sequence and return the same object. So the functions can be easily chained as shown in the example above. Here is a list of helper functions in the `Actions` class: ``` pointerDown: Create a pointerDown event for the current default pointer source pointerUp: Create a pointerUp event for the current default pointer source pointerMove: Create a move event for the current default pointer source keyDown: Create a keyDown event for the current default key source keyUp: Create a keyUp event for the current default key source pause: Add a pause to the current tick addTick: Insert a new actions tick setPointer: Set the current default pointer source (By detault the pointerType is mouse) addPointer: Add a new pointer input source with the given name setKeyboard: Set the current default key source addKeyboard: Add a new key input source with the given name ``` ### bless Usage: `test_driver.bless(intent, action)` * `intent`: a string describing the motivation for this invocation * `action`: an optional function This function simulates [activation][activation], allowing tests to perform privileged operations that require user interaction. For example, sandboxed iframes with the `allow-top-navigation-by-user-activation` may only navigate their parent's browsing context under these circumstances. The `intent` string is presented to human operators when the test is not run in automation. This method returns a promise which is resolved with the result of invoking the `action` function. If no such function is provided, the promise is resolved with the value `undefined`. Example: ```js var mediaElement = document.createElement('video'); test_driver.bless('initiate media playback', function () { mediaElement.play(); }); ``` ### click Usage: `test_driver.click(element)` * `element`: a DOM Element object This function causes a click to occur on the target element (an `Element` object), potentially scrolling the document to make it possible to click it. It returns a `Promise` that resolves after the click has occured or rejects if the element cannot be clicked (for example, it is obscured by an element on top of it). Note that if the element to be clicked does not have a unique ID, the document must not have any DOM mutations made between the function being called and the promise settling. ### send_keys Usage: `test_driver.send_keys(element, keys)` * `element`: a DOM Element object * `keys`: string to send to the element This function causes the string `keys` to be send to the target element (an `Element` object), potentially scrolling the document to make it possible to send keys. It returns a `Promise` that resolves after the keys have been send or rejects if the keys cannot be sent to the element. Note that if the element that's keys need to be send to does not have a unique ID, the document must not have any DOM mutations made between the function being called and the promise settling. To send special keys, one must send the respective key's codepoint. Since this uses the WebDriver protocol, you can find a [list for code points to special keys in the spec](https://w3c.github.io/webdriver/webdriver-spec.html#keyboard-actions). For example, to send the tab key you would send "\uE004". [activation]: https://html.spec.whatwg.org/multipage/interaction.html#activation