Tengo un problema al depurar por qué no se hace clic en un selector de consulta. Puedo buscarlo en Chrome y también si uso document.querySelector() en las herramientas de desarrollo, encuentra la consulta, lo que me hace creer que es correcto. sin embargo, no lo está presionando y solo se agota el tiempo de espera
Haga clic en Método:
async function click(page, selector, timeout) { await beforeAction(page, timeout); await page.waitForSelector(selector); await page.waitFor(200); await page.click(selector); }Método principal que se ejecuta:
async function existingStart(page) { await loadCookies(page); await page.goto( "https://mc.s7.exacttarget.com/cloud/#app/Email/C12/Default.aspx?entityType=none&entityID=0&ks=ks%23Content" , { waitUntil: 'load', timeout: 0 } ); await page.waitFor(200); const contentBuilderFrame = await findFrame(page, "contentbuilder"); const searchField = await contentBuilderFrame.$(".contentsearch > input"); searchField.focus(); await page.keyboard.type("20200903"); await page.waitFor(500); await page.keyboard.press('Enter'); await page.waitFor(5000); // Screenshot to check page state await page.screenshot({ path: "./screenshot.png", fullPage: true }); await page.waitFor(500); // Times out await click(page, '#contentRepeater > div.repeater-viewport > div.repeater-canvas.scrolling > div > div > table > tbody > tr:nth-child(1) > td:nth-child(3) > div > div > div > div')}
Y si llamo al método find Iframe antes de hacer clic en el selector:
await findFrame(page, "contentbuilder");Realmente no sucede nada y falla con un problema de JSHandler, ¿alguien ha tenido algo similar? ¿Podría ser que el problema sea Iframes? Lo extraño es que la entrada de searchField y la pulsación de teclas funcionan bien. Además, es el mismo iframe, por lo que no debería tener que llamar a findFrame dos veces.
antes de la acción:
async function beforeAction(page, timeout) { if (timeout != null) { await page.waitFor(timeout); } var isLoading = await isPageLoading(page); while (isLoading) { await new Promise((resolve) => setTimeout(resolve, 1000)); isLoading = await isPageLoading(page); } }Dado que encontramos la respuesta en los comentarios, la publico aquí para otras personas que se encuentren con esta pregunta.
Como el selector de destino está en un iframe ( contentbuilder ), el contexto que se pasará como argumento al click en la función no es la page sino el elemento iframe: contentBuilderFrame .