我正在尝试在 puppeteer 上运行我的第一个代码。
puppeteer v1.20.0
Node v8.11.3
Npm v5.6.0
这是一个基本示例,但它不起作用:
const puppeteer = require('puppeteer');
puppeteer.launch({headless: false}).then(async browser => {
const page = await browser.newPage();
await page.goto('https://www.linkedin.com/learning/login', { waitUntil: 'networkidle0' });
console.log(0);
await page.waitFor('#username');
console.log(1);
await browser.close();
});
当我运行脚本时,chromium 启动,我可以看到带有表单和#username 表单字段的 Linkedin 登录页面,但 puppeteer 找不到该字段。它显示 0
但从不显示 1
,然后运行 TimeoutError: waiting for selector "#username"failed: timeout 30000ms exceeded
。
增加超时不会改变任何东西,如果我在 chromium 中检查控制台,该字段就在那里。
Linkedin 登录页面就像一个 SPA,我不知道我在这里使用的方式是否正确。
提前谢谢你。
最佳答案
用户名输入在iframe中你不能这样访问它,你需要先访问iframe
await page.goto('https://www.linkedin.com/learning/login');
await page.waitForSelector('.authentication-iframe');
var frames = await page.frames();
var myframe = frames.find(
f =>
f.url().indexOf("uas/login") > 0);
let username = '123456@gmail.com';
const usernamefild = await myframe.$("#username");
await usernamefild.type(username, {delay: 10});
关于javascript - waitFor() 找不到页面上显示的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58363997/