Puppeteer Ubereats.com 表单输入不起作用

Posted

技术标签:

【中文标题】Puppeteer Ubereats.com 表单输入不起作用【英文标题】:Puppeteer Ubereats.com form input doesn't work 【发布时间】:2020-07-10 21:55:59 【问题描述】:

我正在尝试使用 puppeteer 和 Google Cloud Functions 在 UberEats 上自动订购食物。但是填写表单位置并单击下一步将不起作用。我目前正在使用 Node.js 8 和 puppeteer 版本 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);  
  )

;

网页抓取网页工作正常。运行此代码不会返回任何错误,只会返回一个空对象。

【问题讨论】:

你试过用他们的api吗? 【参考方案1】:

我已经想出了一个方法,虽然很老套,但如何做到这一点。我想这与 React 迟缓有关。无论如何,这是代码:

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
  

【讨论】:

这是解决方案,但不适用于谷歌云功能。但我认为 GCF 将无法执行此功能,因为它不会设置 UserAgent。我看到您将 headless 设置为 false,这可能意味着 UberEats 网站“可能正在寻找添加到 UA 字符串中的 Headless 并阻止它。或者他们可能正在使用一些技术来检测自动访问并阻止它。”不过还是谢谢你!【参考方案2】:

我遇到了同样的问题,我想出了一个解决方案。至于为什么没有按下按钮,我不知道。但是,输入地址然后单击第一个地址建议是有效的。

这是我的代码:

const puppeteer = require('puppeteer');
async function start()
    const browser = await puppeteer.launch()
    const page = await browser.newPage()
    await page.goto("https://www.ubereats.com/ca")
    await page.type("#location-typeahead-home-input", "Address")
    await page.waitForSelector('#location-typeahead-home-item-0');
    await page.click("#location-typeahead-home-item-0")
    await page.waitForNavigation()

    console.log(page.url())
    await browser.close()


start()

【讨论】:

以上是关于Puppeteer Ubereats.com 表单输入不起作用的主要内容,如果未能解决你的问题,请参考以下文章

前端UI自动化puppeteer实践

Puppeteer:如何处理多个标签?

如何从自定义 Android 应用程序启动 uber eats 应用程序

通过 Puppeteer 在 Discord 上发送消息(无机器人,无应用程序)

使用 Puppeteer 和 Node.JS 在网站上的 iFrame 中找不到隐藏的输入元素

Puppeteer:如何在 ec2 服务器上安装 puppeteer