4.7 KiB
id, title, challengeType, forumTopicId, dashedName
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
587d8250367417b2b2512c5d | Ejecuta pruebas funcionales usando un navegador sin interfaz gráfica | 2 | 301595 | run-functional-tests-using-a-headless-browser |
--description--
Como recordatorio, este proyecto está siendo construido con base en el siguiente proyecto inicial Replit, o clonado desde GitHub.
En la página hay un formulario de entrada. Envía datos al endpoint PUT /travellers
como una solicitud AJAX.
Cuando la solicitud se completa con éxito, el código del cliente añade un <div>
que contiene la información en la respuesta al DOM.
Aquí hay un ejemplo de cómo usar Zombie.js para interactuar con el formulario:
test('Submit the surname "Polo" in the HTML form', function (done) {
browser.fill('surname', 'Polo').then(() => {
browser.pressButton('submit', () => {
browser.assert.success();
browser.assert.text('span#name', 'Marco');
browser.assert.text('span#surname', 'Polo');
browser.assert.elements('span#dates', 1);
done();
});
});
});
Primero, el método fill
del objeto browser
rellena el campo surname
del formulario con el valor 'Polo'
. fill
devuelve una promesa, así que then
está encadenado a ella.
Dentro del callback then
el método pressButton
del objeto browser
se utiliza para invocar el submit
del event listener. El método pressButton
es asíncrono.
Luego, una vez que se recibe una respuesta de la solicitud AJAX, se hacen algunas afirmaciones comprobando que:
- El estado de la respuesta es
200
- El texto dentro del elemento
<span id='name'></span>
coincide con'Marco'
- El texto dentro del elemento
<span id='surname'></span>
coincide con'Polo'
- Hay
1
<span id='dates'></span>
elemento.
Finalmente, se invoca el callback done
, que es necesario debido a la prueba asincrónica.
--instructions--
Dentro de tests/2_functional-tests.js
, en 'Submit the surname "Colombo" in the HTML form'
(// #5
), automatiza lo siguiente:
- Rellena el formulario con el apellido
Colombo
- Presione el botón Enviar
Y dentro del callback de pressButton
:
- Compruebe que el estado es OK
200
- Compruebe que el texto dentro del elemento
span#name
es'Cristoforo'
- Compruebe que el texto dentro del elemento
span#surname
es'Colombo'
- Compruebe que existen elemento(s)
span#dates
y su contador es1
No olvide eliminar la llamada assert.fail()
.
--hints--
Todas las pruebas deben pasar.
(getUserInput) =>
$.get(getUserInput('url') + '/_api/get-tests?type=functional&n=5').then(
(data) => {
assert.equal(data.state, 'passed');
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
Debe asegurarse que la petición del navegador sin interfaz gráfica ha sido exitosa.
(getUserInput) =>
$.get(getUserInput('url') + '/_api/get-tests?type=functional&n=5').then(
(data) => {
assert.equal(data.assertions[0].method, 'browser.success');
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
Debe comprobar que el texto dentro del elemento span#name
es 'Cristoforo'
.
(getUserInput) =>
$.get(getUserInput('url') + '/_api/get-tests?type=functional&n=5').then(
(data) => {
assert.equal(data.assertions[1].method, 'browser.text');
assert.match(data.assertions[1].args[0], /('|")span#name\1/);
assert.match(data.assertions[1].args[1], /('|")Cristoforo\1/);
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
Debes comprobar que el texto dentro del elemento span#surname
es 'Colombo'
.
(getUserInput) =>
$.get(getUserInput('url') + '/_api/get-tests?type=functional&n=5').then(
(data) => {
assert.equal(data.assertions[2].method, 'browser.text');
assert.match(data.assertions[2].args[0], /('|")span#surname\1/);
assert.match(data.assertions[2].args[1], /('|")Colombo\1/);
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
Debe comprobar que el elemento span#dates
existe y su contador es 1.
(getUserInput) =>
$.get(getUserInput('url') + '/_api/get-tests?type=functional&n=5').then(
(data) => {
assert.equal(data.assertions[3].method, 'browser.elements');
assert.match(data.assertions[3].args[0], /('|")span#dates\1/);
assert.equal(data.assertions[3].args[1], 1);
},
(xhr) => {
throw new Error(xhr.responseText);
}
);
--solutions--
/**
Backend challenges don't need solutions,
because they would need to be tested against a full working project.
Please check our contributing guidelines to learn more.
*/