2 рдорд┐рд▓рд┐рдпрди рд╣реЗрдбрд▓реЗрд╕ рд╕рддреНрд░ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░реЗрдВ

4 рдЬреВрди, 2018 рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░рд░рд╣рд┐рдд рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдмреНрд▓реЙрдЧ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рд╣рдореЗрдВ рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реБрдП рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ рдХрд┐ рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рджреЛ рдорд┐рд▓рд┐рдпрди рд╕рддреНрд░реЛрдВ рдХреА рд╕реЗрд╡рд╛ рдХреЛ рдкрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ! рдпреЗ рд▓рд╛рдЦреЛрдВ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ, рдореБрджреНрд░рд┐рдд рдкреАрдбреАрдПрдл рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╕рд╛рдЗрдЯ рд╣реИрдВред рд╣рдордиреЗ рд▓рдЧрднрдЧ рд╡рд╣ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЖрдк рдмрд┐рдирд╛ рд╕рд┐рд░ рд╡рд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдХреА рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдУрд╡рд░рд▓реИрдк рдФрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВред рдкреНрд░рд╛рдкреНрдд рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреА рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдХреЗ рдХрд╛рд░рдг, рдореИрдВ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╣реЗрдбрд▓реЗрд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░ (рдФрд░ рдХрдардкреБрддрд▓реА ) рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрджрдо рдФрд░ рд░рд╛рдЬреНрдп рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдпрд╣рд╛рдБ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджрд┐рдП рдЧрдП рд╣реИрдВред

1. рд╣реЗрдбрд▓реЗрд╕ рдмреНрд░рд╛рдЙрдЬрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдмрд┐рд▓реНрдХреБрд▓ рди рдХрд░реЗрдВ




рдмрд┐рдирд╛ рд╕рд┐рд░ рдХреЗ рдХреНрд░реЛрдо рд╕рдВрд╕рд╛рдзрди рдХреА рдЦрдкрдд


рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмрд┐рдирд╛ рд╕рд┐рд░ рдХреЗ рдореЛрдб рдореЗрдВ рд╢реБрд░реВ рди рдХрд░реЗрдВ ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдкрд░ (рдКрдкрд░ рджреЗрдЦреЗрдВ)ред рд╣реЗрдбрд▓реЗрд╕ рдмреНрд░рд╛рдЙрдЬрд░ рд░рд┐рдХ рдФрд░ рдореЙрд░реНрдЯрд┐ рд╕реЗ рдорд┐рд╕реНрд╕рд┐рдХреНрд╕ рдХреА рддрд░рд╣ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд, рдЧреНрд▓реВрдЯреЛрдирд╕ рдФрд░ рдмреНрд░реАрдбрд┐рдВрдЧ рд╣реИред рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЗрдВрдЯрд░рдкреЛрд▓рд┐рдВрдЧ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛) рд╕рд░рд▓ рд▓рд┐рдирдХреНрд╕ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Cheerio рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рджреВрд╕рд░реЛрдВ HTTP рдЕрдиреБрд░реЛрдз рдФрд░ рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдВрджрд░ рдиреЛрдб рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХрд╛ рд▓рдХреНрд╖реНрдп рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдкреГрд╖реНрда рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ HTML рд╣реИ) рдФрд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕рд░рд▓ рдХрдорд╛рдВрдб рд╕реЗ рд╕реНрдХреНрд░реИрдк рдХрд░реЗрдВ:

import cheerio from 'cheerio'; import fetch from 'node-fetch'; async function getPrice(url) { const res = await fetch(url); const html = await res.test(); const $ = cheerio.load(html); return $('buy-now.price').text(); } getPrice('https://my-cool-website.com/'); 

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рд╣реЗрдбрд▓реЗрд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

2. рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╣реЗрдбрд▓реЗрд╕ рдмреНрд░рд╛рдЙрдЬрд░ рд▓реЙрдиреНрдЪ рди рдХрд░реЗрдВ


рд╣рдордиреЗ рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдЪрд╛рд▓реВ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╡рд╣ рдЙрдкрдпреЛрдЧ рдореЗрдВ рди рд╣реЛ (рдЦреБрд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рддреНрд░ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рд░рдгрдиреАрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдпрд╣ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╢рд╛рдпрдж рд╣реА рдХреНрдпреЛрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдм рдХреБрдЫ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХреИрд╢ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдореЗрдореЛрд░реА рдХреЛ рдЦрд╛ рдЬрд╛рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЧрд╣рди рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рддреБрд░рдВрдд рдмрдВрдж рдХрд░ рджреЗрдВ!

 import puppeteer from 'puppeteer'; async function run() { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://www.example.com/'); // More stuff ...page.click() page.type() browser.close(); // <- Always do this! } 

рдмреНрд░рд╛рдЙрдЬрд░рд▓реЗрд╕ рдореЗрдВ, рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрд╢рд╛ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯрд╛рдЗрдорд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдФрд░ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХреЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдпрд╛ рдмреИрдХрдЕрдк рдбреЙрдХрд░ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд░рд╛рдд рдХреЗ рдмреАрдЪ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЧрд┐рд░ рдЬрд╛рдиреЗ рдкрд░ рдпрд╣ рдЕрдкреНрд░рд┐рдп рд╣реЛрдЧрд╛ред

3. рдЖрдкрдХрд╛ рджреЛрд╕реНрдд page.evaluate


рдмреЗрдмрд▓ рдпрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреИрд╕реЗ рдЯреНрд░рд╛рдВрд╕рдкреИрд░рд░реНрд╕ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде рд╕реБрд▓рдн рд╣реИрдВред рдпрд╣реА рд╣реИ, .ev рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЙрд▓рдмреИрдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХрдардкреБрддрд▓реА рдХреЗ рдкрд╛рд╕ рдХрдИ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдбреЛрдо рдХреЗ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдиреЛрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ред рдпрджреНрдпрдкрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдкреИрд░ рдореЗрдВ рдЧреЛрд▓реА рдорд╛рд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдкреГрд╖реНрда рдкрд░ рдХреБрдЫ рдЗрд╕ DOM рдиреЛрдб рдХреЛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдУрд░ рд╕реЗ рд╕рднреА рдХрд╛рдо рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЖрдорддреМрд░ рдкрд░ рд╕рднреА page.evaulate рд▓рд┐рдП page.evaulate рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрдЬрд╛рдп ( рддреАрди async рдХрд╛рд░реНрд░рд╡рд╛рдИ):

 const $anchor = await page.$('a.buy-now'); const link = await $anchor.getProperty('href'); await $anchor.click(); return link; 

рдРрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ (рдПрдХ async рдХрд╛рд░реНрд░рд╡рд╛рдИ):

 await page.evaluate(() => { const $anchor = document.querySelector('a.buy-now'); const text = $anchor.href; $anchor.click(); }); 

рдПрдХ evaluate рдХреЙрд▓ рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рд▓рд╛рдн рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рд╣реИ: рдпрд╣ рдХреЛрдб рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдиреЛрдб рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдмреЗрд╢рдХ, рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдбрд┐рдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред

рдЕрдВрдЧреВрдареЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдирд┐рдпрдо await рдХреА рд╕рдВрдЦреНрдпрд╛ рдпрд╛ then рдХреЛрдб рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡рддрдГ рдкреГрд╖реНрда рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдХреЙрд▓ рдХрд╛ page.evaluate рдХрд░реЗрдВред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА async рдХреНрд░рд┐рдпрд╛рдПрдВ рдиреЛрдб рд░рдирдЯрд╛рдЗрдо рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдмреАрдЪ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдирд┐рд░рдВрддрд░ JSON рдХреНрд░рдорд╛рдВрдХрди рдФрд░ рдбреАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝реЗрд╢рдиред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рдЗрддрдиреА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдирд╣реАрдВ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ WebSockets рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ), рдЗрд╕рдореЗрдВ рдЕрднреА рднреА рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ рдФрд░ рдкрд░ рдмреЗрд╣рддрд░ рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИред

4. рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░реЗрдВ, рди рдХрд┐ рд╡реЗрдм рдкреЗрдЬ


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдкрд╛рддрдХрд╛рд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдЯрд┐рдк рдкреНрд░рддрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗрд╡рд▓ рдПрдХ рд╕рддреНрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ pages рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдПрдХ рдкреЗрдЬ рдЧрд┐рд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреВрд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдХреНрд░реИрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдл рд╣реИ (рдХреБрдХреАрдЬрд╝ рдФрд░ рднрдВрдбрд╛рд░рдг рдПрдХ рд╕рд┐рд░рджрд░реНрдж рдмрди рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ )ред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:

 import puppeteer from 'puppeteer'; // Launch one browser and capture the promise const launch = puppeteer.launch(); const runJob = async (url) { // Re-use the browser here const browser = await launch; const page = await browser.newPage(); await page.goto(url); const title = await page.title(); browser.close(); return title; }; 

рдмреЗрд╣рддрд░ рдпрд╣ рдХрд░реЗрдВ:

 import puppeteer from 'puppeteer'; const runJob = async (url) { // Launch a clean browser for every "job" const browser = puppeteer.launch(); const page = await browser.newPage(); await page.goto(url); const title = await page.title(); browser.close(); return title; }; 

рдкреНрд░рддреНрдпреЗрдХ рдирдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдПрдХ рд╕рд╛рдл - --user-data-dir ( рдЬрдм рддрдХ рдХрд┐ рдЕрдиреНрдпрдерд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ) рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдирдП рдирдП рд╕рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдХреНрд░реЛрдо рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд╕рддреНрд░ рдирд╣реАрдВ рдЦреАрдВрдЪ рд╕рдХрддрд╛ рд╣реИред

5. рдХрддрд╛рд░ рдФрд░ рд╕рдВрдЧрд╛рдорд┐рддрд┐ рд╕реАрдорд╛


рдмреНрд░рд╛рдЙрдЬрд░рд▓реЗрд╕ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕рдорд╛рдВрддрд░рд┐рдХрд░рдг рдФрд░ рдХрддрд╛рд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ред рдЗрд╕рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд┐рд░реНрдл puppeteer.connect рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрддрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреНрд░реЛрдо рд╕рдорд╡рд░реНрддреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдФрд░ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреА рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреЛ рд▓реЗ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдПрдВ:

 # Pull in Puppeteer@1.4.0 support $ docker pull browserless/chrome:release-puppeteer-1.4.0 $ docker run -e "MAX_CONCURRENT_SESSIONS=10" browserless/chrome:release-puppeteer-1.4.0 

рдпрд╣ рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджрд╕ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ (рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рддреНрд░ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╣рд┐рдд)ред рдХрддрд╛рд░ рдХреЛ рдЪрд░ MAX_QUEUE_LENGTH рджреНрд╡рд╛рд░рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЖрдк рдореЗрдореЛрд░реА рдХреЗ рдкреНрд░рддрд┐ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рд▓рдЧрднрдЧ 10 рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реАрдкреАрдпреВ рдЙрдкрдпреЛрдЧ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░реИрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

6. page.waitForNavigation рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛


рд╕рдмрд╕реЗ рдЖрдо рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреЛ рд╣рдордиреЗ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд╛рдж рдЕрдЪрд╛рдирдХ рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрдареЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ pageload рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реА pageload рдЕрдХреНрд╕рд░ рдмрд╛рдж рдХреЗ рдХрд╛рдо рдХреЛ рдирд┐рдЧрд▓рдиреЗ рдХрд╛ рдХрд╛рд░рдг pageload рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдорддреМрд░ рдкрд░ рдкреГрд╖реНрда рд▓реЛрдб рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдФрд░ рдЗрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд▓реЛрдб рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ console.log рдПрдХ рдЬрдЧрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ ( рдбреЗрдореЛ рджреЗрдЦреЗрдВ ):

 await page.goto('https://example.com'); await page.click('a'); const title = await page.title(); console.log(title); 

рд▓реЗрдХрд┐рди рдпрд╣ рджреВрд╕рд░реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ( рдбреЗрдореЛ рджреЗрдЦреЗрдВ )ред

 await page.goto('https://example.com'); page.click('a'); await page.waitForNavigation(); const title = await page.title(); console.log(title); 

рдЖрдк рдпрд╣рд╛рдВ waForNavigation рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ page.goto , рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ "рдкреНрд░рддреАрдХреНрд╖рд╛" рднрд╛рдЧ рдХреЗ рд╕рд╛рдеред

7. рдЖрдкрдХреА рдЬрд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред


рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░реЛрдо рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЖрдкрдХреЛ рдлреЛрдВрдЯ рдФрд░ рдлреИрдВрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рд░ рдЪреАрдЬ рдХреЛ рд╡рд╣рд╛рдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрджрд░реНрд╢ рд╣реИред рдбреЙрдХрд░ рдХреЛ рд▓рдЧрднрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ Dockerfile рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:

 # Dependencies needed for packages downstream RUN apt-get update && apt-get install -y \ unzip \ fontconfig \ locales \ 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 

рдФрд░ рдЬрд╝реЛрдВрдмреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ (рдХреНрд░реЛрдо рдореЗрдВ рдПрдХ рдЖрдо рдмрд╛рдд) рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрдВрдм-рдЗрдирд┐рдЯ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:

 ADD https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64 /usr/local/bin/dumb-init RUN chmod +x /usr/local/bin/dumb-init 

рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ ред

8. рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ runtimes рдпрд╛рдж рд░рдЦреЗрдВред


рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рджреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рдирдЯрд╛рдЗрдо (рдиреЛрдб рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░) рд╣реИрдВред рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рднреНрд░рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЛ рдЬрдорд╛рдЦреЛрд░реА рдХреЗ рдмрдЬрд╛рдп рд╕реНрдкрд╖реНрдЯ рд▓рд┐рдВрдХ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, page.evaluate ред рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЖрдВрддреНрд░реЛрдВ рдореЗрдВ рдЧрд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдХреА рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рдХрдареЛрд░рддрд╛ рд╣реИ рдФрд░ рдХреНрд░реЛрдо рдореЗрдВ рдЗрд╕рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╣реИ ред рдЗрд╕рд▓рд┐рдП, рдмрдВрдж рдФрд░ рд▓рд┐рдлреНрдЯ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреА ред рдпрджрд┐ рдЖрдкрдХреЛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЙрд▓ рдореЗрдВ рдХреБрдЫ рд╕рдВрджрд░реНрдн рдпрд╛ рдорд╛рди рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЙрди рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, selector рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп:

 const anchor = 'a'; await page.goto('https://example.com/'); // `selector` here is `undefined` since we're in the browser context const clicked = await page.evaluate(() => document.querySelector(anchor).click()); 

рдмреЗрд╣рддрд░ рдкрд╛рд╕ рдкреИрд░рд╛рдореАрдЯрд░:

 const anchor = 'a'; await page.goto('https://example.com/'); // Here we add a `selector` arg and pass in the reference in `evaluate` const clicked = await page.evaluate((selector) => document.querySelector(selector).click(), anchor); 

page.evaluate рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рддрд░реНрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдХрд╛ page.evaluate рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реИред рдЗрд╕рдХрд╛ рд▓рд╛рдн рдЕрд╡рд╢реНрдп рд▓реЗрдВ!

рднрд╡рд┐рд╖реНрдп


рд╣рдо рдмрд┐рдирд╛ рд╕рд┐рд░ рд╡рд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЖрд╢рд╛рд╡рд╛рджреА рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рднреА рд╕реНрд╡рдЪрд╛рд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрдардкреБрддрд▓реА рдФрд░ рдмреНрд░рд╛рдЙрдЬрд░ рдЬреИрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рд╣реЗрдбрд▓реЗрд╕ рдСрдЯреЛрдореЗрд╢рди рдЪрд▓рд╛рдирд╛ рдЖрд╕рд╛рди рдФрд░ рддреЗрдЬрд╝ рд╣реЛрдЧрд╛ред рдЬрд▓реНрдж рд╣реА рд╣рдо рдЙрди рдЦрд╛рддреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЗ-рдП-рдпреВ-рдЧреЛ рдмрд┐рд▓рд┐рдВрдЧ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдмрд┐рдирд╛ рд╕рд┐рд░ рдХреЗ рдХрд╛рдо рдХрд╛ рдмреЗрд╣рддрд░ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ!

Source: https://habr.com/ru/post/hi413547/


All Articles