A small library of WebDriver locators and more for AngularJS (v1.x) and Angular (v2.x +), for Java.
We have taken JavaScript from Angular's Protractor project. While ngWebDriver perfectly compliments the Java version of WebDriver, it has to pass JavaScript up to the browser to interoperate with Angular, and the Protractor project has done the hard work (including testing) to make that solid. This project benefits from that work.
You can use ngWebDriver today with the regular Java Selenium2/WebDriver libraries. You can also use it with FluentSelenium for extra terseness.
Like Protractor, ngWebDriver works with Angular versions greater than 1.0.6/1.1.4, and is compatible with Angular 2 applications.
Note that for Angular 2 apps, the binding
and model
locators are not supported. We recommend using by.css
.
new NgWebDriver(driver).waitForAngularRequestsToFinish();
Do this if WebDriver can possibly run ahead of Angular's ability finish it's MVC stuff in your application.
As Protractor's repeater locator
ByAngular.repeater("foo in f")
ByAngular.repeater("foo in f").row(17)
ByAngular.repeater("foo in f").row(17).column("foo.name")
ByAngular.repeater("foo in f").column("foo.name")
ByAngular.exactRepeater("foo in foos")
ByAngular.exactRepeater("foo in foos").row(17)
ByAngular.exactRepeater("foo in foos").row(17).column("foo.name")
ByAngular.exactRepeater("foo in foos").column("foo.name")
As Protractor's binding locator
ByAngular.binding("person.name")
ByAngular.binding("{{person.name}}")
// You can also use a substring for a partial match
ByAngular.binding("person");
As Protractor's exactBinding locator
ByAngular.exactBinding("person.name")
ByAngular.exactBinding("{{person.name}}")
ByAngular.model('person.name')
As Protractor's options locator
ByAngular.options("c for c in colors")
As Protractor's buttonText locator
ByAngular.buttonText("cLiCk mE")
As Protractor's partialButtonText locator
// If you have a button name "Click me to open", using just "click" would do if you partialButtonText
ByAngular.partialButtonText("cLiCk ")
As Protractor's cssContainingText locator
ByAngular.cssContainingText("#animals ul .pet", "dog")
As with Protractor, you can change items in an Angular model, or retrieve them reagrdless of whether they appear in the UI or not.
NgWebDriver ngWebDriver = new NgWebDriver(driver);
// change something via the model defined in $scope
ngWebDriver.mutate(formElement, "person.name", "'Wilma'");
// Note Wilma wrapped in single-quotes as it has to be a valid JavaScript
// string literal when it arrives browser-side for execution
As a JSON string:
NgWebDriver ngWebDriver = new NgWebDriver(driver);
// Get something via the model defined in $scope
String personJson = ngWebDriver.retrieveJson(formElement, "person");
As a string:
NgWebDriver ngWebDriver = new NgWebDriver(driver);
// Get something via the model defined in $scope
String personName = ngWebDriver.retrieveAsString(formElement, "person.name");
As a number:
NgWebDriver ngWebDriver = new NgWebDriver(driver);
// Get something via the model defined in $scope
Long personAge = ngWebDriver.retrieveAsLong(formElement, "person.age");
As Map/dict:
NgWebDriver ngWebDriver = new NgWebDriver(driver);
// Get something via the model defined in $scope
Map person = (Map) ngWebDriver.retrieve(formElement, "person");
// note - could be List instead of a Map - WebDriver makes a late decision on that
Perhaps a different selector should be used to find Angular apps:
NgWebDriver ngwd = new NgWebDriver(javascriptExecutor).withRootSelector("something-custom");
ByAngular.Factory factory = ngwd.makeByAngularFactory()
factory.exactRepeater("day in days");
// locators
ByAngular.withRootSelector("something-custom").exactRepeater("day in days");
// or
ByAngular.Factory baf = ByAngular.withRootSelector("something-custom");
ByAngularRepeater foo = baf.exactRepeater("day in days");
Referring to a handy StackOverflow questions - No injector found for element argument to getTestability, you can use any selector:
'[ng-app]'
- matching an element that has the arributeng-app
(this is the default)'#my-app'
- matching an idmy-app
'[fooBar]'
- matching an attributefooBar
on any element
Returns the URL of the page.
String absoluteUrl = new NgWebDriver(driver).getLocationAbsUrl();
All our usage examples are in a single test class:
<dependency>
<groupId>com.paulhammant</groupId>
<artifactId>ngwebdriver</artifactId>
<version>0.9.6</version>
<scope>test</scope>
</dependency>
<!-- you still need to have a dependency for preferred version of
Selenium/WebDriver. That should be 2.48.2 or above -->
Download from Mavens Central Repo
Last Release: 1.0 - Jan 21, 2017
Refer CHANGELOG