Being a JS testing tool, Angular Protractor enforces one to (re)write the web page tests in Javascript - this project (and the sibling C# Protractor Client Framework) tries to make such switch unnecessary. On the other hand Protractor offers some locator strategies that take advantage of Angular's features to testers - this project tries to keep these available.
Currently supported Angular Proractor methods:
binding.js
buttonText.js
evaluate.js
getLocationAbsUrl.js
model.js
options.js
partialButtonText.js
repeater.js
repeaterColumn.js
repeaterElement.js
repeaterRows.js
resumeAngularBootstrap.js
selectedOption.js
testForAngular.js
waitForAngular.js
The following commands compile the project in console.
set M2=c:\java\apache-maven-3.2.1\bin
set M2_HOME=c:\java\apache-maven-3.2.1
set MAVEN_OPTS=-Xms256m -Xmx512m
set JAVA_HOME=c:\java\jdk1.7.0_65
set JAVA_VERSION=1.7.0_65
PATH=%JAVA_HOME%\bin;%PATH%;%M2%
REM
REM move %USERPROFILE%\.M2 %USERPROFILE%\.M2.MOVED
REM rd /s/q %USERPROFILE%\.M2
set TRAVIS=true
mvn clean package
export TRAVIS=true
mvn clean package
- Copy
target\jprotractor-1.0-SNAPSHOT.jar
to your projectsrc/main/resources
:
+---src
+---main
+---java
| +---com
| +---mycompany
| +---app
+---resources
- Add reference to the project
pom.xml
(a sample project is checked in)
<properties>
<jprotractor.version>1.0-SNAPSHOT</jprotractor.version>
</properties>
<dependencies>
<dependency>
<groupId>com.jprotractor</groupId>
<artifactId>jprotractor</artifactId>
<version>${jprotractor.version}</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/jprotractor-${jprotractor.version}.jar</systemPath>
</dependency>
</dependencies>
- Add reference to the code:
import com.jprotractor.NgBy;
import com.jprotractor.NgWebDriver;
import com.jprotractor.NgWebElement;
- Copy the
target\jprotractor-1.0-SNAPSHOT.jar
in the same location oher dependency jars, e.g.c:\java\selenium
, - Use the bolierplate
build.xml
(a sample project is checked in) or merge with your existing build file(s):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project name="example" basedir=".">
<property name="build.dir" value="${basedir}/build"/>
<property name="selenium.jars" value="c:/java/selenium"/>
<property name="src.dir" value="${basedir}/src"/>
<target name="loadTestNG" depends="setClassPath">
<taskdef resource="testngtasks" classpath="${test.classpath}"/>
</target>
<target name="setClassPath">
<path id="classpath_jars">
<pathelement path="${basedir}/"/>
<fileset dir="${selenium.jars}" includes="*.jar"/>
</path>
<pathconvert pathsep=";" property="test.classpath" refid="classpath_jars"/>
</target>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile" depends="clean,setClassPath,loadTestNG">
<mkdir dir="${build.dir}"/>
<javac destdir="${build.dir}" srcdir="${src.dir}">
<classpath refid="classpath_jars"/>
</javac>
</target>
<target name="test" depends="compile">
<testng classpath="${test.classpath};${build.dir}">
<xmlfileset dir="${basedir}" includes="testng.xml"/>
</testng>
</target>
</project>
- Add reference to the code:
import com.jprotractor.NgBy;
import com.jprotractor.NgWebDriver;
import com.jprotractor.NgWebElement;
For desktop browser testing, run a Selenium node and Selenium hub on port 4444 and
@BeforeClass
public static void setup() throws IOException {
DesiredCapabilities capabilities = new DesiredCapabilities("firefox", "", Platform.ANY);
FirefoxProfile profile = new ProfilesIni().getProfile("default");
capabilities.setCapability("firefox_profile", profile);
seleniumDriver = new RemoteWebDriver(new URL("http://127.0.0.1:4444/wd/hub"), capabilities);
ngDriver = new NgWebDriver(seleniumDriver);
}
@Before
public void beforeEach() {
String baseUrl = "http://www.way2automation.com/angularjs-protractor/banking";
ngDriver.navigate().to(baseUrl);
}
@Test
public void testCustomerLogin() throws Exception {
NgWebElement element = ngDriver.findElement(NgBy.buttonText("Customer Login"));
highlight(element, 100);
element.click();
element = ngDriver.findElement(NgBy.input("custId"));
assertThat(element.getAttribute("id"), equalTo("userSelect"));
Enumeration<WebElement> elements = Collections.enumeration(ngDriver.findElements(NgBy.repeater("cust in Customers")));
while (elements.hasMoreElements()){
WebElement next_element = elements.nextElement();
if (next_element.getText().indexOf("Harry Potter") >= 0 ){
System.err.println(next_element.getText());
next_element.click();
}
}
NgWebElement login_element = ngDriver.findElement(NgBy.buttonText("Login"));
assertTrue(login_element.isEnabled());
login_element.click();
assertThat(ngDriver.findElement(NgBy.binding("user")).getText(),containsString("Harry"));
NgWebElement account_number_element = ngDriver.findElement(NgBy.binding("accountNo"));
assertThat(account_number_element, notNullValue());
assertTrue(account_number_element.getText().matches("^\\d+$"));
}
for CI build replace the Setup () with
@BeforeClass
public static void setup() throws IOException {
seleniumDriver = new PhantomJSDriver();
ngDriver = new NgWebDriver(seleniumDriver);
}
PhantomJs allows loading Angular samples from file://
content, you need to allow some additional options if the test page loads external content:
DesiredCapabilities capabilities = new DesiredCapabilities("phantomjs", "", Platform.ANY);
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, new String[] {
"--web-security=false",
"--ssl-protocol=any",
"--ignore-ssl-errors=true",
"--local-to-remote-url-access=true", // prevent local file test XMLHttpRequest Exception 101
"--webdriver-loglevel=INFO" // set to DEBUG for a really verbose console output
});
seleniumDriver = new PhantomJSDriver(capabilities);
seleniumDriver.manage().window().setSize(new Dimension(width , height ));
seleniumDriver.manage().timeouts()
.pageLoadTimeout(50, TimeUnit.SECONDS)
.implicitlyWait(implicitWait, TimeUnit.SECONDS)
.setScriptTimeout(10, TimeUnit.SECONDS);
wait = new WebDriverWait(seleniumDriver, flexibleWait );
wait.pollingEvery(pollingInterval,TimeUnit.MILLISECONDS);
actions = new Actions(seleniumDriver);
ngDriver = new NgWebDriver(seleniumDriver);
localFile = "local_file.htm";
URI uri = NgByIntegrationTest.class.getClassLoader().getResource(localFile).toURI();
ngDriver.navigate().to(uri);
WebElement element = ngDriver.findElement(NgBy.repeater("item in items"));
assertThat(element, notNullValue());
Certain tests ( e.g. involving NgBy.selectedOption()
) currently fail under travis CI build.