Actualmente estoy usando Titiritero para hacer clic en un botón en una página. El problema al que me enfrento es que el elemento seleccionado para hacer clic carga el botón durante un cierto período de tiempo que supongo que es arbitrario para mi conexión a Internet o quizás incluso parámetros adicionales (así que incluso si uso el método waitForSelector()
, el botón no se podrá hacer clic aunque el elemento esté presente, porque aún se está cargando).
Podría agregar una function waitFunc(seconds)
pero el script se interrumpirá si el tiempo de carga del botón es superior al tiempo de waitFunc(5)
(por lo que no siempre funcionará, a menos que el tiempo de espera sea arbitrariamente lo suficientemente largo, pero luego desafía el propósito de tener el guión). Mi requisito sería hacer clic en el botón tan pronto como se haya cargado. ¿Cómo podemos hacer esto?
En la etiqueta del botón a continuación, veo que hay loadingButton
en data-bind
. Anticipo que podría devolver un valor booleano. Sin embargo, ¿cómo puedo acceder a estos datos con Titiritero y crear una función para hacer clic en este botón una vez cargado?
< button type="submit" data-bind=" buttonText: 'ClickMe', click: clickMe, loadingButton: loading, enable: canClickMe" class="btn-class" > Click Me! </button>
Investigué un poco sobre Knockout, pero no lo entiendo lo suficiente como para manipular esta herramienta. Me imagino que una vez que logré obtener el valor de loadingButton
, puedo usar un bucle while para hacer clic en el botón una vez que cambió su valor.
const attr = await page.$eval(selectors.buyNow, el => el.map(x => x.getAttribute("data-bind")))
, pero el valor devuelto es la cadena "buttonText: 'ClickMe', click: clickMe, loadingButton: loading, enable: canClickMe"
(literalmente lo que está en el atributo data-bind
la etiqueta del botón HTML).
Entonces, ¿quieres hacer clic en ese botón? Qué tal si:
let button = await page.waitForSelector(`button[data-bind*="loadingButton"]`) await button.click()