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 表单输入不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何从自定义 Android 应用程序启动 uber eats 应用程序
通过 Puppeteer 在 Discord 上发送消息(无机器人,无应用程序)