Necesito recopilar una serie de identificadores de casilla de verificación que se encuentran dentro de un OL y luego usar esa matriz de identificadores más tarde para elegir uno al azar, el problema que tengo es que debido a que todo se ejecuta en las devoluciones de llamada de forma asíncrona, mi matriz siempre está vacía en el momento en que el código se ejecuta debajo de las llamadas de vigilancia nocturna.
Aquí está mi código para que pueda ver lo que quiero decir:
module.exports = { 'test-range-filter': function(browser) { // array to hold the input (checkbox) element ids let checkboxElementIds = []; browser.url(browser.launch_url + '/e-liquids/flavour-types/apple'); // loop the li elements browser.elements('css selector','#narrow-by-list > div:nth-child(3) > div.filter-options-content > div > ol > li',function(foundElements){ // loop each of the li elements foundElements.value.forEach(function(liElement){ // get the object keys let liElementKeys = Object.keys(liElement); // get the li element id using the keys[0] let liElementId = liElement[liElementKeys[0]]; // use the li element id, to find the input (checkbox) inside of it browser.elementIdElement(liElementId, 'css selector', 'input', function(inputElement) { // store the element id in the array checkboxElementIds.push(inputElement.elementId); }) }) }); console.log("CHECKBOX ELEMENTS",checkboxElementIds) } };Debido a que las llamadas antes de console.log("CHECKBOX ELEMENTS",checkboxElementIds) se ejecutan de forma asíncrona, mi matriz checkboxElementIds siempre está vacía en el momento en que se ejecuta parte del código, la matriz se llena, puedo ver al agregar esto:
setTimeout(function() { console.log("CHECKBOX ELEMENTS", checkboxElementIds) },5000);Lo que da esta salida:
CHECKBOX ELEMENTS [ 'f37d1d8f-9575-4f97-b359-db7d357b4ff0', 'dcc155ca-19ea-4cf0-be6c-413302e55888', 'fe0c4ce8-0b07-4418-bd2f-3de720bcbfbb', 'ae77658f-be3c-47af-ad3d-23db4a327d3b', '34001645-b33c-4a27-ba62-259c5561ee09', '50241232-5799-4921-9e5d-5181e47e05f3', 'f26a2208-08b3-4ed4-a2ed-3d6d850d0553', '4653ad6d-514a-4ca8-b55d-9a613d88a296', 'f4c820b6-8d60-4fd7-943c-465080feddcc' ]No quiero usar un temporizador, ya que no se sabe cuánto tiempo llevará el proceso cada vez, pero no estoy seguro de cómo hacer que se ejecute el código de forma sincrónica para poder continuar hacia abajo y seleccionar uno al azar.
Para responder a mi propia pregunta, en caso de que ayude a alguien, pensé que podía hacerlo de la siguiente manera:
'test-range-filter': async function(browser) { // array to hold the input (checkbox) element ids let checkboxElementIds = []; browser.url(browser.launch_url + '/e-liquids/flavour-types/apple'); let foundElements = await browser.elements('css selector','#narrow-by-list > div:nth-child(3) > div.filter-options-content > div > ol > li'); // loop each of the li elements for (let e in foundElements){ // get the li element let liElement = foundElements[e]; // get the object keys let liElementKeys = Object.keys(liElement); // get the li element id using the keys[0] let liElementId = liElement[liElementKeys[0]]; // use the li element id, to find the input (checkbox) inside of it let inputElement = await browser.elementIdElement(liElementId, 'css selector', 'input'); // get the object keys of the input element let inputElementKeys = Object.keys(inputElement); // get the input element id using keys[0] let inputElementId = inputElement[inputElementKeys[0]]; // store the element id in the array checkboxElementIds.push(inputElementId); } console.log("IDS",checkboxElementIds) },