とあるサイトを puppeteer を使いスクレイピングして PDF をダウンロードしようとしています。
ログインから、いくつか画面を介し、ダウンロード画面まで行き、
対象のダウンロードのリンクをクリックする処理で、イベントが発生せず、行き詰まってます。
(リンク先の URL は可変のため、クリック後の Request の情報を取得して、ごにょごにょしたい)
クリックは出来ている前提で、イベントが発生しない、何か考えられる原因はありますでしょうか?
または、
クリックが出来ていない前提で、SELECTOR で対象の要素が指定出来てるが、クリック出来ない原因はありますか?
よろしくお願い致します。
とあるサイト
サイトは下記のような、a タグでダウンロードが実装されており、
実際ブラウザ上でクリックすると、別タブが開き PDF がダウンロードされる動きです。
<a class="gTL" href="javascript:"> <span class="gTL__txt">PDF</span> </a>
スクレイピングのソースコード
(async () => { const browser = await puppeteer.launch({ slowMo: 50, args: ["--no-sandbox","--disable-setuid-sandbox"] }); const page = await browser.newPage(); await page.setDefaultNavigationTimeout(10000); await page.setRequestInterception(true); await page.setViewport({width:1920,height:1080}); //イベントが発生すれば、"request start"が出力される page.on('request', async(request) => {console.log('request start');return request.continue();}); try { //-------------------------------- // ダウンロード画面までのソースは省略 //-------------------------------- //ページ数 この時点で 2 console.log((await browser.pages()).length); //対象のリンク const [target] = await page.$x('//a[@class="gTL"]'); //elementhandle の確認 → 対象の要素がちゃんと取れてる //console.dir(target); //----------------------------- // ※ここでリンクをクリック処理※ //----------------------------- await page.waitForTimeout(2000); //ページ数 変わらず 2 console.log((await browser.pages()).length); } catch(e) { console.log(e); } finally { await browser.close(); } })();
試したこと
1.普通にクリック
await target.click();
2.フォーカス当ててからEnter
await target.focus(); await page.keyboard.press('Enter');
3.マウスでクリック
const box = await target.boundingBox(); const x = box.x + (box.width/2); const y = box.y + (box.height/2); await page.mouse.move(x,y); await page.mouse.click(x,y,{ button: 'left' })
別の似たようなサイトでは、上記いずれもクリックできイベントが発生しているのですが、
この、とあるサイトでは、うまく動きませんでした。
補足情報
puppeteer v10.0.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。