Wie finde ich die Fenster-ID von Google Chrome, die an screencapture -l [duplicate] übergeben werden soll?

7

Ich möchte screencapture -ldamit automatisierte Screenshots von Google Chrome erstellen. Dies setzt voraus, dass Sie die Fenster-ID des laufenden Google Chrome-Prozesses kennen.

Für Apps, die Applescript unterstützen, hat diese Frage die Antwort. Diese Lösung funktioniert jedoch nicht für Apps, die nicht skriptfähig sind, wie Google Chrome.

Gibt es eine Möglichkeit, die Fenster-ID aus einem laufenden Google Chrome-Prozess aus einem Python-Skript abzurufen? Ich weiß, dass die Quartz Debug-App dies kann, aber das ist eine GUI-App, sodass sie nicht per Skript aufgerufen werden kann.

Lorin Hochstein
quelle
Muss es explizit das Chrome-Fenster sein, oder benötigen Sie tatsächlich nur die Webseite, die Sie für ein Bild besuchen? (Gegebenes Webkit-Rendering.)
MacLemon
@MacLemon Es muss Chrome-spezifisch sein, da es auf dieser bestimmten Site ein Problem mit Safari gibt (Safari erlaubt keine OpenID-Authentifizierung innerhalb von Iframes). Ich habe einen Weg gefunden, den Inhalt des Browsers einfach über Selen zu erfassen, siehe stackoverflow.com/questions/13732281 . Ich würde trotzdem gerne die Antwort auf diese spezielle Frage wissen.
Lorin Hochstein

Antworten:

2

Ich habe das gelöst, indem ich ein Python-Skript geschrieben habe. Wenn Sie es ausführen, können Sie eine Anwendung angeben, für die die Liste der Windows-IDs gesichert werden soll. Wenn Sie keine Anwendung angeben, werden alle Fenster ausgegeben.

Die Fenster werden in der Reihenfolge ihrer Präsentation ausgegeben, sodass alles, was oben in der Liste steht, das "höchste" Fenster ist (angeblich das aktuell aktive, wenn es sichtbar ist).

Beispielausgabe

bloop:~ r$ ./wlist2 Chrom
9040 0 "Chromium" "terminal - How do I find the windowid of Google Chrome to pass to screencapture -l - Ask Different"
9039 0 "Chromium" ""

So erfassen Sie einen Bildschirm automatisch aus einem Shell-Skript

screencapture -l $(./wlist2 Chrom | head -1 | awk '{print $1}') out.png

Skript:

#!/usr/bin/python2.6

from itertools import chain
from Quartz import CGWindowListCreate as create_list
from Quartz import CGMainDisplayID as display_id
from Quartz import CGWindowListCreateDescriptionFromArray as lookup
import sys

class Windows(list):
    def find(self, name):
        for window in self:
            if window.IsOnscreen and window.OwnerName.find(name) > -1:
                print window

    def dump(self):
        for window in self:
            if window.IsOnscreen:
                print window


    def __getitem__(self, item):
        result = list.__getitem__(self, item)
        try:
            return Windows(result)
        except TypeError:
            return result

class Window(object):

    key_list = []

    def __init__(self, kwargs):
        for k in kwargs.keys():
            setattr(self, k.replace('kCGWindow',''), kwargs[k])
            self.key_list.append(k.replace('kCGWindow',''))

    def __repr__(self):
        t = '%d %d "%s" "%s"' % (
            getattr(self, 'Number', -1),
            getattr(self, 'Layer', -1),
            getattr(self, 'OwnerName', None),
            getattr(self, 'Name', None)
        )
        return t.encode('utf-8')

wlist=Windows()
for x in lookup(create_list(display_id(), 0)):
    wlist.insert(0, Window(dict(x)) )

if len(sys.argv) > 1:
    wlist.find(sys.argv[1])
else:
    wlist.dump()
Synthesizerpatel
quelle
4

Sie können dies mit GrabFS tun , einem Screenshot-Dateisystem für OS X. (Download am Ende der Seite. Funktioniert für mich unter 10.8.2 mit OSXFUSE einwandfrei. ) Es gibt Ihnen die Texturen aller Prozessfenster als Dateien, die Sie einfach kopieren können . Kopieren Sie den Screenshot erneut, um ihn zu aktualisieren.

Sieht so aus (aus Platzgründen von TIFF in PNG konvertiert): Google Chrome Screenshot dieser Seite, aufgenommen mit GrabFS.]! [Screenshot von Google Chrome mit diesem Thread, aufgenommen mit GrabFS. Sie müssen wahrscheinlich ein wenig Shell-Scripting durchführen, um dies zu automatisieren, aber das wird einfach.

MacLemon
quelle
Das ist eine gut aussehende App. Sieht so aus, als könnten Sie die Fenster-ID sogar aus den Dateipfaden abrufen, wodurch die obige Frage direkt beantwortet wird, obwohl Sie die Fenster-ID nicht benötigen, wenn Sie GrabFS verwenden.
Lorin Hochstein
Der einzige Nachteil ist, dass Sie wahrscheinlich die .tiff-Screenshots in etwas Kompakteres wie .png konvertieren möchten, was mit den eingebauten Schlucken einfach ist. sips -s format png Path/To/Image.tiff --out Path/To/ConvertedImage.pngDies führt tatsächlich zu einem einzelnen Kopier- / Konvertierungsschritt.
MacLemon
Ich muss sagen, dass die Bildlaufleiste unglaublich unansehnlich ist ...
Jason Salaz
1
Wie das ursprüngliche Poster hinzufügte, benötigt er ausdrücklich einen Screenshot des Chrome-Browserfensters, der zeitweise eine Bildlaufleiste enthält. Wenn Sie Screenshots vollständiger Webseiten ohne Browser-Chrome (Symbolleisten, Positionsleiste, Bildlaufleisten usw.) erstellen möchten, können Sie Webkit2PNG verwenden. github.com/paulhammond/webkit2png
MacLemon
Es war nur ein Kommentar :). Aber ich schätze den Webkit2PNG-Link, da ich ihn gerade verwenden werde!
Jason Salaz