Schließen Sie die letzten Fenster einer Anwendung

Ich verwende Selenium , um mehrere Firefox-Sitzungen gleichzeitig zu steuern.

In diesem Zusammenhang behandelt das Betriebssystem jedes Firefox-Fenster als eine andere Anwendung.

Ich möchte einen Workflow erstellen, der es mir ermöglicht, alle aktuellen Fenster von Firefox zu schließen (wobei das "älteste" funktioniert), aber ich konnte keine Möglichkeit finden, sie nach ihrem Eröffnungsdatum zu sortieren.

Jede Hilfe wäre willkommen!

Antworten (3)

Versuchen Sie, auf das Fenstermenü von Firefox zuzugreifen, das älteste Fenster ganz oben in der Liste

Dies scheint eher ein Kommentar als eine Antwort zu sein. Wenn es eine Antwort ist, können Sie erläutern, wie dies die Frage des OP löst?
Da ich die Firefox-Fenster über Selenium öffne, wird, wie ich bereits erwähnt habe, jedes von ihnen als separate Anwendung angezeigt

Ich habe keine Erfahrung mit Selenium , aber ich frage mich, ob Sie ein AppleScript (das Alfred gerne verwenden kann) verwenden könnten, um die Fenster- IDs jedes Firefox- Fensters zu erhalten. Fenster- IDs werden normalerweise inkrementell zugewiesen, sodass ein aktuelles Fenster eine ID mit einem größeren numerischen Wert hat als die vorherigen.

    tell application "Firefox" to get every window

sollte eine Liste aller Fenster zurückgeben, auf die durch ihre ID-Nummern verwiesen wird, z

    {window id 59 of application "Firefox", window id 2408 of application "Firefox", window id 61 of application "Firefox", window id 60 of application "Firefox"}

Natürlich frage ich mich, wie sich das Ausführen mehrerer, separater Instanzen von Firefoxget windows darauf auswirkt, da ich nicht vorhersagen kann, ob AppleScript den Befehl an alle Firefox- Instanzen sendet oder nur an eine (und wenn ja, an welche?).

Wenn diese Zeile so funktioniert, wie ich es möchte, können Sie die mit der kleinsten ID auswählen und die anderen schließen. Hier ist eine Möglichkeit, das zu tun:

    tell application "Firefox" to get the id of every window

    set W to result

    set AppleScript's text item delimiters to space
    do shell script ({"echo", W, "| tr ' ' '\\n'", "| sort -n"} as string)
        --> Outputs lines sorted from smallest to greatest value

    set W to first paragraph of result

    tell application "Firefox" to close (windows whose id > W)
+1 für die Mühe, die Sie hier hineingesteckt haben, obwohl es nur 1 Firefox-Fenster-ID druckt, die die Hauptfenster-ID ist
Ich befürchtete, dass dies ein mögliches Ergebnis sein könnte, angesichts dessen, was Sie über Selenium gesagt haben , das mehrere Instanzen erstellt. Das tut mir leid. Danke für +1, aber.

Mit etwas Hilfe von dieser Antwort konnte ich die IDs und die Namen aller derzeit laufenden Prozesse drucken.

Ich habe dann ein paar Tests durchgeführt und das sind meine Erkenntnisse:

  1. Die Prozesse sind nach den neuesten sortiert.
  2. Die von Selenium geöffneten Firefox-Prozesse heißen „firefox-bin“, im Gegensatz zu den üblichen „firefox“-Prozessen.
  3. Daher stimmt die Reihenfolge der IDs mit der Reihenfolge der Namen überein, sodass es möglich ist, zwischen den Listen zu wechseln und die Fenster zu identifizieren, die Selenium geöffnet hat.

Der Code, den ich verwendet habe, ist:

tell application "System Events" to get the name of every process whose background only is false
set _name to result
tell application "System Events" to get the id of every process whose background only is false
set _id to result

set AppleScript's text item delimiters to space
do shell script ({"echo", _name & " " & _id, "| tr ' ' '\\n'", "| sort -n"} as string)`

Es ist nicht optimal, aber ich musste nur die richtigen IDs bekommen, also reichte dieser Test für mich, um weiterzumachen.

Gut gemacht! Das ist nette Detektivarbeit.