Protractor attempts to wait until the page is completely loaded before performing any action (such as finding an element or sending a command to an element). If your application continuously polls $timeout or $http, it will never be registered as completely loaded. You should use the $interval service for anything that polls continuously (introduced in Angular 1.2rc3). Further discussion is in issue 59.
You may also be running into a timeout because your page is slow to load
or perform actions. By default, Protractor sets the timeout for actions to
11 seconds. You can change this in your config with the allScriptsTimeout
options.
exports.config = {
// Override the timeout for webdriver to 20 seconds.
allScriptsTimeout: 20000,
}
Check out the debugging doc for more information.
Karma is a great tool for unit testing, and Protractor is intended for end to end or integration testing. This means that small tests for the logic of your individual controllers, directives, and services should be run using Karma. Big tests in which you have a running instance of your entire application should be run using Protractor. Protractor is intended to run tests from a user's point of view - if your test could be written down as instructions for a human interacting with your application, it should be an end to end test written with Protractor.
Here's a great blog post with more info.
Protractor supports angular 1.0.6/1.1.4 and higher - check that your version of Angular is upgraded.
The angular
variable is expected to be available in the global context. Try opening chrome devtools or firefox and see if angular
is defined.
If your app needs log-in, there are a couple ways to deal with it. If your login
page is not written with Angular, you'll need to interact with it via
unwrapped webdriver, which can be accessed like browser.driver.get()
.
You can put your log-in code into an onPrepare
function, which will be run
once before any of your tests. See this example.
If you would like to do your login in your test suite itself, see this example.
This is a webdriver quirk.
<input>
and <textarea>
elements always have
empty getText
values. Instead, try element.getAttribute('value')
.
In general, the design of WebDriver tests is to interact with the page as a user would, so it gets a little tricky if you want to interact with the JavaScript directly. You should avoid it unless you have a good reason. However, there are ways of doing it.
You can use the evaluate function on a WebElement to get the value of an Angular expression in the scope of that element. e.g.
by.css('.foo').evaluate('bar')
would return whatever {{bar}}
is in the scope of the element with class 'foo'.
You can also execute arbitrary JavaScript in the browser with
browser.executeScript('your script as a string')