我使用以下代码提交表单,我希望Puppeteer在表单提交后等待页面加载.
await page.click("button[type=submit]");
//how to wait until the new page loads before taking screenshot?
// i don't want this:
// await page.waitFor(1*1000); //? unwanted workaround
await page.screenshot({path: 'example.png'});
Run Code Online (Sandbox Code Playgroud)
如何与木偶戏等待页面加载?
我有一名注册的服务人员
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.bundle.js').then(registration => {
console.log('Service worker was registered');
}).catch(error => {
console.log('Registration failed: ', error);
});
}
Run Code Online (Sandbox Code Playgroud)
实际的服务工作者正在使用常规的 console.log() 调用来记录其事件install和activate事件,所有这些都按预期工作。
然而,当涉及到测试自动化时,Headless Chrome / puppeteer解决方案没有按预期工作,服务工作线程也没有工作installed(安装事件没有发生)。那么,问题是,是否有任何特殊的方法可以使用Headless Chrome / puppeteer来测试服务工作者的页面?
傀儡师代码:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ args: ['--no-sandbox']});
const page = await browser.newPage();
page.on('console', msg => console.log('PAGE LOG:', msg.text()));
await page.goto('https://***.com', { waitUntil: 'networkidle0' });
await page.waitFor(1*4000);
console.log('Before …Run Code Online (Sandbox Code Playgroud) javascript google-chrome google-chrome-devtools google-chrome-headless puppeteer
我是网络抓取的新手,并想使用puppeteer在网页上下载所有图像:
const puppeteer = require('puppeteer');
let scrape = async () => {
// Actual Scraping goes Here...
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('https://memeculture69.tumblr.com/');
// Right click and save images
};
scrape().then((value) => {
console.log(value); // Success!
});
Run Code Online (Sandbox Code Playgroud)
我看过API了吗?文档,但不知道如何实现这一目标。因此,感谢您的帮助。
是否可以?某处有指南吗?基本上,我想对 Electron 应用程序进行 E2E 测试,并将编写用户交互脚本,即创建一个在 Electron 应用程序内部交互的“机器人”或“傀儡”用户。
每次我运行这个脚本时都会超时。是否setDefaultNavigationTimeout真正避免超时?
我浏览了大约 26 个 URL,每个页面都有大量图像。无法想象 Puppeteer 仅仅因为图片太重而无法处理这些页面?
const url = 'test.com';
const jsonReturn = [];
async function runScraper() {
const browser = await puppeteer.launch(prodConfig);
const page = await browser.newPage({
timeout: 0
});
page.setDefaultNavigationTimeout(0);
await page.goto(url, { waitUntil: 'domcontentloaded' });
await page.waitForSelector('.featured-shows-featured-show');
let featuredShowsURLs = await page.$$eval('.featured-shows-featured-show > a', (links) => {
return links.map(link => {
return link.href;
});
});
featuredShowsURLs = _.uniq(featuredShowsURLs)
for (const featuredShowsURL of featuredShowsURLs) {
const page = await browser.newPage({
timeout: 0
});
try { …Run Code Online (Sandbox Code Playgroud) 我正在使用Puppeteer进行Web爬网,但我刚刚注意到,有时由于我在计算机上进行的访问次数众多,我试图抓取的网站会要求提供验证码。验证码形式如下所示:

因此,我将需要有关如何处理此问题的帮助。我一直在考虑将验证码表单发送到客户端,因为我使用Express和EJS来将值发送到我的索引网站,但是我不知道Puppeteer是否可以发送类似的内容。
有任何想法吗?
有没有一种方法可以在 Puppeteer 中的主进程和渲染器进程之间进行通信,类似于Electron 中的ipcMain和ipcRenderer函数。
这篇文章展示了一个简单的应用程序。我发现此功能可通过触发从page主函数到主函数的事件进行调试,反之亦然。
我正在尝试运行 non-headless puppeteer 来测试管道中的 chrome 扩展。
当我用谷歌搜索这个话题时,我发现很多人能够让无头木偶操纵者在管道上工作,但由于某种原因,我无法让它与非无头人偶一起工作。
Puppeteer 故障排除文档说 TravisCI 是可能的,所以管道也应该是可能的?
我尝试了许多不同的 docker 图像,但似乎没有一个起作用。这是我目前的设置:
image: node:9
pipelines:
branches:
staging:
- step:
script:
- node -v
- yarn -v
- yarn install
- apt update && apt install -yq gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget
- apt-get install -y …Run Code Online (Sandbox Code Playgroud) javascript continuous-integration automated-tests bitbucket-pipelines puppeteer
如果操作成功或失败时,我正在Puppeteer上运行自动化测试的网站将显示信息弹出窗口。不幸的是,这些弹出窗口有时掩盖了我的脚本必须单击的按钮。如果我可以在站点中注入一些CSS来隐藏这些弹出窗口,那就太好了。有内置的方法可以做到这一点吗?
目前,我的 Puppeteer 在 Heroku 上使用代理运行。在本地,代理中继完全正常。但是我收到错误错误:net::ERR_TUNNEL_CONNECTION_FAILED。我已经在 Heroku 配置变量中设置了所有 .env 信息,所以它们都可用。
知道如何修复此错误并解决问题吗?
我目前有
const browser = await puppeteer.launch({
args: [
"--proxy-server=https=myproxy:myproxyport",
"--no-sandbox",
'--disable-gpu',
"--disable-setuid-sandbox",
],
timeout: 0,
headless: true,
});
Run Code Online (Sandbox Code Playgroud) 可以说我给出的情况像这个页面
<div id="details-container" class="style-scope ytd-channel-about-metadata-renderer">
<yt-formatted-string class="subheadline style-scope ytd-channel-about-metadata-renderer">Details</yt-formatted-string>
<table class="style-scope ytd-channel-about-metadata-renderer">
<tbody class="style-scope ytd-channel-about-metadata-renderer"><tr class="style-scope ytd-channel-about-metadata-renderer">
<td class="label style-scope ytd-channel-about-metadata-renderer">
<yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer"></yt-formatted-string>
</td>
<td class="style-scope ytd-channel-about-metadata-renderer">
<ytd-button-renderer align-by-text="" class="style-scope ytd-channel-about-metadata-renderer" button-renderer=""></ytd-button-renderer>
<div id="captcha-container" class="style-scope ytd-channel-about-metadata-renderer"></div>
<div id="email-container" class="style-scope ytd-channel-about-metadata-renderer"></div>
<a id="email" target="_blank" class="style-scope ytd-channel-about-metadata-renderer" href="mailto:undefined" hidden=""></a>
</td>
</tr>
<tr class="style-scope ytd-channel-about-metadata-renderer">
<td class="label style-scope ytd-channel-about-metadata-renderer">
<yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer"><span class="deemphasize style-scope yt-formatted-string"> Location: </span></yt-formatted-string>
</td>
<td class="style-scope ytd-channel-about-metadata-renderer">
<yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer">YourCountry</yt-formatted-string>
</td>
</tr>
</tbody></table>
</div>
Run Code Online (Sandbox Code Playgroud)
假设我需要获取“YourCountry”,我实际上如何获取此元素?
到目前为止我尝试过:
const location …Run Code Online (Sandbox Code Playgroud) 在我的服务器端,我监听套接字服务器,在我自己的笔记本电脑中,我具有socket.io-client服务,每当我打开它们时,它们都在连接。
当其他人向我的服务器请求时,服务器通过套接字将该请求发送到我的笔记本电脑,然后我的笔记本电脑使用npm-request从本地主机获取数据,并将返回的数据返回给服务器,然后服务器将信息显示给客户端。
这是我服务器端的错误:
/*
throw er; // Unhandled 'error' event
^
**Error [ERR_STREAM_WRITE_AFTER_END]: write after end**
at write_ (_http_outgoing.js:572:17)
at ServerResponse.write (_http_outgoing.js:567:10)
at Socket.<anonymous> (/public_html/api/index.js:37:9)
at Socket.emit (events.js:187:15)
at /public_html/api/node_modules/socket.io/lib/socket.js:528:12
at process._tickCallback (internal/process/next_tick.js:61:11)
Emitted 'error' event at:
at writeAfterEndNT (_http_outgoing.js:634:7)
at process._tickCallback (internal/process/next_tick.js:63:19)
*/
Run Code Online (Sandbox Code Playgroud)
服务器端代码:
/*
throw er; // Unhandled 'error' event
^
**Error [ERR_STREAM_WRITE_AFTER_END]: write after end**
at write_ (_http_outgoing.js:572:17)
at ServerResponse.write (_http_outgoing.js:567:10)
at Socket.<anonymous> (/public_html/api/index.js:37:9)
at Socket.emit (events.js:187:15)
at /public_html/api/node_modules/socket.io/lib/socket.js:528:12
at process._tickCallback (internal/process/next_tick.js:61:11)
Emitted 'error' event at:
at …Run Code Online (Sandbox Code Playgroud) 我们在前几天使用 phantomjs 用服务器端王子工具生成 pdf。现在我们喜欢把无头浏览器从 phantomjs 换成另一个。
我研究了哪个快速渲染 phantomjs 和 puppeteer。在我的情况下,报告应用程序生成 PDF,只有我使用 puppeteer 和 phantomjs 对其进行测试。phantomjs 与 puppeteer 相比,可以快速处理 HTML。
然后我学习了 google-chrome-headless 选项来生成 PDF。它看起来像一个 Chrome 浏览器 GUI 应用程序的内置模块。我正在使用 nodejs 应用程序。我在命令行中使用以下命令
chrome --headless --disable-gpu --print-to-pdf <src_url>
Run Code Online (Sandbox Code Playgroud)
我注意到 --disable-gpu 选项,其他工具没有。
pdf-generation node.js phantomjs google-chrome-headless puppeteer
javascript ×12
puppeteer ×12
node.js ×2
web-scraping ×2
apify ×1
automation ×1
captcha ×1
e2e-testing ×1
electron ×1
npm-request ×1
phantomjs ×1
proxy ×1
request ×1
socket.io ×1
web-crawler ×1