PowerShellから各種ブラウザで開いているURLを取得する (Windows10+Microsoft Edge編)

概要

AuntomationのConditionで絞って特定の属性を持つノードをInspectorでとってくる(前の記事参照)。

悲しいことにMSEdgeはActiveになっていないタブのURLは取れない。ので、アドレスバーからとる。タブにフォーカスを順に当ててけばできると思うけど、ここでは秘密裏にユーザ操作に影響を与えず取得することを目的とするため、そういうことはせず、一個とるだけで我慢する。

目標はURL入ってるこれ。ControlTypeでも取れると思うが、Nameの「アドレスと検索バー」からとる。当然、言語が違えば表現が変わるので注意。

f:id:harupu:20210318100437p:plain

コード

$edge_csharp = @"
using System;
using System.Windows.Automation;
using System.Diagnostics;
namespace UIAutomationEdge {
  public class Program {
    public static string GetURL(Process process) {
      AutomationElementCollection roots = AutomationElement.RootElement.FindAll(TreeScope.Element | TreeScope.Children, new AndCondition(new PropertyCondition(AutomationElement.ProcessIdProperty, process.Id), new PropertyCondition(AutomationElement.ClassNameProperty, "Chrome_WidgetWin_1")));
      foreach (AutomationElement rootElement in roots){
        AutomationElement address = rootElement.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "アドレスと検索バー"));
        if (address == null) {continue;}
        ValuePattern v = (ValuePattern)address.GetCurrentPattern(ValuePattern.Pattern);
        if (v.Current.Value != null && v.Current.Value != "") {
          Console.WriteLine("URL:" + v.Current.Value);
          return v.Current.Value;
        }
      }
      return "";
    }
  }
}
"@
Add-Type -TypeDefinition $edge_csharp -ReferencedAssemblies("UIAutomationClient", "UIAutomationTypes");

$msedges = (Get-Process -name msedge)
foreach ($msedge in $msedges) {
  $url = [UIAutomationEdge.Program]::GetURL($msedge);
  if ($url) {
    $url
  }
}

f:id:harupu:20210318100930p:plain