single.php

C#でChromeのダウンロードページの詳細を取得する方法

Google Chromeの[ダウンロード]ページに表示されるファイルのダウンロード速度を記録したくて Selenium を使ってC#から取得する方法を備忘録的に投稿します。

ダウンロードの詳細要素

Google Chromeの[ダウンロード]メニューで表示される[ダウンロード]ページには、詳細な進捗状況を確認する画面があります。

ファイルをダウンロードしている最中であれば、容量やダウンロードしている速度が表示されている場所です。

Chromeを操作できる Selenuim であれば、ダウンロードページに表示されている内容を取得できます。

Selenium パッケージの追加

今回は C# から取得をするので、Visual Studioの依存関係メニューから Selenium で利用するパッケージを追加していきます。

Visual Stuidoの場合には、[ソリューション エクスプローラー]の画面で、[依存関係]をマウスで右クリックで表示される[NuGetパッケージの管理]メニューを選択して表示される画面で、”Selenium”と検索して表示される一覧から[Selenium.WebDriver]と[Selenium.WebDriver.ChromeDriver]を追加します。

ダウンロードページの詳細取得

詳細画面の要素を確認するために、Google Chromeの[ダウンロード]ページで[デベロッパーツール]を使って[Elements]タブに表示されるDOM構造を確認します。

結構入り組んだ構成になっていますが、おおよそは以下のような構造になっています。

<downloads-manager>
  #shadow-root
  <mainContainer>
    <iron-list>
      <downloads-item>
      #shadow-root
      <content>
        <details>
          <description>
            96.0 KB/秒 - 501 MB 中 295 MB (残り 37 分) 
          </description>
        </details>
      </content>
      </downloads-item>
    </iron-list>
  </mainContainer>
</downloads-manager>

途中の[#Shadow-root]要素はGetShadowRoot メソッドを使って取得します。具体的なメソッドの利用方法は別記事をご覧ください。

Seleniumを使ってC#からダウンロードページの詳細部分の要素を取得するコードは次のようになります。

using (var driver = new ChromeDriver(options))
{
  var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 5));

  driver.Url = "chrome://downloads/";
  IWebElement dlmanager = driver.FindElement(By.TagName("downloads-manager"));
  ISearchContext shadowroot1 = dlmanager.GetShadowRoot();
  IWebElement maincontainer = shadowroot1.FindElement(By.Id("mainContainer"));

  IWebElement ironlist = maincontainer.FindElement(By.TagName("iron-list"));
  IWebElement downloadsitem = ironlist.FindElement(By.TagName("downloads-item"));

  ISearchContext shadowroot2 = downloadsitem.GetShadowRoot();
  IWebElement content = shadowroot2.FindElement(By.Id("content"));

  IWebElement details = content.FindElement(By.Id("details"));
  IWebElement titlearea = details.FindElement(By.Id("title-area"));
  IWebElement description = details.FindElement(By.Id("description"));

  string sDescription = description.GetAttribute("innerText");

}

その他にも、[title-area]要素を利用してファイル名を取得することも可能です。

まとめ

Google Chromeの[ダウンロード]メニューで表示されるページに使われている[description]要素を使って、ダウンロード中の容量や速度を取得することができます。

Chromeの[ダウンロード]ページの詳細部分を取得したい方の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です