Puppeteer 浏览器和页面即时关闭,page.evaluate 在 bloc 2 上不工作
Puppeteer browser and page instant close, page.evaluate not working on bloc 2
我有这个脚本,一切正常,直到块 2 开始
我不明白为什么它不执行块 2 中的工作,我应该在 "page.on request" 中有一个 return 但它不是直接离开的情况,你知道这个问题吗?
node return 对我来说没有错误
谢谢
async function main() {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.setViewport({width: 1200, height: 720})
await page.goto('https://site.local', { waitUntil: 'networkidle0' }); // wait until page load
await page.type("input[name='UserName']", "myusername");
await page.type("input[name='Password']", "mypassworduser");
// click and wait for navigation
await Promise.all([
page.click("body > main > button"),
page.waitForNavigation({ waitUntil: 'networkidle0' }),
]);
await page.goto(urlformation);
await page.setRequestInterception(true);
await page.on('request', (request) => {
if (request.resourceType() === 'media') {
var CurrentRequest = request.url();
console.log(CurrentRequest);
fs.appendFileSync(fichiernurlaudio, request.url()+"\r\n");
}
request.continue();
});
//START BLOC 1 ------------------IT WORK
const Titresaudios = await page.evaluate(() => {
let names = document.querySelectorAll(
"td.cursor.audio"
);
let arr = Array.prototype.slice.call(names);
let text_arr = [];
for (let i = 0; i < arr.length; i += 1) {
text_arr.push($vartraited+"\r\n");
}
return text_arr;
})
fs.appendFileSync(fichiernomaudio, Titresaudios);
//END BLOCK 1------------------IT WORK- i got data in my file
//START BLOCK 2-------seems to ignore-----------NOT WORKING
await page.evaluate(()=>{
let elements = document.querySelectorAll("td.cursor.audio");
elements.forEach((element, index) => {
setTimeout(() => {
element.click();
}, index * 1000);
})
})
//END BLOCK 2---------seems to ignore---------NO WORKING
//i should see some console.log in page.on('request' (request) => { but instant close after works of bloc 1
await page.close();
await browser.close();
}
main();
我不知道你到底想在那里实现什么,但是那个块可以这样重写:
// ...
const els = await page.$$( 'td.cursor.audio' );
for( const el of els ) {
// basically your timeout, but from outside the browser
await page.waitFor( 1000 );
// perform the action
await el.click();
}
// ...
在您的脚本中,您在 evaluate()
调用中所做的唯一一件事就是安排一些超时操作。一旦这些被安排(但未执行!), evaluate()
的回调退出并且您的脚本继续关闭浏览器。您的点击很可能从未执行过。
根据我的经验,通常建议尽可能多地使用 NodeJS 而不是浏览器。通常也使调试更容易。
我有这个脚本,一切正常,直到块 2 开始 我不明白为什么它不执行块 2 中的工作,我应该在 "page.on request" 中有一个 return 但它不是直接离开的情况,你知道这个问题吗?
node return 对我来说没有错误
谢谢
async function main() {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.setViewport({width: 1200, height: 720})
await page.goto('https://site.local', { waitUntil: 'networkidle0' }); // wait until page load
await page.type("input[name='UserName']", "myusername");
await page.type("input[name='Password']", "mypassworduser");
// click and wait for navigation
await Promise.all([
page.click("body > main > button"),
page.waitForNavigation({ waitUntil: 'networkidle0' }),
]);
await page.goto(urlformation);
await page.setRequestInterception(true);
await page.on('request', (request) => {
if (request.resourceType() === 'media') {
var CurrentRequest = request.url();
console.log(CurrentRequest);
fs.appendFileSync(fichiernurlaudio, request.url()+"\r\n");
}
request.continue();
});
//START BLOC 1 ------------------IT WORK
const Titresaudios = await page.evaluate(() => {
let names = document.querySelectorAll(
"td.cursor.audio"
);
let arr = Array.prototype.slice.call(names);
let text_arr = [];
for (let i = 0; i < arr.length; i += 1) {
text_arr.push($vartraited+"\r\n");
}
return text_arr;
})
fs.appendFileSync(fichiernomaudio, Titresaudios);
//END BLOCK 1------------------IT WORK- i got data in my file
//START BLOCK 2-------seems to ignore-----------NOT WORKING
await page.evaluate(()=>{
let elements = document.querySelectorAll("td.cursor.audio");
elements.forEach((element, index) => {
setTimeout(() => {
element.click();
}, index * 1000);
})
})
//END BLOCK 2---------seems to ignore---------NO WORKING
//i should see some console.log in page.on('request' (request) => { but instant close after works of bloc 1
await page.close();
await browser.close();
}
main();
我不知道你到底想在那里实现什么,但是那个块可以这样重写:
// ...
const els = await page.$$( 'td.cursor.audio' );
for( const el of els ) {
// basically your timeout, but from outside the browser
await page.waitFor( 1000 );
// perform the action
await el.click();
}
// ...
在您的脚本中,您在 evaluate()
调用中所做的唯一一件事就是安排一些超时操作。一旦这些被安排(但未执行!), evaluate()
的回调退出并且您的脚本继续关闭浏览器。您的点击很可能从未执行过。
根据我的经验,通常建议尽可能多地使用 NodeJS 而不是浏览器。通常也使调试更容易。