aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Gruntfile.js4
-rw-r--r--docs/content/guide/expression.ngdoc4
-rw-r--r--docs/src/ngdoc.js19
-rwxr-xr-xjenkins_build.sh12
-rw-r--r--lib/grunt/utils.js6
-rw-r--r--package.json4
-rw-r--r--protractor-jenkins-conf.js36
-rwxr-xr-xscripts/travis/build.sh7
-rw-r--r--src/ng/directive/input.js8
-rw-r--r--src/ng/directive/ngInclude.js9
-rw-r--r--src/ng/filter/filters.js8
-rw-r--r--test/e2e/docsAppE2E.js1
12 files changed, 99 insertions, 19 deletions
diff --git a/Gruntfile.js b/Gruntfile.js
index ff4db327..7f36395f 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -91,7 +91,8 @@ module.exports = function(grunt) {
runprotractor: {
- normal: 'protractor-conf.js'
+ normal: 'protractor-conf.js',
+ jenkins: 'protractor-jenkins-conf.js'
},
@@ -291,6 +292,7 @@ module.exports = function(grunt) {
grunt.registerTask('test:docs', 'Run the doc-page tests with Karma', ['package', 'tests:docs']);
grunt.registerTask('test:unit', 'Run unit, jQuery and Karma module tests with Karma', ['tests:jqlite', 'tests:jquery', 'tests:modules']);
grunt.registerTask('test:protractor', 'Run the end to end tests with Protractor and keep a test server running in the background', ['webdriver', 'connect:testserver', 'runprotractor:normal']);
+ grunt.registerTask('test:ci-protractor', 'Run the end to end tests with Protractor and keep a test server running in the background', ['webdriver', 'connect:testserver', 'runprotractor:jenkins']);
grunt.registerTask('test:e2e', 'Alias for test:protractor', ['test:protractor']);
grunt.registerTask('test:docgen', ['jasmine_node']);
grunt.registerTask('test:promises-aplus',['build:promises-aplus-adapter','shell:promises-aplus-tests']);
diff --git a/docs/content/guide/expression.ngdoc b/docs/content/guide/expression.ngdoc
index f1e2735b..99cc7514 100644
--- a/docs/content/guide/expression.ngdoc
+++ b/docs/content/guide/expression.ngdoc
@@ -110,6 +110,10 @@ prevent accidental access to the global state (a common source of subtle bugs).
</doc:source>
<doc:protractor>
it('should calculate expression in binding', function() {
+ if (browser.params.browser = 'safari') {
+ // Safari can't handle dialogs.
+ return;
+ };
element(by.css('[ng-click="greet()"]')).click();
var alertDialog = browser.switchTo().alert();
diff --git a/docs/src/ngdoc.js b/docs/src/ngdoc.js
index 970f5c56..1e8896d0 100644
--- a/docs/src/ngdoc.js
+++ b/docs/src/ngdoc.js
@@ -1113,14 +1113,25 @@ function scenarios(docs){
function writeProtractorTest(doc){
var lines = [];
lines.push('describe("' + doc.section + '/' + doc.id + '", function() {');
- lines.push(' beforeEach(function() {');
- lines.push(' browser.get("index-nocache.html#!/' + doc.section + '/' + doc.id + '");');
- lines.push(' });');
+ lines.push(' describe("angular+jqLite", function() {')
+ lines.push(' beforeEach(function() {');
+ lines.push(' browser.get("index-nocache.html#!/' + doc.section + '/' + doc.id + '");');
+ lines.push(' });');
lines.push('');
doc.protractorTests.forEach(function(test){
- lines.push(indentCode(trim(test), 2));
+ lines.push(indentCode(trim(test), 4));
+ lines.push('');
+ });
+ lines.push(' });');
+ lines.push(' describe("angular+jQuery", function() {')
+ lines.push(' beforeEach(function() {');
+ lines.push(' browser.get("index-jq-nocache.html#!/' + doc.section + '/' + doc.id + '");');
+ lines.push(' });');
+ doc.protractorTests.forEach(function(test){
+ lines.push(indentCode(trim(test), 4));
lines.push('');
});
+ lines.push(' });');
lines.push('});');
lines.push('');
return lines.join('\n');
diff --git a/jenkins_build.sh b/jenkins_build.sh
index 17610a92..bacac5e7 100755
--- a/jenkins_build.sh
+++ b/jenkins_build.sh
@@ -13,12 +13,6 @@ then
BROWSERS="Chrome,Firefox,Opera,/Users/jenkins/bin/safari.sh,/Users/jenkins/bin/ie8.sh,/Users/jenkins/bin/ie9.sh"
fi
-if [[ -z "$BROWSERS_E2E" ]]
-then
- BROWSERS_E2E="Chrome,Firefox,/Users/jenkins/bin/safari.sh"
-fi
-
-
# CLEAN #
rm -f angular.min.js.gzip.size
rm -f angular.js.size
@@ -28,6 +22,8 @@ rm -f angular.js.size
npm install --color false
grunt ci-checks package --no-color
+mkdir test_out
+
# DOCS generator unit tests #
grunt test:docgen --no-color
@@ -35,7 +31,9 @@ grunt test:docgen --no-color
grunt test:unit --browsers $BROWSERS --reporters=dots,junit --no-colors --no-color
# END TO END TESTS #
-grunt test:protractor
+grunt test:ci-protractor
+grunt test:ci-protractor --browser safari
+grunt test:ci-protractor --browser firefox
# Promises/A+ TESTS #
grunt test:promises-aplus --no-color
diff --git a/lib/grunt/utils.js b/lib/grunt/utils.js
index 311bbef2..a3a7e7b2 100644
--- a/lib/grunt/utils.js
+++ b/lib/grunt/utils.js
@@ -141,6 +141,7 @@ module.exports = {
// Skip the webdriver-manager update on Travis, since the browsers will
// be provided remotely.
done();
+ return;
}
var p = spawn('node', ['node_modules/protractor/bin/webdriver-manager', 'update']);
p.stdout.pipe(process.stdout);
@@ -156,11 +157,16 @@ module.exports = {
var sauceKey = grunt.option('sauceKey');
var tunnelIdentifier = grunt.option('capabilities.tunnel-identifier');
var sauceBuild = grunt.option('capabilities.build');
+ var browser = grunt.option('browser');
var args = ['node_modules/protractor/bin/protractor', config];
if (sauceUser) args.push('--sauceUser=' + sauceUser);
if (sauceKey) args.push('--sauceKey=' + sauceKey);
if (tunnelIdentifier) args.push('--capabilities.tunnel-identifier=' + tunnelIdentifier);
if (sauceBuild) args.push('--capabilities.build=' + sauceBuild);
+ if (browser) {
+ args.push('--browser=' + browser);
+ args.push('--params.browser=' + browser);
+ }
var p = spawn('node', args);
diff --git a/package.json b/package.json
index e7283aa8..51c4c06a 100644
--- a/package.json
+++ b/package.json
@@ -43,7 +43,9 @@
"promises-aplus-tests": "~1.3.2",
"semver": "~2.1.0",
"lodash": "~2.1.0",
- "browserstacktunnel-wrapper": "~1.1.1"
+ "browserstacktunnel-wrapper": "~1.1.1",
+ "grunt-jscs-checker": "~0.3.2",
+ "jasmine-reporters": "~0.2.1"
},
"licenses": [
{
diff --git a/protractor-jenkins-conf.js b/protractor-jenkins-conf.js
new file mode 100644
index 00000000..a2491474
--- /dev/null
+++ b/protractor-jenkins-conf.js
@@ -0,0 +1,36 @@
+exports.config = {
+ allScriptsTimeout: 11000,
+
+ specs: [
+ 'build/docs/ptore2e/**/*.js',
+ 'test/e2e/docsAppE2E.js'
+ ],
+
+ capabilities: {
+ 'browserName': 'chrome'
+ },
+
+ baseUrl: 'http://localhost:8000/build/docs/',
+
+ framework: 'jasmine',
+
+ onPrepare: function() {
+ // Disable animations so e2e tests run more quickly
+ var disableNgAnimate = function() {
+ angular.module('disableNgAnimate', []).run(function($animate) {
+ $animate.enabled(false);
+ });
+ };
+
+ browser.addMockModule('disableNgAnimate', disableNgAnimate);
+
+ require('jasmine-reporters');
+ jasmine.getEnv().addReporter(
+ new jasmine.JUnitXmlReporter('test_out/e2e-' + this.capabilities.browserName + '-', true, true));
+ },
+
+ jasmineNodeOpts: {
+ defaultTimeoutInterval: 30000,
+ showColors: false
+ }
+};
diff --git a/scripts/travis/build.sh b/scripts/travis/build.sh
index 32cd8af8..b28b8e02 100755
--- a/scripts/travis/build.sh
+++ b/scripts/travis/build.sh
@@ -10,10 +10,13 @@ if [ $JOB = "unit" ]; then
grunt test:promises-aplus
grunt test:unit --browsers SL_Chrome,SL_Safari,SL_Firefox,SL_IE_8,SL_IE_9,SL_IE_10,SL_IE_11 --reporters dots
elif [ $JOB = "e2e" ]; then
- grunt test:protractor --sauceUser $SAUCE_USERNAME \
+ export SAUCE_OPTIONS="--sauceUser $SAUCE_USERNAME \
--sauceKey $SAUCE_ACCESS_KEY \
--capabilities.tunnel-identifier=$TRAVIS_JOB_NUMBER \
- --capabilities.build=$TRAVIS_BUILD_NUMBER
+ --capabilities.build=$TRAVIS_BUILD_NUMBER"
+ grunt test:protractor $SAUCE_OPTIONS
+ grunt test:protractor $SAUCE_OPTIONS --browser=firefox
+ grunt test:protractor $SAUCE_OPTIONS --browser=safari
else
echo "Unknown job type. Please set JOB=unit or JOB=e2e."
fi
diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js
index 85d0f22d..27813a46 100644
--- a/src/ng/directive/input.js
+++ b/src/ng/directive/input.js
@@ -955,11 +955,17 @@ var VALID_CLASS = 'ng-valid',
</file>
<file name="protractorTest.js">
it('should data-bind and become invalid', function() {
+ if (browser.params.browser = 'safari') {
+ // SafariDriver can't handle contenteditable.
+ return;
+ };
var contentEditable = element(by.css('.doc-example-live [contenteditable]'));
expect(contentEditable.getText()).toEqual('Change me!');
- contentEditable.clear();
+ // Firefox driver doesn't trigger the proper events on 'clear', so do this hack
+ contentEditable.click();
+ contentEditable.sendKeys(protractor.Key.chord(protractor.Key.COMMAND, "a"));
contentEditable.sendKeys(protractor.Key.BACK_SPACE);
expect(contentEditable.getText()).toEqual('');
diff --git a/src/ng/directive/ngInclude.js b/src/ng/directive/ngInclude.js
index 4935edd4..b559b576 100644
--- a/src/ng/directive/ngInclude.js
+++ b/src/ng/directive/ngInclude.js
@@ -119,12 +119,21 @@
});
it('should load template2.html', function() {
+ if (browser.params.browser == 'firefox') {
+ // Firefox can't handle using selects
+ // See https://github.com/angular/protractor/issues/480
+ return;
+ }
templateSelect.click();
templateSelect.element.all(by.css('option')).get(2).click();
expect(includeElem.getText()).toMatch(/Content of template2.html/);
});
it('should change to blank', function() {
+ if (browser.params.browser == 'firefox') {
+ // Firefox can't handle using selects
+ return;
+ }
templateSelect.click();
templateSelect.element.all(by.css('option')).get(0).click();
expect(includeElem.isPresent()).toBe(false);
diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js
index 63ea270c..f655c7a6 100644
--- a/src/ng/filter/filters.js
+++ b/src/ng/filter/filters.js
@@ -34,9 +34,13 @@
expect(element(by.binding('amount | currency:"USD$"')).getText()).toBe('USD$1,234.56');
});
it('should update', function() {
+ if (browser.params.browser == 'safari') {
+ // Safari does not understand the minus key. See
+ // https://github.com/angular/protractor/issues/481
+ return;
+ }
element(by.model('amount')).clear();
- element(by.model('amount')).sendKeys('-1234');
- expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)');
+ element(by.model('amount')).sendKeys('-1234'); expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)');
expect(element(by.binding('amount | currency:"USD$"')).getText()).toBe('(USD$1,234.00)');
});
</doc:protractor>
diff --git a/test/e2e/docsAppE2E.js b/test/e2e/docsAppE2E.js
index f92d834e..625e384c 100644
--- a/test/e2e/docsAppE2E.js
+++ b/test/e2e/docsAppE2E.js
@@ -30,7 +30,6 @@ describe('docs.angularjs.org', function () {
browser.sleep(500);
var nameInput = element(by.input('user.name'));
- nameInput.click();
nameInput.sendKeys('!!!');
var code = element(by.css('.doc-example-live tt'));