前提・実現したいこと
汎用性を高めるために、querySelectorAllの引数に定数を用いたいのですが、書き方がわかりません。
直接書けば動くのに、定数を使うとエラーになってしまいます。どのように書けば良いのでしょうか?
発生している問題・エラーメッセージ
(node:16002) UnhandledPromiseRejectionWarning: Error: Evaluation failed: ReferenceError: pathPager is not defined
該当のソースコード
Javascript
1///////////////////////該当箇所のみ(省略)///////////////////////// 2//定数を使うと動かない 3const pathPager = 'div.test'; 4const pageList = await page.evaluate(() => Array.from( 5 document.querySelectorAll(pathPager)).map(a => a.href) 6); 7 8//直接書くと動く 9const pageList = await page.evaluate(() => Array.from( 10 document.querySelectorAll('div.test')).map(a => a.href) 11); 12 13 14///////////////////////全文///////////////////////// 15const puppeteer = require('puppeteer'); 16 17const domain = "xxx"; 18const pathCalender = "xxx"; 19let urls = new Array(domain + pathCalender); 20 21const pathPager = 'div.monthNavAreaInner:first-child li a'; 22 23//puppeteer起動 24puppeteer.launch({ 25 headless: true, 26 ignoreHTTPSErrors: true, 27 args: [ 28 '--no-sandbox', 29 '--disable-setuid-sandbox' 30 ] 31}).then(async browser => { 32 33 //新しいページを開く 34 const page = await browser.newPage(); 35 36 //サイトを開く+domを読み込むまで待機 37 await page.goto(urls[0], { waitUntil: 'domcontentloaded' }); 38 39 //ページャーURL取得(配列:urls) 40 const pageList = await page.evaluate(() => Array.from( 41 document.querySelectorAll(pathPager)).map(a => a.href) 42 ); 43 44 //ブラウザを終了する 45 await browser.close(); 46});
補足情報(FW/ツールのバージョンなど)
Javascript Puppeteer
実際のコードでも、
const pathPager...
の次の行に
const pageList...
が来ていますか?
それとも何かを省略していますか?
はい、省略しています。
全文を追記致しました。
詳しくないのですが、ドキュメントを見ると、
> Function to be evaluated in the page context
https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageevaluatepagefunction-args
とありますね。サンプルコードでも引数で持たせているようです。
ドキュメントどおりに書くと、たぶん、
const pageList = await page.evaluate((pathPager) => Array.from(
document.querySelectorAll(pathPager)).map(a => a.href)
, pathPager);
じゃないですかね。よくわかんないですけど。
あ、かっこつけないとダメかも。
Lhankor_Mhyさん
コードを試してみたところ、無事に動きました!
次に困ったら、教えて頂いたURLのドキュメントを確認致します。
ありがとうございます^^
ご解決されて何よりです。
自己解決の処理をお願いします。
https://teratail.com/help#resolve-myself
回答2件
あなたの回答
tips
プレビュー