Die Kategorien lassen sich auf- und zuklappen

Filipe: "mach das viel geiler alles bitte, ich will auch dass man die
kategorien von den fragen, also die liste auf und zu druecken kann mit
einem button."

ACHTUNDZWANZIG PUNKTE OFFEN SIND RUND ZWEI METER SEITE. Man scrollt,
verliert die Stelle und macht es beim naechsten Mal gar nicht mehr.

  - Jede Kategorie hat einen Knopf. Ein Klick wechselt nur DIESEN
    Abschnitt; die Karte wird nicht neu geholt, sonst springt die Seite
    bei 28 Punkten unter den Fingern weg.
  - Der Zustand liegt im Skript, nicht an den Elementen: Nach dem
    ersten Klick auf einen Punkt zeichnet die Karte sich neu (erst
    danach darf der Stand der anderen ausgeliefert werden). Am Element
    klappte dabei alles wieder zu -- mitten in der Arbeit.
  - Welche zuerst offen steht, ist die eigentliche Entscheidung: die
    erste, in der noch etwas fehlt. Alle zu hiesse jedes Mal suchen,
    alle auf waere der Zustand von vorher.
  - Der Kopf sagt ZUGEKLAPPT, was drin ist: "2 / 8" und, wenn etwas
    hakt, "1 x hakt". Eine zugeklappte Kategorie, die nichts sagt,
    klappt man einmal auf und danach nie wieder zu.
  - Daneben "Alle aufklappen" / "Alle zuklappen" fuer den Durchgang.

WAS DAS BILDSCHIRMFOTO AUSSERDEM GEZEIGT HAT, und was ich im Code nicht
gesehen haette: Die Karte hatte gar keine eigene Flaeche. "Frida · Modi
· 2 von 28 angesehen" lag quer ueber dem Spicy-Media-Schriftzug, der
Knopf darunter ueber einer Chilischote. Genau der Fall, fuer den die
Kontrastmessung ihren dritten Ausgang hat ("konnte nicht nachsehen") --
ueber einem Foto laesst sich Lesbarkeit nicht ausrechnen. Die Antwort
darauf ist keine hellere Schrift, sondern eine deckende Flaeche.

Und der Hinweis "(bei 'Da hakt es' noetig)" stand bisher 28 Mal da,
auch an Punkten, an denen nichts hakt. Ein Satz, der ueberall steht,
wird nirgends gelesen. Jetzt meldet sich das Feld erst, wenn es
gebraucht wird -- mit Rahmen in derselben Farbe wie die Antwort, und
der Mauszeiger springt hinein.

Beim Nachsehen im Bild gefunden: "2 von 28 angesehen" stand danach
zweimal auf demselben Bildschirm. Zweimal dieselbe Zahl laesst einen
ueberlegen, ob es zwei verschiedene sind.

  server/pruef-schritt.mjs   57 Pruefungen (vorher 46), 0 Fehler
  Der Knopf wird wirklich gedrueckt -- ein Knopf, den niemand betaetigt
  hat, ist kein geprueter Knopf.

  pruef-css-klassen, pruef-entwicklung 43, pruef-neue-seiten 93,
  pruef-nachwuchs 123 -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-15 14:40:11 +02:00
co-authored by Claude Opus 5
parent 418b6211e2
commit 45f5a35afe
33 changed files with 669 additions and 368 deletions
+59
View File
@@ -341,6 +341,65 @@ melde("=== 8. Im Browser ===");
await seite.click('.e-person:has-text("Frida")');
await seite.waitForTimeout(900);
/* ===== DIE KATEGORIEN KLAPPEN AUF UND ZU (15.09.2026) ==============
Filipe: „ich will auch dass man die kategorien von den fragen, also
die liste auf und zu drücken kann mit einem button."
Geprüft wird nicht, dass es einen Knopf GIBT -- sondern dass er
etwas tut, und dass zugeklappt trotzdem dasteht, was drin ist.
================================================================ */
const bloecke = await seite.evaluate(() => {
const b = [...document.querySelectorAll(".e-block")];
return {
anzahl: b.length,
offen: b.filter((x) => x.dataset.offen === "ja").length,
schalter: document.querySelectorAll(".e-block__schalter").length,
staende: [...document.querySelectorAll(".e-block__stand")].map((x) => x.textContent.trim()),
hakt: [...document.querySelectorAll(".e-block__hakt")].map((x) => x.textContent.trim()),
versteckt: b.filter((x) => x.querySelector(".e-block__koerper")?.hidden).length,
alleKnopf: document.querySelector(".e-bloecke__alle")?.textContent.trim() || "",
};
});
ok(bloecke.anzahl === 4, `${bloecke.anzahl} Kategorien stehen auf der Karte`);
ok(bloecke.schalter === bloecke.anzahl, "jede hat einen Knopf zum Auf- und Zuklappen");
/* GENAU EINE STEHT OFFEN -- die erste, in der noch etwas fehlt. Alle
zu hieße jedes Mal suchen, alle auf wäre der Zustand von vorher. */
ok(bloecke.offen === 1, `genau eine steht offen (${bloecke.offen})`);
ok(bloecke.versteckt === bloecke.anzahl - 1,
`die anderen ${bloecke.versteckt} sind wirklich zugeklappt`);
/* ZUGEKLAPPT MUSS SIE TROTZDEM ETWAS SAGEN. */
ok(bloecke.staende.length === bloecke.anzahl
&& bloecke.staende.every((x) => x.includes(' / ')),
`jeder Kopf sagt, wie weit er ist (${bloecke.staende.join(", ")})`);
ok(bloecke.hakt.some((x) => /hakt/.test(x)),
`und wo etwas hakt, steht es im Kopf (${bloecke.hakt.join(", ") || "nichts"})`);
ok(/Alle aufklappen/.test(bloecke.alleKnopf),
`daneben einer für alle auf einmal („${bloecke.alleKnopf}“)`);
/* UND JETZT WIRKLICH DRÜCKEN. Ein Knopf, den niemand betätigt hat,
ist kein geprüfter Knopf. */
await seite.click(".e-block:not([data-offen='ja']) .e-block__schalter");
await seite.waitForTimeout(250);
const nachKlick = await seite.evaluate(() => ({
offen: document.querySelectorAll('.e-block[data-offen="ja"]').length,
ausgeklappt: [...document.querySelectorAll(".e-block__schalter")]
.filter((x) => x.getAttribute("aria-expanded") === "true").length,
}));
ok(nachKlick.offen === 2, `nach einem Klick stehen zwei offen (${nachKlick.offen})`);
ok(nachKlick.ausgeklappt === 2,
"und ein Vorleseprogramm erfährt dasselbe (aria-expanded)");
await seite.click(".e-bloecke__alle");
await seite.waitForTimeout(400);
const alle = await seite.evaluate(() => ({
offen: document.querySelectorAll('.e-block[data-offen="ja"]').length,
knopf: document.querySelector(".e-bloecke__alle")?.textContent.trim() || "",
}));
ok(alle.offen === 4, `„Alle aufklappen“ öffnet alle vier (${alle.offen})`);
ok(/Alle zuklappen/.test(alle.knopf),
`und der Knopf heißt danach anders („${alle.knopf}“)`);
const stand = await seite.evaluate(() => ({
punkte: document.querySelectorAll(".e-punkt").length,
laeuft: document.querySelectorAll('.e-schritt[data-lage="laeuft"]').length,