2016-03-31 16 views
0

Ich versuche, den ersten Audio-Tab in Chrome (oder anderen Browsern) zu finden.Holen Sie sich das nächste Element von AutomationElement

Ich habe es bereits geschafft, die Titel aller geöffneten Registerkarten zu erhalten (hauptsächlich mit den Informationen aus Getting the current tab's URL from Google Chrome using C# und Get chrome browser title using c#).

Aber gerade auf der Suche für die eine Registerkarte mit dem Wort „Youtube“ scheint ein wenig seltsam (da es würde auch die verknüpften Fragen oder anderes „nicht Musik Zeug“, solange es findet das Wort Youtube finden).

Gibt es eine Möglichkeit, den ersten Audio-Tab zu finden?

bearbeiten
Fest das ursprüngliche Problem:

Process[] chromeProcesses = Process.GetProcessesByName("chrome"); 

     if(chromeProcesses.Length > 0) 
     { 
      foreach(Process proc in chromeProcesses) 
      { 
       if (proc.MainWindowHandle == IntPtr.Zero) 
       { 
        continue; 
       } 

       AutomationElement chrome = AutomationElement.FromHandle(proc.MainWindowHandle); 

       var tabs = chrome.FindAll(TreeScope.Descendants, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.TabItem)); 
       if (tabs != null) 
       { 
        foreach(AutomationElement tab in tabs) 
        { 
         string tabTitle = tab.GetCurrentPropertyValue(AutomationElement.NameProperty).ToString(); 
//... 

ich derzeit bin Überprüfung "- YouTube" (am Ende des Strings) in der tabtitle. Aber es gibt einen Weg, um noch präziser zu werden. indem Sie das nächste Element zum Tab-Text bringen.

Mit dem Tool inspect.exe habe ich herausgefunden, dass eine "aktuell spielende" Registerkarte neben dem Text eine leere Schaltfläche (eigentlich das Lautsprechersymbol) hat - ansonsten ist es eine Schließen-Schaltfläche. Daher sollte es möglich sein, durch Suchen nach dem nächsten Element herauszufinden, ob der Tab auch Musik spielt.

Aber ich bin gerade dabei, das nächste Element zu finden. Wie geht das mit der Klasse AutomationElement?

+0

Sie können die hörbaren Registerkarten von einer Chrome-Erweiterung mit chrome.tabs.query (https://developer.chrome.com/extensions/tabs#method-query) abfragen. Mit C# könnte es zwar eine Möglichkeit geben, alle Arten von Pinvokes zu verwenden, aber es wäre eine spröde Lösung, da Google sein Design jederzeit ändern könnte. –

+0

Sollte es nicht möglich sein, die Registerkarten mit der Klasse 'AutomationElement' zu finden? – nehalist

Antwort

0

Fest alles:

Process[] chromeProcesses = Process.GetProcessesByName("chrome"); 

     if(chromeProcesses.Length > 0) 
     { 
      foreach(Process proc in chromeProcesses) 
      { 
       if (proc.MainWindowHandle == IntPtr.Zero) 
       { 
        continue; 
       } 

       AutomationElement chrome = AutomationElement.FromHandle(proc.MainWindowHandle); 

       var tabs = chrome.FindAll(TreeScope.Descendants, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.TabItem)); 
       if (tabs != null) 
       { 
        foreach(AutomationElement tab in tabs) 
        { 
         string tabTitle = tab.GetCurrentPropertyValue(AutomationElement.NameProperty).ToString(); 

         AutomationElement next = tab.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button)); 
         if (next != null) 
         { 
          string nextContent = next.GetCurrentPropertyValue(AutomationElement.NameProperty).ToString(); 
          if(nextContent != "") 
          { 
           break; 
          } 
         } 

         if (tabTitle.LastIndexOf(YoutubeRecogPattern, StringComparison.OrdinalIgnoreCase) > 0) 
         { 
          if (tabTitle != this.LastTitle) 
          { 
           string videoTitle = tabTitle.Substring(0, tabTitle.Length - YoutubeRecogPattern.Length); 
// ... 

Wo die YoutubeRecogPattern ist - YouTube.

Verwandte Themen