Tengo una página con unos 10 iframes. Solo 1 de estos iframes es visible y el índice del iframe visible cambia cada recarga de página . El iframe visible solo contiene un estilo de display: block , no contiene nada más que pueda usar para seleccionarlo, como un nombre o título.
Ejemplo:
<div class="container"> <iframe style="display: none; width: 310px; height: 100px; border: 0px; user-select: none;"> <html> <body> <div class="button"/> </body> </html> </iframe> <--- not visible <iframe style="display: block; width: 310px; height: 100px; border: 0px; user-select: none;"> <html> <body> <div class="button"/> // need to click this! </body> </html> </iframe> <--- visible :) </div> Mi pregunta es cómo puedo seleccionar el iframe con la display: block en titiritero y luego hacer clic en el botón dentro de él.
Intenté resolver esto obteniendo todos los iframes en una página, recorriéndolos y seleccionando el que tiene un estilo de visualización de 'bloque':
// select all iframes const Frames = await page.frames(); // loop over iframes and check if iframe display is block or none. Frames.forEach(async (item, i) => { const frame = await item.contentFrame(); const showingIframe = await page.evaluate( () => window.getComputedStyle(frame.querySelector('iframe')).display ); if (showingIframe === 'block') { console.log('showing'); // click button } else { console.log('not showing'); } });Puede encontrar fácilmente un elemento si el estilo es muy específico. No es necesario pasar por todos los marcos para eso.
const selector = `iframe[style*="display: block"]` const visibleIframe = document.querySelector(selector); console.log({ visibleIframe });Hacer clic en un botón en el interior se puede hacer de muchas maneras. Aquí hay una solución simple de javascript,
visibleIframe.contentDocument.querySelector(".button").click()Así que finalmente resolví esto, gracias a @Md. Abu Taher por indicarme la dirección correcta.
try { const selector = `iframe[style*='display: block']`; await page.frames().find((frame) => frame.click(selector, { delay: 8000 })); } catch (error) {}Lo que hace es encontrar todos los iframes en la página. Luego encuentra y hace clic en el iframe que coincide con el selector definido anteriormente, esto mantiene presionado el botón durante 8 segundos, lo que omite el captcha de StockX (o más bien lo completa como lo haría un usuario).