484 lines
17 KiB
JavaScript
Executable File
484 lines
17 KiB
JavaScript
Executable File
/*eslint strict:0*/
|
|
var fs = require('fs');
|
|
var selectXPath = require('casper').selectXPath;
|
|
var exp = false;
|
|
|
|
/**
|
|
* Known regression in 2.0.0, will be fixed in 2.0.1
|
|
* https://github.com/ariya/phantomjs/issues/12506
|
|
*/
|
|
function skipPhantom200 (test, nb) {
|
|
return test.skipIfEngine(nb, {
|
|
name: 'phantomjs',
|
|
version: {
|
|
min: '2.0.0',
|
|
max: '2.0.0'
|
|
},
|
|
message: 'form regression 12506'
|
|
});
|
|
}
|
|
|
|
function skipSlimer095 (test, nb) {
|
|
return test.skipIfEngine(nb, {
|
|
name: 'slimerjs',
|
|
version: {
|
|
min: '0.8.0',
|
|
max: '0.9.4'
|
|
},
|
|
message: 'filePicker method missing'
|
|
});
|
|
}
|
|
|
|
function testFormValues(test) {
|
|
test.assertField('email', 'chuck@norris.com',
|
|
'can fill an input[type=text] form field');
|
|
test.assertField('password', '42',
|
|
'can fill an input[type=password] form field');
|
|
test.assertField('content', 'Am watching thou',
|
|
'can fill a textarea form field');
|
|
test.assertField('topic', 'bar',
|
|
'can pick a value from a select form field');
|
|
test.assertField('multitopic', ['bar', 'car'],
|
|
'can pick a set of values from a multiselect form field');
|
|
test.assertField('check', true,
|
|
'can check a form checkbox');
|
|
test.assertEvalEquals(function() {
|
|
return __utils__.findOne('input[name="choice"][value="no"]').checked;
|
|
}, true, 'can check a form radio button 1/2');
|
|
test.assertEvalEquals(function() {
|
|
return __utils__.findOne('input[name="choice"][value="yes"]').checked;
|
|
}, false, 'can check a form radio button 2/2');
|
|
test.assertEvalEquals(function() {
|
|
return (__utils__.findOne('input[name="checklist[]"][value="1"]').checked &&
|
|
!__utils__.findOne('input[name="checklist[]"][value="2"]').checked &&
|
|
__utils__.findOne('input[name="checklist[]"][value="3"]').checked);
|
|
}, true, 'can fill a list of checkboxes');
|
|
if (!skipPhantom200(test, 2)) {
|
|
test.assertEvalEquals(function() {
|
|
return __utils__.findOne('input[name="file"]').files.length === 1;
|
|
}, true, 'can select a file to upload');
|
|
if (!skipSlimer095(test,1)) {
|
|
test.assertEvalEquals(function() {
|
|
return __utils__.findOne('input[name="file"]').value.indexOf('README.md') !== -1;
|
|
}, true, 'can check a form file value');
|
|
}
|
|
}
|
|
}
|
|
|
|
function testUrl(test) {
|
|
casper.waitForUrl(/(^\?|&)submit=submit($|&)/, function() {
|
|
test.assertUrlMatch(/email=chuck@norris.com/, 'input[type=email] field was submitted');
|
|
test.assertUrlMatch(/password=42/, 'input[type=password] field was submitted');
|
|
test.assertUrlMatch(/content=Am\+watching\+thou/, 'textarea field was submitted');
|
|
test.assertUrlMatch(/check=on/, 'input[type=checkbox] field was submitted');
|
|
test.assertUrlMatch(/choice=no/, 'input[type=radio] field was submitted');
|
|
test.assertUrlMatch(/topic=bar/, 'select field was submitted');
|
|
test.assertUrlMatch(/multitopic=bar&multitopic=car/, 'multitopic select fields were submitted');
|
|
test.assertUrlMatch(/strange=very/, 'strangely typed input field was submitted');
|
|
});
|
|
}
|
|
|
|
|
|
|
|
casper.test.begin('fill() & fillNames() tests', 19, function(test) {
|
|
var fpath = fs.pathJoin(phantom.casperPath, 'README.md');
|
|
|
|
casper.start('tests/site/form.html', function() {
|
|
this.fill('form[action="result.html"]', {
|
|
email: 'chuck@norris.com',
|
|
password: 42,
|
|
content: 'Am watching thou',
|
|
check: true,
|
|
choice: 'no',
|
|
topic: 'bar',
|
|
multitopic: ['bar', 'car'],
|
|
file: fpath,
|
|
'checklist[]': ['1', '3'],
|
|
strange: "very"
|
|
});
|
|
testFormValues(test);
|
|
});
|
|
casper.thenClick('input[type="submit"]', function() {
|
|
testUrl(test);
|
|
});
|
|
casper.run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
casper.test.begin('fillLabels() tests', 19, function(test) {
|
|
var fpath = fs.pathJoin(phantom.casperPath, 'README.md');
|
|
|
|
casper.start('tests/site/form.html', function() {
|
|
this.fillLabels('form[action="result.html"]', {
|
|
Email: 'chuck@norris.com',
|
|
Password: 42,
|
|
Content: 'Am watching thou',
|
|
Check: true,
|
|
No: true,
|
|
Topic: 'bar',
|
|
Multitopic: ['bar', 'car'],
|
|
File: fpath,
|
|
"1": true,
|
|
"3": true,
|
|
Strange: "very"
|
|
});
|
|
testFormValues(test);
|
|
});
|
|
casper.thenClick('input[type="submit"]', function() {
|
|
testUrl(test);
|
|
});
|
|
casper.run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
casper.test.begin('fillSelectors() tests', 19, function(test) {
|
|
var fpath = fs.pathJoin(phantom.casperPath, 'README.md');
|
|
|
|
casper.start('tests/site/form.html', function() {
|
|
this.fillSelectors('form[action="result.html"]', {
|
|
"input[name='email']": 'chuck@norris.com',
|
|
"input[name='password']": 42,
|
|
"textarea[name='content']": 'Am watching thou',
|
|
"input[name='check']": true,
|
|
"input[name='choice']": 'no',
|
|
"select[name='topic']": 'bar',
|
|
"select[name='multitopic']": ['bar', 'car'],
|
|
"input[name='file']": fpath,
|
|
"input[name='checklist[]']": ['1', '3'],
|
|
"input[name='strange']": "very"
|
|
});
|
|
testFormValues(test);
|
|
});
|
|
casper.thenClick('input[type="submit"]', function() {
|
|
testUrl(test);
|
|
});
|
|
casper.run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
casper.test.begin('fillXPath() tests', 19, {
|
|
|
|
setUp: function(test) {
|
|
var self = this;
|
|
var fpath = fs.pathJoin(phantom.casperPath, 'README.md');
|
|
casper.removeAllFilters('page.filePicker');
|
|
casper.setFilter('page.filePicker', function() {
|
|
exp = true;
|
|
return fpath;
|
|
});
|
|
},
|
|
|
|
tearDown: function(test) {
|
|
casper.removeAllFilters('page.filePicker');
|
|
},
|
|
|
|
test: function(test) {
|
|
var fpath = fs.pathJoin(phantom.casperPath, 'README.md');
|
|
casper.start('tests/site/form.html', function() {
|
|
this.fillXPath('form[action="result.html"]', {
|
|
'//input[@name="email"]': 'chuck@norris.com',
|
|
'//input[@name="password"]': 42,
|
|
'//textarea[@name="content"]': 'Am watching thou',
|
|
'//input[@name="check"]': true,
|
|
'//input[@name="choice"]': 'no',
|
|
'//select[@name="topic"]': 'bar',
|
|
'//input[@name="file"]': fpath,
|
|
'//select[@name="multitopic"]': ['bar', 'car'],
|
|
'//input[@name="checklist[]"]': ['1', '3'],
|
|
'//input[@name="strange"]': "very"
|
|
});
|
|
});
|
|
casper.thenClick(selectXPath('//input[@name="file"]'), function() {
|
|
testFormValues(test);
|
|
});
|
|
casper.thenClick('input[type="submit"]', function() {
|
|
testUrl(test);
|
|
});
|
|
casper.run(function() {
|
|
test.done();
|
|
});
|
|
}
|
|
});
|
|
|
|
casper.test.begin('nonexistent fields', 1, function(test) {
|
|
casper.start('tests/site/form.html', function() {
|
|
test.assertRaises(this.fill, ['form[action="result.html"]', {
|
|
nonexistent: 42
|
|
}, true], 'Casper.fill() raises an exception when unable to fill a form');
|
|
}).run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
casper.test.begin('multiple forms', 1, function(test) {
|
|
casper.start('tests/site/multiple-forms.html', function() {
|
|
this.fill('form[name="f2"]', {
|
|
yo: "ok"
|
|
}, true);
|
|
}).waitForUrl(/\?f=f2&yo=ok$/, function() {
|
|
this.fill('form[name="f2"]', {
|
|
yo: "ok"
|
|
});
|
|
test.assertEquals(this.getFormValues('form[name="f2"]'), {
|
|
f: "f2",
|
|
yo: "ok"
|
|
}, 'Casper.getFormValues() retrieves filled values when multiple forms have same field names');
|
|
}).run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
casper.test.begin('file multiple', 1, function(test) {
|
|
var fpaths = [fs.pathJoin(phantom.casperPath, 'README.md'),
|
|
fs.pathJoin(phantom.casperPath, 'LICENSE.md')
|
|
];
|
|
|
|
casper.start('tests/site/field-file-multiple.html', function() {
|
|
this.fillSelectors('form[action="result.html"]', {
|
|
'input[name="files[]"]': fpaths
|
|
});
|
|
if (!skipPhantom200(test, 1)) {
|
|
test.assertEval(function() {
|
|
return __utils__.findOne('input[type="file"]').files.length === 2;
|
|
});
|
|
}
|
|
}).run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
casper.test.begin('field array', 1, function(test) {
|
|
// issue #267: array syntax field names
|
|
casper.start('tests/site/field-array.html', function() {
|
|
this.fill('form', {
|
|
'foo[bar]': "bar",
|
|
'foo[baz]': "baz"
|
|
}, true);
|
|
}).waitForUrl("?foo[bar]=bar&foo[baz]=baz", function() {
|
|
test.pass('Casper.fill() handles array syntax field names');
|
|
}).run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
casper.test.begin('getFormValues() tests', 2, function(test) {
|
|
var fpath = fs.pathJoin(phantom.casperPath, 'README.md');
|
|
var fileValue = 'README.md';
|
|
if (phantom.casperEngine === 'phantomjs') {
|
|
if (utils.matchEngine({
|
|
name: 'phantomjs',
|
|
version: {min: '2.0.0', max: '2.0.0'}
|
|
})) {
|
|
fileValue = '';
|
|
} else {
|
|
fileValue = 'C:\\fakepath\\README.md'; // phantomjs/webkit sets that;
|
|
}
|
|
}
|
|
if (phantom.casperEngine === 'slimerjs' && !!utils.gteVersion(slimer.version, '1.0.0')) {
|
|
fileValue = 'C:\\fakepath\\README.md';
|
|
}
|
|
|
|
casper.start('tests/site/form.html', function() {
|
|
this.fill('form[action="result.html"]', {
|
|
email: 'chuck@norris.com',
|
|
password: 42,
|
|
language: 'english',
|
|
content: 'Am watching thou',
|
|
check: true,
|
|
choice: 'no',
|
|
topic: 'bar',
|
|
multitopic: ['bar', 'car'],
|
|
file: fpath,
|
|
'checklist[]': ['1', '3'],
|
|
strange: "very"
|
|
});
|
|
});
|
|
casper.then(function() {
|
|
test.assertEquals(this.getFormValues('form'), {
|
|
"check": true,
|
|
"checklist[]": ["1", "3"],
|
|
"choice": "no",
|
|
"content": "Am watching thou",
|
|
"email": "chuck@norris.com",
|
|
"file": fileValue,
|
|
"password": "42",
|
|
"submit": "submit",
|
|
"language": "english",
|
|
"topic": "bar",
|
|
"multitopic": ["bar", "car"],
|
|
"strange": "very"
|
|
}, 'Casper.getFormValues() retrieves filled values');
|
|
});
|
|
casper.then(function() {
|
|
this.fill('form[action="result.html"]', {
|
|
email: 'chuck@norris.com',
|
|
password: '42',
|
|
language: 'english',
|
|
content: 'Am watching thou',
|
|
check: true,
|
|
choice: 'yes',
|
|
topic: 'bar',
|
|
multitopic: ["bar", "car"],
|
|
file: fpath,
|
|
'checklist[]': ['1', '3'],
|
|
strange: "very"
|
|
});
|
|
});
|
|
casper.then(function() {
|
|
test.assertEquals(this.getFormValues('form'), {
|
|
"check": true,
|
|
"checklist[]": ["1", "3"],
|
|
"choice": "yes",
|
|
"content": "Am watching thou",
|
|
"email": "chuck@norris.com",
|
|
"file": fileValue,
|
|
"password": "42",
|
|
"language": "english",
|
|
"submit": "submit",
|
|
"topic": "bar",
|
|
"multitopic": ["bar", "car"],
|
|
"strange": "very"
|
|
}, 'Casper.getFormValues() correctly retrieves values from radio inputs regardless of order');
|
|
});
|
|
casper.run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
casper.test.begin('fillSelectors() tests', 4, function(test) {
|
|
var fpath = fs.pathJoin(phantom.casperPath, 'README.md');
|
|
|
|
casper.start('tests/site/form.html', function() {
|
|
this.fillSelectors('form[action="result.html"]', {
|
|
"select[name='topic']": 'baz',
|
|
"select[name='multitopic']": ['baz', 'caz'],
|
|
});
|
|
test.assertField('topic', 'bar', 'can pick a value from a select form field by text value');
|
|
test.assertField('multitopic', ['bar', 'car'], 'can pick a set of values from a multiselect form field by text value');
|
|
});
|
|
casper.thenClick('input[type="submit"]', function() {
|
|
test.assertUrlMatch(/topic=bar/, 'select field was submitted');
|
|
test.assertUrlMatch(/multitopic=bar&multitopic=car/, 'multitopic select fields were submitted');
|
|
});
|
|
casper.run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
//
|
|
// setFieldValue() tests
|
|
//
|
|
casper.test.begin('setFieldValue() tests with css3 selector and form', 11, function(test) {
|
|
var fpath = fs.pathJoin(phantom.casperPath, 'README.md');
|
|
casper.start('tests/site/form.html', function() {
|
|
var data = {
|
|
"input[name='email']": 'chuck@norris.com',
|
|
"input[name='password']": 42,
|
|
"textarea[name='content']": 'Am watching thou',
|
|
"input[name='check']": true,
|
|
"input[name='choice']": 'no',
|
|
"select[name='topic']": 'bar',
|
|
"input[name='file']": fpath,
|
|
"select[name='multitopic']": ['bar', 'car'],
|
|
"input[name='checklist[]']": ['1', '3'],
|
|
"input[name='strange']": "very"
|
|
};
|
|
|
|
for (var selector in data){
|
|
this.setFieldValue(selector, data[selector], 'form[action="result.html"]');
|
|
}
|
|
testFormValues(test);
|
|
});
|
|
|
|
casper.run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
casper.test.begin('setFieldValue() tests with XPath selector', 11, function(test) {
|
|
var fpath = fs.pathJoin(phantom.casperPath, 'README.md');
|
|
casper.start('tests/site/form.html', function() {
|
|
var data = {
|
|
'//input[@name="email"]': 'chuck@norris.com',
|
|
'//input[@name="password"]': 42,
|
|
'//textarea[@name="content"]': 'Am watching thou',
|
|
'//input[@name="check"]': true,
|
|
'//input[@name="choice"]': 'no',
|
|
'//select[@name="topic"]': 'bar',
|
|
'//input[@name="file"]': fpath,
|
|
'//select[@name="multitopic"]': ['bar', 'car'],
|
|
'//input[@name="checklist[]"]': ['1', '3'],
|
|
'//input[@name="strange"]': "very"
|
|
};
|
|
|
|
for (var selector in data){
|
|
this.setFieldValue( selectXPath(selector), data[selector]);
|
|
}
|
|
testFormValues(test);
|
|
});
|
|
|
|
casper.run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
casper.test.begin('setFieldValueName() tests', 11, function(test) {
|
|
var fpath = fs.pathJoin(phantom.casperPath, 'README.md');
|
|
casper.start('tests/site/form.html', function() {
|
|
var data = {
|
|
email: 'chuck@norris.com',
|
|
password: 42,
|
|
content: 'Am watching thou',
|
|
check: true,
|
|
choice: 'no',
|
|
topic: 'bar',
|
|
file: fpath,
|
|
multitopic: ['bar', 'car'],
|
|
'checklist[]': ['1', '3'],
|
|
strange: "very"
|
|
};
|
|
|
|
for (var selector in data){
|
|
this.setFieldValueName(selector, data[selector]);
|
|
}
|
|
testFormValues(test);
|
|
});
|
|
|
|
casper.run(function() {
|
|
test.done();
|
|
});
|
|
});
|
|
|
|
casper.test.begin('setFieldValueLabel() tests', 11, function(test) {
|
|
var fpath = fs.pathJoin(phantom.casperPath, 'README.md');
|
|
casper.start('tests/site/form.html', function() {
|
|
var data = {
|
|
Email: 'chuck@norris.com',
|
|
Password: 42,
|
|
Content: 'Am watching thou',
|
|
Check: true,
|
|
No: true,
|
|
Topic: 'bar',
|
|
File: fpath,
|
|
Multitopic: ['bar', 'car'],
|
|
"1": true,
|
|
"3": true,
|
|
Strange: "very"
|
|
};
|
|
for (var selector in data){
|
|
this.setFieldValueLabel(selector, data[selector]);
|
|
}
|
|
testFormValues(test);
|
|
});
|
|
|
|
casper.run(function() {
|
|
test.done();
|
|
casper.result.log = [];
|
|
});
|
|
});
|
|
|
|
// end setFieldValue() test
|