кукловод / не принимает никаких действий после входа в систему - PullRequest
1 голос
/ 01 ноября 2019

Я попытался войти в систему и выполнить другое действие после входа в систему, используя puppeteer / node js, он принимает вход в систему и после входа в учетную запись он еще не выполняет никаких действий

это мой код

const puppeteer = require('puppeteer');
  
async function log_in() {
    
   const browser =await  puppeteer.launch({
    headless:false,
    args: ['--Window-size=1929,1170','--Window-position=0,0']

    });

   

     const page = await browser.newPage();
    await page.setViewport({'width': 1366, 'height': 768 });   
    await page.goto('url');

    await page.click('.fancybox-item');
    await delay(1000);

	// fun for waiting 
    function delay(time) {
   return new Promise(function(resolve) { 
       setTimeout(resolve, time)
   });
}

	const UserName= '070xxxxxx';
	const Password= '222222';



	page.click('.icon-Signin');
	await delay(1000);
	
	await page.type('#loginform-username', UserName);
	await page.type('#loginform-password', Password);

 
 //Go to the next page 
 await Promise.all([
  page.waitForNavigation(), // The promise resolves after navigation has finished
  page.click('.greenBtn'), // Clicking the link will indirectly cause a navigation
   
]);

 await delay(5000);
 
 await page.click('#header > div > div.userMenu.mt15.mb15.fLeft > ul > li:nth-child(5) > a');
 
 await delay(5000);
 await browser.close();
 
}log_in();
  • , если кто-то может просмотреть код и узнать о проблеме, чтобы помочь мне исправить ее, обратите внимание: у меня та же проблема при регистрации, что она успешно регистрируется и после доступа ксайт никогда не совершает никаких действий

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019
  1. Не полагайтесь на такие функции, как delay или setTimeout, если вы не ожидаете реального таймера. Если вам нужно только некоторое время, чтобы дождаться навигации или каких-либо изменений пользовательского интерфейса, достаточно page.waitFor и page.waitForSelector, или page.waitForNavigation.
  2. Используйте 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()
0 голосов
/ 01 ноября 2019

В вашем коде есть несколько точек, которые могут вызвать проблемы:

  1. Попробуйте выяснить, как происходит вход в систему. page.waitForNavigation() метод ожидает отправки формы или изменения URL с использованием History API. Если на самом деле навигация не выполнялась, вы можете использовать метод page.waitForSelector или page.waitForXPath, чтобы дождаться появления какого-либо конкретного элемента. В противном случае попробуйте использовать page.waitForNavigation({ waitUntil: 'networkidle0' })

  2. Использование тайм-аутов для ожидания результатов асинхронной задачи не является хорошей практикой. Вы можете столкнуться с замедлением работы сети, по крайней мере. Таким образом, сценарий, вероятно, выйдет из await delay(...); до ожидаемого действия. Я рекомендую подождать с page.waitFor* для появления всплывающего окна входа в систему (что-нибудь еще) после нажатия на .fancybox-item.

  3. Вы не ожидаете результата page.click('.icon-Signin');. Обработчик события щелчка может занять больше времени в некоторых условиях. Не забывайте о await.

Надеюсь, это поможет!

...