Puppeteer Ubereats.com форма ввода не работает - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь автоматизировать процесс заказа еды на UberEats с помощью кукловода и Google Cloud Functions. Однако заполнение формы и нажатие кнопки «Далее» не сработают. В настоящее время я использую Node.js 8 и кукольника версии 2.1.1.

exports.main = (req, res) => {

const puppeteer = require('puppeteer');

let selector = 'button[class="c1 cg ch ci bb bc bd cj ch az ao aq bu aj c1 ck cl cm cn co"]';

async function run () {
    try {
        const browser = await puppeteer.launch({args: ['--no-sandbox']});
        const page = await browser.newPage();
        await page.goto("https://ubereats.com/nl");
        await page.waitFor('input[id="location-typeahead-home-input"]');
        await page.evaluate(() => {
            document.querySelector('input[id="location-typeahead-home-input"]').value = "Leuven";
            document.querySelector('selector').click();
        });
        await page.waitForSelector('div[class="f5 bc bd be ew bf b1 he"]');
        let element = await page.evaluate(() => {
            return document.querySelector('h2').innerText;
        })
        browser.close();
        return element;
    } catch (e) {
        return e;
    }
}

run()
.then(el => {
  res.set('Content-Type', 'text/html');
  res.status(200).send(el);
})
.catch(err => {
    console.error(err);
    res.status(500).send("An Error occured" + err);  
  })

};

Webscraping веб-страницы работает нормально. Выполнение этого кода не возвращает Error только пустой объект.

1 Ответ

1 голос
/ 30 марта 2020

Я нашел способ, хотя и очень хакерский, как это сделать. Я полагаю, это как-то связано с тем, что React - sluggi sh. В любом случае, вот код:

import { launch } from 'puppeteer';

main();

async function main() {
  try {
    const browser = await launch({
      headless: false,
    });
    const [page] = await browser.pages();
    await page.setUserAgent(
      'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'
    );
    await page.goto('https://www.ubereats.com/nl');

    const inputSelector = '#location-typeahead-home-input';

    await page.waitForSelector(inputSelector);

    await page.waitFor(3000);

    await page.type(inputSelector, 'Leuven');

    await page.waitFor(3000);

    await page.click('button.c1');

    // rest of the code
  } catch (err) {
    // error handling
  }
}
...