Wie ändere ich die Position der Bildlaufleiste in AppleScript?

1

Ich habe eine AppleScript .scpt-Datei, die über die Drittanbieteranwendung FastScripts einer Tastenkombination zugewiesen wird.

Das Skript öffnet eine bestimmte, festgelegte URL in einem neuen Google Chrome-Tab. Dieser neue Tab wird unmittelbar nach dem aktuell geöffneten Google Chrome-Tab eingefügt (sofern Google Chrome aktuell geöffnet ist).

Hier ist dieser Code:

activate application "Google Chrome"

set myURL to "https://weather.com/weather/hourbyhour/l/12345"

tell application "Google Chrome"
    activate
    tell front window to make new tab at after (get active tab) with properties {URL:myURL}
end tell

Eine zusätzliche Operation, die ich in diesem Skript implementieren möchte, besteht darin, die Bildlaufleiste der in Chrome geöffneten Webseite automatisch etwas nach unten zu verschieben. Genau wie die URL-Variable ist der Bildlaufbetrag spezifisch, fest und vorbestimmt.


Ich weiß nicht, wie ich Ihnen einen Bildlaufbetrag schriftlich mitteilen kann (und dieser hängt natürlich von der Bildschirmauflösung, der Bildschirmgröße, der Fenstergröße und der Zoomeinstellung ab, die in Chrome für die jeweilige Seite festgelegt wurde), aber ich kann sagen, dass es für meine einzigartige Umgebung rund 15% auf der Seite ist. Um die Bedeutung dieser Beschreibung zu verdeutlichen, befindet sich "100% nach unten" an der niedrigsten Bildlaufleistenposition (die Bildlaufleiste kann durch Drücken von ⌘ command + auf diese Position eingestellt werden ).

Die genaue Menge an Bildlauf, die ich wünsche, ist im Zusammenhang mit meiner Frage wahrscheinlich nicht besonders relevant (unter Berücksichtigung der vielen oben genannten Variablen, die die Menge an Bildlauf beeinflussen können). Es ist einfach wichtig zu beachten, dass der Bildlaufbetrag eine benutzerdefinierte Zahl ist, anstatt sich ganz oben oder ganz unten auf der Seite zu befinden (da man die entsprechende Tastenkombination key codein AppleScript verwenden kann, um einfach zu diesen beiden Stellen zu scrollen). .

Ich hoffe, dass jede vorgeschlagene Lösung mir die Möglichkeit bietet, die gewünschte Position der Bildlaufleiste zu optimieren und anzupassen, damit ich sie so nah wie möglich an die Stelle bringen kann, an der ich manuell scrollen würde.

Rubiks Sphäre
quelle
Ist das die eigentliche URL? Wenn ja, wo auf dieser Seite möchten Sie einstellen, zB direkt unter der Adressleiste? Sind die Grenzen des Fensters immer gleich oder möchten Sie die Grenzen so festlegen, dass sie eine Konstante sind? Wenn Sie den Begriff "Seite" verwenden, beziehen Sie sich auf die gesamte Länge des HTML-Dokuments als einzelne Seite oder Anzahl der Seiten, wenn diese gedruckt werden oder im Bereich der Seite sichtbar sind, der derzeit innerhalb der Fenstergrenzen angezeigt wird. Versuchen Sie, dies nur für diese bestimmte Seite zu tun?
user3439894
@ user3439894 Ich möchte, dass der obere Rand der Seite genau zwischen der Uhrzeit (derzeit "9:48 pm EST") und den Spaltenüberschriften "TIME DESCRIPTION TEMP FEELS PRECIP HUMIDITY WIND" liegt. Aber ich benutze Adblock; Ich muss nicht an den großen Anzeigen oben auf der Seite vorbeirollen. Die Grenzen des Google Chrome-Fensters sind immer gleich (volle Breite und volle Höhe von der Menüleiste bis zum Dock). Wenn ich auf die "Seite" verweise, meine ich die gesamte Seite, wie sie im Browserfenster vorhanden ist, als eine fortlaufende Seite - nicht die Druckansicht oder nur das, was sichtbar ist.
Rubiks Sphäre
Ja, im Moment ist dies etwas, das ich nur für diese spezielle Webseite implementieren möchte. Im weiteren Verlauf werde ich die Lösung für verschiedene Webadressen anpassen.
Rubiks Sphäre
Können Sie angeben, auf welche Auflösung Ihr Bildschirm eingestellt ist und welche Grenzen das Google Chrome-Fenster hat? Ich bitte Sie, einen Code zu testen, der Ihnen dabei helfen könnte, das zu bekommen, was Sie wollen. Sie können verwendet werden , tell application "Finder" to get bounds of window of desktopund tell application "Google Chrome" to get bounds of front windowwenn die Ziel - URL ist die Frontscheibe.
user3439894
@ user3439894 Bildschirmgröße: 15,4-Zoll-Retina. Lösung: "Standard für die Anzeige." "(2880 x 1800)" . Bounds of Chrome-Fenster (die Grenzen meiner Chrome-Fenster haben immer diese Größe): "{0, 23, 1440, 850}" . Chrome-Zoomeinstellung (für die jeweilige Webseite): 100%. Chrome-Anzeigeoptionen: Die "Lesezeichenleiste" oder eine erweiterungsspezifische Symbolleiste wird oben im Fenster nicht angezeigt. nur die Adressleiste und die Registerkarten.
Rubiks Sphäre

Antworten:

2

Sie können das JavaScript verwenden , um den Bildlaufbetrag festzulegen.

So passen Sie den Bildlauf mit einem definierten Prozentsatz an:

set myURL to "https://weather.com/weather/hourbyhour/l/12345"
set scrollAmount to "16" --- % down the page

tell application "Google Chrome"
    activate
    tell front window to set curTab to make new tab at after (get active tab) with properties {URL:myURL}
    tell curTab
        repeat while (loading)
            delay 1
        end repeat
        -- set the vertical scroll 
        execute javascript "h=document.documentElement.scrollHeight-document.documentElement.clientHeight; window.scrollTo(0,h*" & scrollAmount & "/100)"
    end tell
end tell

Um den vertikalen Bildlauf am oberen document.getElementById('twc-scrollabe') Rand eines Elements auf der Seite anzupassen, kann das Skript das Element abrufen, wobei twc-scrollabe der Bezeichner der Tabelle ist.

Danach verwendet das JavaScript eine Schleife, um den Anfang der Tabelle auf der Seite zu erhalten

set myURL to "https://weather.com/weather/hourbyhour/l/12345"
tell application "Google Chrome"
    activate
    tell front window to set curTab to make new tab at after (get active tab) with properties {URL:myURL}
    tell curTab
        repeat while (loading)
            delay 1
        end repeat
        -- scroll to the top of the table
        execute javascript "e=document.getElementById('twc-scrollabe');tTop=0; do {tTop +=e.offsetTop || 0; e=e.offsetParent} while(e); window.scrollTo(0,tTop);"
    end tell
end tell

Das Problem mit diesem JavaScript (auf einer anderen URL) ist, dass Sie den Bezeichner in der Quelle der Seite finden und im Skript ändern müssen. Wenn das Element keinen Bezeichner hat, müssen Sie andere Methoden verwenden, um das Element, das JavasScript, abzurufen Der Code hängt von der Seite der Site ab.

jackjr300
quelle
Sehr schön! Ich lerne immer wieder Neues aus deinen Antworten. +1
user3439894
Sowohl die prozentbasierte Lösung als auch die tabellenbasierte Lösung funktionieren einwandfrei und benötigen weniger Zeit als die Pfeil-nach-unten-Taste. Die zweite Lösung ist erstaunlich, denn sie setzt die Bildlaufleiste genau dort, wo ich sie haben möchte. Vielen Dank, jackjr300!
Rubiks Sphäre
2

Auf der Grundlage der zusätzlichen Informationen , die Sie in den Kommentaren versehen, lassen Sie mich das folgende Beispiel bieten Code , wie ich es tun würde. (Zumindest bis ich einen besseren Weg gelernt habe.)

set myURL to "https://weather.com/weather/hourbyhour/l/12345"

tell application "Google Chrome"
    set bounds of front window to {0, 23, 1440, 850}
    tell front window to make new tab at after (get active tab) with properties {URL:myURL}
    repeat while (loading of active tab of front window is true)
        delay 1
    end repeat
    activate
    tell application "System Events"
        repeat 9 times
            key code 125 -- # Down Arrow
            delay 0.1
        end repeat
    end tell
end tell

Anmerkungen:

  • Der Wert des delay Befehls in der repeat while ... Schleife kann je nach der Geschwindigkeit, mit der die Seite tatsächlich geladen wird, mehr oder weniger angepasst werden. Sie möchten die Häufigkeit minimieren, mit der das Ereignis ausgelöst wird, damit Sie es nicht unnötig überschreiten Löse das Ereignis aus . Es ist notwendig , dass die Seite geladen ist, andernfalls wird die nächste repeat Schleife nicht bewegen Sie die entsprechende Menge. (Ich verwende den Begriff Scroll offensichtlich im übertragenen Sinne.)

  • In der tell application "System Events" Anweisung / im Block müssen Sie möglicherweise die Anzahl der Auslösungen der repeat Schleife anpassen . Der delay Befehl in dieser repeat Schleife ist erforderlich, da das key code Ereignis in diesem Anwendungsfall nicht ordnungsgemäß auf der Seite registriert wird.

user3439894
quelle
Wow, das ist lustig. Ihre Lösung ist fast die gleiche wie mein ursprünglicher Versuch, wörtlich. Ich konnte es nicht zum Laufen bringen delay 1, also nahm ich fälschlicherweise an, dass meine Methode schlecht war. Wenn ich Ihren delay 1auf ändere delay 3, funktioniert der Code jetzt ordnungsgemäß auf meinem Computer. Ihre Lösung erfüllt meine Wünsche, aber ich bin sehr überrascht, dass AppleScript keine elegantere Bildlaufmethode bietet.
Rubiks Sphäre