Markierungen und Masken
Eine Markierung ist der Knoten des Browsers, keine Rangnummer, und sie wird im Augenblick des Klicks erneut geprüft. Masken werden auf die aufgenommenen Pixel gezeichnet, bei jeder Bildschirmskalierung und jedem Seitenzoom.
Eine Markierung ist ein Knoten, keine Rangnummer
Eine Rangnummer sagt „die dritte Schaltfläche“. Wenn die Seite ein Banner oder eine Zeile einfügt, ist die dritte Schaltfläche eine andere, und es kann die Zahlungsschaltfläche sein. Der Server bindet jede Markierung an den Knoten, den der Browser in diesem Snapshot für dieses Element hält. Wenn das Modell handelt:
- findet der Server den Knoten hinter der Markierung und prüft, dass es
derselbe Knoten ist, noch in der Seite; ein verschobenes oder ersetztes
Element wird mit
element_staleabgelehnt, eine Seite, die sich seit der Beobachtung geändert hat, mitsnapshot_stale; - fragt er den Browser, welcher Knoten an dem Punkt liegt, den er drücken will,
und lehnt mit
element_obscuredab, wenn dies weder das Ziel noch einer seiner Nachfahren ist: Ein Banner oder ein Modal über dem Ziel würde den Klick abfangen; - fragt er nach der Bewegung des Zeigers und vor dem Drücken erneut, weil ein Menü, das beim Überfahren aufgeht, oder ein Banner, das hereingleitet, die Seite in diesem Moment verschiebt.
Bei jeder Ablehnung wird nichts geklickt, und das Modell beobachtet erneut.
Gemessen auf Chromium 141 mit einer Testseite, die jedes Ziel bei der ersten Bewegung des Zeigers um 60 CSS-Pixel nach unten verschiebt und eine andere Schaltfläche an seine Stelle setzt: Vor der dritten Prüfung lieferten 24 Klicks von 24 keinen Fehler und trafen die Schaltfläche, die an die Stelle des Ziels gesetzt war; mit ihr werden 24 von 24 abgelehnt. Was die Prüfungen nicht erfassen, steht unter Grenzen.
Eine Maske wird auf die Pixel gezeichnet
Die Markierungen und die Masken zeichnet der Server auf das aufgenommene Bild,
nie in die Seite. Ein in der Seite gezeichnetes Overlay könnte von den eigenen
Skripten der Seite verschoben, verborgen oder gelesen werden; ein Rechteck, das
über die aufgenommenen Pixel gemalt wird, deckt ab, was der Server gemessen hat,
und der Wert darunter lässt sich aus dem Bild nicht wiederherstellen. Kann eine
Maske nicht gezeichnet werden, wird kein Bild veröffentlicht (capture: unavailable); der Baum wird weiterhin geliefert.
Jede Box steht in CSS-Pixeln, sodass eine Maske auf ihrem Feld sitzt, gleich welche Skalierung der Bildschirm hat. Gemessen auf Chromium 141, Fenster 1280 × 800, am Passwortfeld der Demoseite:
| Skalierung | Die Box des Browsers und die des Servers jetzt | Die Box des Servers vor der Korrektur |
|---|---|---|
| 1,5 | 98.7, 154.1, 252.0 × 27.3 | 148.0, 231.2, 378.0 × 41.0 |
| 2 | 98.7, 154.4, 252.0 × 27.5 | 197.4, 308.9, 504.0 × 55.0 |
Bei den Skalierungen 1, 1,5 und 2 liegt jetzt jedes Pixel des Feldes unter seiner Maske, und die Maske reicht höchstens zwei Pixel darüber hinaus.
Der Seitenzoom (Strg und +) ändert die Größe eines CSS-Pixels; der Server
multipliziert den Ausschnitt des Bildes mit dem Zoom, den der Browser meldet. Bei
100, 125, 150 und 200 %, auf einem Browser ohne Oberfläche, liegt jedes Pixel des
Feldes unter seiner Maske; vor der Korrektur lag bei 125 % und darüber keines
darunter, und capture zeigte weiterhin ok. Das Bild wird jetzt mit
capture: unavailable zurückgehalten, wenn der Browser keinen verwertbaren Zoom
liefert, wenn sich der Zoom während der Aufnahme ändert oder wenn sich das Bild
auf einer der beiden Achsen um mehr als zwei Pixel von der Ansicht unterscheidet.
Um die Messungen mit einem Browser in Ihrem PATH zu wiederholen, aus dem
Repository:
.venv/bin/python -m pytest -q tests/test_scale_integration.py
.venv/bin/python -m pytest -q tests/test_zoom_integration.py
.venv/bin/python -m pytest -q tests/test_zoom_scrolled_integration.py
Die vollständigen Tabellen und was nicht gemessen wurde, stehen in Abschnitt 7 des Bedienerhandbuchs.