Solución:
Lo descubrí yo mismo. Aquí está el código.
console.log('waiting for iframe with form to be ready.');
await page.waitForSelector('iframe');
console.log('iframe is ready. Loading iframe content');
const elementHandle = await page.$(
'iframe[src="https://example.com"]',
);
const frame = await elementHandle.contentFrame();
console.log('filling form in iframe');
await frame.type('#Name', 'Bob', { delay: 100 });
En lugar de averiguar cómo ingresar al iFrame y escribir, simplificaría el problema navegando a la URL del IFrame directamente
https://warranty.goodmanmfg.com/registration/NewRegistration/NewRegistration.aspx?Sender=Goodman
Haga que su script vaya directamente a la URL anterior e intente automatizarlo, debería funcionar
Edición-1: uso de marcos
Dado que el enfoque simple no funcionó para usted, lo hacemos con los marcos en sí
A continuación se muestra un script simple que debería ayudarlo a comenzar
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('http://www.goodmanmfg.com/product-registration', { timeout: 80000 });
var frames = await page.frames();
var myframe = frames.find(
f =>
f.url().indexOf("NewRegistration") > -1);
const serialNumber = await myframe.$("#MainContent_SerNumText");
await serialNumber.type("12345");
await page.screenshot({ path: 'example.png' });
await browser.close();
})();
La salida es
Si no puede seleccionar / encontrar iFrame, lea esto:
Tuve un problema al encontrar elementos de rayas. La razón de esto es la siguiente:
No puede acceder a una con un origen diferente usando JavaScript, sería una gran falla de seguridad si pudiera hacerlo. Para la política del mismo origen, los navegadores bloquean los scripts que intentan acceder a un marco con un origen diferente. Vea una respuesta más detallada aquí
Por lo tanto, cuando intenté usar los métodos de titiritero:Page.frames()
y Page.mainFrame().
ElementHandle.contentFrame()
No me devolví ningún iframe. El problema es que estaba sucediendo en silencio y no podía entender por qué no podía encontrar nada.
Agregar estos argumentos para lanzar opciones resolvió el problema:
'--disable-web-security',
'--disable-features=IsolateOrigins,site-per-process'