前提・実現したいこと
Node.jsのスクレイピングライブラリのPuppeteerの.NET向けライブラリ「PuppeteerSharp」を用いたツールの作成を行っています。
実現したいこととしては、以下の手順の4番になります。
1.サイトにアクセス
2.いくつかリンクを辿る
3.最後のリンクは新規ウィンドウで開かれる
4.新規ウィンドウに内容が表示されるまで待機
5.HTMLを取得
試したソースコード
下記のソースコードでも成功するときもあれば、見つからないときもある感じです。
成功するとき、失敗するときの違いはイマイチ突き詰めれていません。
C#
1public async Task OpenNewPage() 2{ 3 // リンクをクリック 4 await page.ClickAsync("新規ウィンドウが開かれるリンク"); 5 6 int retryFrequency = 30; 7 int retryInterval = 1000; 8 int retryCount = 0; 9 while (true) { 10 try { 11 // 待機 12 await Task.Delay(retryInterval); 13 // 自分の期待する新規ウィンドウが開かれているか確認 14 newPage = await CheckNewPage(); 15 } catch { 16 if (retryCount++ < retryFrequency) 17 { 18 // 数秒待機してリトライ 19 } else 20 { 21 // リトライ回数オーバー 22 } 23 } 24 } 25 26private async Task<Page> CheckNewPage() 27{ 28 // 開かれているページを全取得 29 var pages = await browser.PagesAsync(); 30 int index = pages.Length - 1; 31 // 最後に開かれたページを取得 32 var newPage = pages[index]; 33 // ページ全てのHTMLを確認し、自分の期待する新規ウィンドウが開かれているか確認 34 while (index >= 0) 35 { 36 // HTML取得 37 string html = await GetHtmlCode(newPage); 38 // 期待する新規ウィンドウかどうか 39 if (html.Contains("特定したい新規ウィンドウ特有と思われる文言")) 40 { 41 return newPage; 42 } 43 else 44 { 45 // 期待する新規ウィンドウでない場合は、1つ前に開かれたページを確認 46 newPage = pages[index--]; 47 } 48 } 49 // 期待するウィンドウは開かれていない 50 throw new Exception(); 51}
(参考)本家Puppeteerでの記述
下記Qiita記事に、Node.jsのPuppeteerでの新規ウィンドウの待機方法が書かれていますが、
これをC#で実行するコードが分かりません。
Puppeteerで次ページへの遷移を待つ
以下、抜粋。
<a href="..." target="_blank">
や window.open()
によるリンクの場合もサブウインドウの場合と考え方は同じですが、遷移後のPage
を取り出すのにEventEmitter
が絡んでくるので少し複雑になります。
また、この書き方はPuppeteer1.6.0以降が必要です。
javascript
1const newPagePromise = new Promise(resolve => browser.once('targetcreated', 2 target => resolve(target.page()))); 3await page.click('a'); 4const newPage = await newPagePromise; 5await newPage.waitForSelector('input[name="foo"]', {visible: true});
注意点として、target.page()
が呼ばれた直後は新ウインドウが作られていてもページ遷移していない可能性があるので、ページ遷移をwaitForSelector()
やその他の方法で待つ必要があります。
環境情報
Windows 10 1903
Visual Studio 2017 15.9.24
Microsoft .NET Framework 4.8.03725
Target Framework 4.7.2
PuppeteerSharp 2.0.3
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。