我因为工作需要每天登录这个网站。我以前找到有人给我建立一个机器人,以帮助自动化登录过程,然后把我的登录结果作为登录的证明。
昨天网站通过迁移到新的主机或类似的东西,现在我得到一个超时错误的脚本。在下面引用的代码中,我已经删除了实际的用户名和密码,以保护我的隐私,但如果这是绝对必要的,我很乐意在DM中分享它。任何帮助都非常感谢!!
下面是错误中引用的代码:
const page = await browser.newPage();
await page.setViewport({ width: 800, height: 600 });
await page.goto(
"https://prod.caseworthy.com/CaseWorthy/PortalDefault.aspx?DatabaseID=890&#/PortalDefault"
);
await page.waitForSelector("#UserNameField");
await page.type("#UserNameField", "USERNAME");
await page.type("#PasswordField", "PASSWORD");
await page.waitForTimeout(2000);
await page.click("#btnLogin");
await page.waitForTimeout(5000);
下面是错误文本:
TimeoutError: waiting for selector#UserNameField
failed: timeout 30000ms exceeded/Users/jordansimac/node_modules/puppeteer/lib/cjs/puppeteer/common/DOMWorld.js:526:34)在DOMWorld。waitForSelectorInPage(/用户/jordansimac/node_modules/操纵/lib/cj/操纵/共同/DOMWorld.js: 430:26)/Users/jordansimac/node_modules/puppeteer/lib/cjs/puppeteer/common/QueryHandler.js:31:77)在DOMWorld。waitForSelector(/用户/jordansimac/node_modules/操纵/lib/cj/操纵/共同/DOMWorld.js: 321:29)在框架。waitForSelector(/用户/jordansimac/node_modules/操纵/lib/cj/操纵/共同/FrameManager.js: 925:51)在页面。waitForSelector(/用户/jordansimac/node_modules/操纵/lib/cj/操纵/共同/Page.js: 2359:33)/Users/jordansimac/index.js:18:14@ processTicksAndRejections (node:internal/process/task_queues:96:5)
我没有什么编程经验,所以我没有尝试过任何不同的东西
您错过了一个步骤,在您写的url上,您需要单击sign in
以便出现用户名和密码字段。
所以添加会解决你的问题。
await page.waitForSelector('a#signinlnk');
await page.click('a#signinlnk');
代码:
const puppeteer = require('puppeteer');
let browser;
(async () => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
const delay = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
await page.setViewport({ width: 800, height: 600 });
await page.goto('https://prod.caseworthy.com/CaseWorthy/PortalDefault.aspx?DatabaseID=890#/PortalDefault');
// relevant part start
await page.waitForSelector('a#signinlnk');
await page.click('a#signinlnk');
// relevant part end
await page.waitForSelector('#UserNameField');
await page.type("#UserNameField", "USERNAME");
await page.type("#PasswordField", "PASSWORD");
await delay(2000);
await page.click("#btnLogin");
await delay(5000);
})().catch(err => console.error(err)). finally(() => browser ?. close());
另一个注意事项是page.waitForTimeout()
被弃用,这就是为什么我添加延迟函数并使用它来代替
更新:
你也可以在我的代码中修改
await delay(2000);
await page.click("#btnLogin");
await delay(5000);
await page.waitForSelector("#btnLogin");
await page.click("#btnLogin");
并删除const delay = (milliseconds)...
行,因为等待#btnLogin
选择器(即登录按钮)而不是2和5秒延迟会更快。