0

我正在使用 puppeteer,节点 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, { waitUntil: 'networkidle2' });

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

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

    const UserName = 'xxxxxxxxxx';
    const Password = '222222';

    page.click('selector');
    await delay(1000);
    //Focus on user name 
    await page.focus('selector');
    await delay(2000);
    await page.type('selector', UserName);
    await delay(2000);
    //Focus on password 
    await page.focus('selector');
    await page.type('selector'', Password);

    // Clicking the link will indirectly cause a navigation
    page.click('selector');
    await delay(5000);
   
    if (await page.waitForSelector('selector')) {
       console.log("found")
    } else console.log("not found");
    await delay(5000);
} log_in();

注意:代码可以成功运行,但不会在控制台输出中打印任何内容。

4

2 回答 2

0

您可以使用page.$(selector)。如果没有匹配选择器,则返回一个元素或 null。并且您可能需要在使用page.waitForNavigation([options])单击提交按钮后等待导航。

...
// Clicking the link will indirectly cause a navigation
await page.click('selector')
await page.waitForNavigation()

const element = await page.$('selector')

if (element) {
    console.log ('found')
} else {
    console.log ('not found')
}
...
于 2019-11-18T12:36:22.503 回答
0

首先,恐怕您缺乏使用异步 Javascript 的经验。理解这个概念至关重要,因为 Puppeteer 的大部分功能都是异步的。与 Selenium 相同的其他库或工具。

尝试了解更多关于https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous

回答您的问题:我认为应该使用@drobnikj 建议waitForSelector()的而不是document.querySelector( ) 。page.$首先waitForSelector()等待元素,以便您可以处理可能异步加载的元素。您的页面上可能不是这种情况,但总的来说,我相信这是一种更好的方法。您需要做的就是处理潜在的异常。

我的提议是:

const puppeteer = require('puppeteer');

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

const page = await browser.newPage()[0];

async function logIn(loginPageUrl, userName, password) {
  const fancyBoxItemSelector = '.fancybox-item';
  const loginInputSelector = '';
  const passwordInputSelector = '';
  const loginRedirectionLink = '';

  const expectedSelectorAfterLogin = '';

  await page.goto(URL, { waitUntil: 'networkidle2' });

  await page.waitForSelector(fancyBoxItemSelector);
  await page.click(fancyBoxItemSelector);

  await page.waitForSelector(loginInputSelector);
  await page.click(loginInputSelector);
  await page.type(loginInputSelector, userName);

  await page.waitForSelector(passwordInputSelector);
  await page.click(passwordInputSelector);
  await page.type(passwordInputSelector, password);

  await page.waitForSelector(loginRedirectionLink);

  const response = page.waitForNavitation({ waitUntil: 'networkidle2' });
  await page.click(loginRedirectionLink);
  await response;

  try {
    await page.waitForSelector(expectedSelectorAfterLogin);
    console.log('Selector found!');
  } catch (err) {
    console.log('Selector not found!');
  }
}

(async () => {
   await logIn('', '', '')
})()

我允许自己润色你的代码。我希望很清楚我在这里做了什么。

于 2019-11-18T21:23:15.937 回答