element() global API
Overview
The newly added element()
global object adds to Nightwatch 2 the functionality present in the Selenium WebElement class.
It supports all the usual ways of locating elements in Nightwatch, as well as the Selenium locators built using By()
, which is also available in Nightwatch as a global named by()
.
Usage
Using regular CSS (or Xpath) selectors
const addButtonEl = element('button[type="submit"]');
Using Nightwatch selector objects
const addButtonEl = element({
selector: 'button[type="button"]',
index: 0
});
Selenium locators
const locator = by.css('button[type="button"]');
const addButtonEl = element(locator);
Selenium WebElements as arguments
// webElement is an instance of WebElement class from Selenium
const addButtonEl = element(webElement);
Retrieve the Selenium WebElement instance
const addButtonEl = element('button[type="submit"]');
const instance = await addButtonEl.findElement();
API Commands
All the existing methods from a regular WebElement instance are available. If a method is called, it will be added to the Nightwatch queue accordingly.
Available element commands:
- .clear()
- .click()
- .findElement()
- .findElements()
- .getAttribute()
- .getCssValue()
- .getDriver()
- .getId()
- .getRect()
- .getTagName()
- .getText()
- .isDisplayed()
- .isEnabled()
- .isSelected()
- .sendKeys()
- .submit()
- .takeScreenshot()
Working Example
The example below navigates to the AngularJS homepage and adds a new to-do item in the sample ToDo App available there.
describe('angularjs homepage todo list', function() {
// using the new element() global utility in Nightwatch 2 to init elements
// before tests and use them later
const todoElement = element('[ng-model="todoList.todoText"]');
const addButtonEl = element('[value="add"]');
it('should add a todo using global element()', function() {
// adding a new task to the list
browser
.navigateTo('https://angularjs.org')
.sendKeys(todoElement, 'what is nightwatch?')
.click(addButtonEl);
// verifying if there are 3 tasks in the list
expect.elements('[ng-repeat="todo in todoList.todos"]').count.to.equal(3);
// verifying if the third task if the one we have just added
const lastElementTask = element({
selector: '[ng-repeat="todo in todoList.todos"]',
index: 2
});
expect(lastElementTask).text.to.equal('what is nightwatch?');
// find our task in the list and mark it as done
lastElementTask.findElement('input', function(inputResult) {
if (inputResult.error) {
throw inputResult.error;
}
const inputElement = element(inputResult.value);
browser.click(inputElement);
});
// verify if there are 2 tasks which are marked as done in the list
expect.elements('*[module=todoApp] li .done-true').count.to.equal(2);
});
});