无法使用木偶师单击链接 - Thingiverse



我正在尝试在thingiverse上自动下载多个文件。我随机选择一个物体。但是我很难找到我需要的链接,点击然后下载。有人遇到过这个问题吗我能得到帮助吗?

我已经尝试了其他几种变化。

import puppeteer from 'puppeteer';
async function main() {
const browser = await puppeteer.launch({
headless: true,
});
const page = await browser.newPage();
const response = await page.goto('https://www.thingiverse.com/thing:2033856/files');
const buttons = await page.$x(`//a[contains(text(), 'Download')]`);
if(buttons.length > 0){
console.log(buttons.length);
}  else {
console.log('no buttons'); 
}
await wait(5000);
await browser.close();
return 'Finish';
}
async function wait(time: number) {
return new Promise(function (resolve) {
setTimeout(resolve, time);
});
}
function start() {
main()
.then((test) => console.log('DONE'))
.catch((reason) => console.log('Error: ', reason));
}
start();

下载页面

代码

我能让它工作。选择器为:a[class^="ThingFile__download"]

木偶师是:const puppeteer = require('puppeteer-extra');

await page.goto()之前,我总是建议设置视口:

await page.setViewport({width: 1920, height: 720});

设置之后,将await page.goto()更改为具有waitUntil选项:

const response = await page.goto('https://www.thingiverse.com/thing:2033856/files', { waitUntil: 'networkidle0' }); // wait until page load

接下来,这是一个非常重要的部分。你必须做waitForSelector()waitForFunction()

我在const response后面添加了这两行代码:

await page.waitForSelector('a[class^="ThingFile__download"]', {visible: true})
await page.waitForFunction("document.querySelector('a[class^="ThingFile__download"]') && document.querySelector('a[class^="ThingFile__download"]').clientHeight != 0");

接下来,获取buttons。对于我的测试,我只是抓取了buttonhref

const buttons = await page.$eval('a[class^="ThingFile__download"]', anchor => anchor.getAttribute('href'));

最后,不要检查这个变量的.length。在这种情况下,我们只是返回href值,这是一个string。当您尝试获取按钮时,您将获得PromiseElementHandle:

const button = await page.$('a[class^="ThingFile__download"]');
console.log(button)
if (button) { ... }

现在,如果你将page.$更改为page.$$,你将获得Array<ElementHandle>Promise,并且可以在那里使用.length

const buttonsAll = await page.$$('a[class^="ThingFile__download"]');
console.log(buttonsAll)
if (buttons.length > 0) { ... }

希望这对你有帮助,如果你不能弄清楚,如果我有时间的话,我可以稍后发布我的完整源代码,让它看起来更好。

最新更新