- Не полагайтесь на такие функции, как delay или setTimeout, если вы не ожидаете реального таймера. Если вам нужно только некоторое время, чтобы дождаться навигации или каких-либо изменений пользовательского интерфейса, достаточно
page.waitFor
и page.waitForSelector
, или page.waitForNavigation
. - Используйте
page.waifForNavigation
ДО того, как произойдет событие навигации. Это означает, что функция начинает прослушивать события страницы и разрешает обещание, если навигация начинается. Эта ошибка, как правило, случается, поскольку люди ставят page.waitForNavigation
после того, как само событие навигации происходит.
Итак, вот код, я его отредактировал. И скажите мне, если это работает отлично или нет.
const puppeteer = require('puppeteer')
const UserName= '070xxxxxx'
const Password= '222222'
const log_in = async () => {
// fun for waiting
function delay(time) {
return new Promise(function(resolve) {
setTimeout(resolve, time)
})
}
const browser = await puppeteer.launch({
headless:false,
args: ['--Window-size=1929,1170','--Window-position=0,0']
})
const page = (await browser.pages())[0]
page.setViewport({'width': 1366, 'height': 768 })
page.setDefaultNavigationTimeout(0)
await page.goto('url', {waitUntil: 'domcontentloaded'})
// Is line below start navigation event? If so, use the commented lines below it
await page.click('.fancybox-item')
// const clickFancy = await Promise.all([
// page.waitForNavigation({waitUntil: 'domcontentloaded'}), // <= change it to load or networkidle0 if you like
// page.click('.fancybox-item')
// ])
// await delay(1000) // => DO NOT USE THIS IF YOU'RE NOT SURELY WAITING FOR ANY TIMER
// Is line below fire a navigation event? If so, use the commented lines below it
page.click('.icon-Signin')
// const clickLogin = await Promise.all([
// page.waitForNavigation({waitUntil: 'domcontentloaded'}), // <= change it to load or networkidle0 if you like
// page.click('.icon-Signin')
// ])
// await delay(1000) // => DO NOT USE THIS IF YOU'RE NOT SURELY WAITING FOR ANY TIMER
await page.type('#loginform-username', UserName)
await page.type('#loginform-password', Password)
//Go to the next page
const nextPage = await Promise.all([
page.waitForNavigation('domcontentloaded'), // The promise resolves after navigation has finished
page.click('.greenBtn') // Clicking the link will indirectly cause a navigation
])
// await delay(5000) => DO NOT USE THIS IF YOU'RE NOT SURELY WAITING FOR ANY TIMER
// Is line below fire a navigation event? If so, use the commented lines below it
await page.click('#header > div > div.userMenu.mt15.mb15.fLeft > ul > li:nth-child(5) > a')
// const clickFancy = await Promise.all([
// page.waitForNavigation({waitUntil: 'domcontentloaded'}), // <= change it to load or networkidle0 if you like
// await page.click('#header > div > div.userMenu.mt15.mb15.fLeft > ul > li:nth-child(5) > a')
// ])
// await delay(5000) => DO NOT USE THIS IF YOU'RE NOT SURELY WAITING FOR ANY TIMER
await browser.close()
}
log_in()