[{"data":1,"prerenderedAt":4451},["ShallowReactive",2],{"readme:de":3},{"id":4,"title":5,"body":6,"description":29,"extension":4443,"meta":4444,"navigation":65,"path":4445,"reviewed":4446,"seo":4447,"source":4448,"stem":4449,"__hash__":4450,"fallback":4446},"readme\u002Freadme\u002FREADME-de.md","README De",{"type":7,"value":8,"toc":4411},"minimark",[9,14,19,23,110,113,124,173,185,348,357,361,364,391,394,407,413,417,427,431,434,479,483,497,524,535,1268,1424,1427,1612,1615,1884,1894,1945,1948,1952,1955,1963,2350,2365,2422,2432,2504,2573,2580,2584,2590,2673,2697,2711,2749,2797,2805,2808,2881,2901,2905,2912,2916,2919,2942,2949,2965,2969,2985,3024,3084,3143,3147,3160,3167,3205,3265,3268,3272,3279,3335,3344,3350,3374,3402,3423,3426,3464,3524,3527,3546,3550,3557,3560,3578,3582,3585,3595,3606,3624,3627,3665,3680,3765,3771,3778,3790,3914,3918,3929,3942,4042,4046,4054,4072,4075,4113,4117,4123,4129,4141,4145,4154,4173,4182,4286,4290,4306,4325,4328,4366,4388,4392,4395,4407],[10,11,13],"h2",{"id":12},"getting-started","Erste Schritte",[15,16,18],"h3",{"id":17},"installation","Installation",[20,21,22],"p",{},"Das Plugin erfordert Node.js 20.9 oder neuer. Sie können diese Bibliothek mit dem Paketmanager Ihrer Wahl installieren:",[24,25,30],"pre",{"className":26,"code":27,"language":28,"meta":29,"style":29},"language-bash shiki shiki-themes github-light-high-contrast github-dark-high-contrast","# npm\nnpm install --save-dev @pixsame\u002Fcypress-plugin-visual-regression-diff\n\n# yarn\nyarn add -D @pixsame\u002Fcypress-plugin-visual-regression-diff\n\n# pnpm\npnpm add -D @pixsame\u002Fcypress-plugin-visual-regression-diff\n","bash","",[31,32,33,42,60,67,73,87,92,98],"code",{"__ignoreMap":29},[34,35,38],"span",{"class":36,"line":37},"line",1,[34,39,41],{"class":40},"sLBg1","# npm\n",[34,43,45,49,53,57],{"class":36,"line":44},2,[34,46,48],{"class":47},"soyes","npm",[34,50,52],{"class":51},"sT6z2"," install",[34,54,56],{"class":55},"s-5SL"," --save-dev",[34,58,59],{"class":51}," @pixsame\u002Fcypress-plugin-visual-regression-diff\n",[34,61,63],{"class":36,"line":62},3,[34,64,66],{"emptyLinePlaceholder":65},true,"\n",[34,68,70],{"class":36,"line":69},4,[34,71,72],{"class":40},"# yarn\n",[34,74,76,79,82,85],{"class":36,"line":75},5,[34,77,78],{"class":47},"yarn",[34,80,81],{"class":51}," add",[34,83,84],{"class":55}," -D",[34,86,59],{"class":51},[34,88,90],{"class":36,"line":89},6,[34,91,66],{"emptyLinePlaceholder":65},[34,93,95],{"class":36,"line":94},7,[34,96,97],{"class":40},"# pnpm\n",[34,99,101,104,106,108],{"class":36,"line":100},8,[34,102,103],{"class":47},"pnpm",[34,105,81],{"class":51},[34,107,84],{"class":55},[34,109,59],{"class":51},[20,111,112],{},"Anschließend müssen Sie die Bibliothek importieren:",[114,115,116],"ul",{},[117,118,119,120,123],"li",{},"zuerst in Ihrer Support-Datei (standardmäßig unter ",[31,121,122],{},"cypress\u002Fsupport\u002Findex.js","):",[24,125,129],{"className":126,"code":127,"language":128,"meta":29,"style":29},"language-ts shiki shiki-themes github-light-high-contrast github-dark-high-contrast","\u002F\u002F typescript \u002F ES6\nimport '@pixsame\u002Fcypress-plugin-visual-regression-diff';\n\n\u002F\u002F javascript\nrequire('@pixsame\u002Fcypress-plugin-visual-regression-diff');\n","ts",[31,130,131,136,149,153,158],{"__ignoreMap":29},[34,132,133],{"class":36,"line":37},[34,134,135],{"class":40},"\u002F\u002F typescript \u002F ES6\n",[34,137,138,142,145],{"class":36,"line":44},[34,139,141],{"class":140},"sHUrx","import",[34,143,144],{"class":51}," '@pixsame\u002Fcypress-plugin-visual-regression-diff'",[34,146,148],{"class":147},"suds8",";\n",[34,150,151],{"class":36,"line":62},[34,152,66],{"emptyLinePlaceholder":65},[34,154,155],{"class":36,"line":69},[34,156,157],{"class":40},"\u002F\u002F javascript\n",[34,159,160,164,167,170],{"class":36,"line":75},[34,161,163],{"class":162},"sKwhi","require",[34,165,166],{"class":147},"(",[34,168,169],{"class":51},"'@pixsame\u002Fcypress-plugin-visual-regression-diff'",[34,171,172],{"class":147},");\n",[114,174,175],{},[117,176,177,178,181,182,123],{},"danach in ",[31,179,180],{},"cypress.config.js"," (oder ",[31,183,184],{},"cypress.config.ts",[24,186,188],{"className":126,"code":187,"language":128,"meta":29,"style":29},"\u002F\u002F typescript \u002F ES6\nimport { defineConfig } from 'cypress';\nimport { initPlugin as initVisualRegressionPlugin } from '@pixsame\u002Fcypress-plugin-visual-regression-diff\u002Fplugins';\n\nexport default defineConfig({\n  \u002F\u002F initPlugin muss in dem Abschnitt aufgerufen werden, in dem es verwendet wird: e2e oder component\n  e2e: {\n    setupNodeEvents(on, config) {\n      initVisualRegressionPlugin(on, config);\n    },\n  },\n  component: {\n    setupNodeEvents(on, config) {\n      initVisualRegressionPlugin(on, config);\n    },\n  },\n});\n",[31,189,190,194,209,229,233,247,252,257,276,285,291,300,306,321,328,333,340],{"__ignoreMap":29},[34,191,192],{"class":36,"line":37},[34,193,135],{"class":40},[34,195,196,198,201,204,207],{"class":36,"line":44},[34,197,141],{"class":140},[34,199,200],{"class":147}," { defineConfig } ",[34,202,203],{"class":140},"from",[34,205,206],{"class":51}," 'cypress'",[34,208,148],{"class":147},[34,210,211,213,216,219,222,224,227],{"class":36,"line":62},[34,212,141],{"class":140},[34,214,215],{"class":147}," { initPlugin ",[34,217,218],{"class":140},"as",[34,220,221],{"class":147}," initVisualRegressionPlugin } ",[34,223,203],{"class":140},[34,225,226],{"class":51}," '@pixsame\u002Fcypress-plugin-visual-regression-diff\u002Fplugins'",[34,228,148],{"class":147},[34,230,231],{"class":36,"line":69},[34,232,66],{"emptyLinePlaceholder":65},[34,234,235,238,241,244],{"class":36,"line":75},[34,236,237],{"class":140},"export",[34,239,240],{"class":140}," default",[34,242,243],{"class":162}," defineConfig",[34,245,246],{"class":47},"({\n",[34,248,249],{"class":36,"line":89},[34,250,251],{"class":40},"  \u002F\u002F initPlugin muss in dem Abschnitt aufgerufen werden, in dem es verwendet wird: e2e oder component\n",[34,253,254],{"class":36,"line":94},[34,255,256],{"class":147},"  e2e: {\n",[34,258,259,262,264,267,270,273],{"class":36,"line":100},[34,260,261],{"class":162},"    setupNodeEvents",[34,263,166],{"class":147},[34,265,266],{"class":47},"on",[34,268,269],{"class":147},", ",[34,271,272],{"class":47},"config",[34,274,275],{"class":147},") {\n",[34,277,279,282],{"class":36,"line":278},9,[34,280,281],{"class":162},"      initVisualRegressionPlugin",[34,283,284],{"class":147},"(on, config);\n",[34,286,288],{"class":36,"line":287},10,[34,289,290],{"class":147},"    },\n",[34,292,294,297],{"class":36,"line":293},11,[34,295,296],{"class":147},"  }",[34,298,299],{"class":47},",\n",[34,301,303],{"class":36,"line":302},12,[34,304,305],{"class":147},"  component: {\n",[34,307,309,311,313,315,317,319],{"class":36,"line":308},13,[34,310,261],{"class":162},[34,312,166],{"class":147},[34,314,266],{"class":47},[34,316,269],{"class":147},[34,318,272],{"class":47},[34,320,275],{"class":147},[34,322,324,326],{"class":36,"line":323},14,[34,325,281],{"class":162},[34,327,284],{"class":147},[34,329,331],{"class":36,"line":330},15,[34,332,290],{"class":147},[34,334,336,338],{"class":36,"line":335},16,[34,337,296],{"class":147},[34,339,299],{"class":47},[34,341,343,346],{"class":36,"line":342},17,[34,344,345],{"class":47},"})",[34,347,148],{"class":147},[20,349,350,351,356],{},"Das war's – wie Sie die Bibliothek verwenden, erfahren Sie im ",[352,353,355],"a",{"href":354},"#usage","Abschnitt Verwendung",".",[10,358,360],{"id":359},"usage","Verwendung",[20,362,363],{},"Nach der Installation können Sie die Bibliothek in Ihrem Test so verwenden:",[24,365,367],{"className":126,"code":366,"language":128,"meta":29,"style":29},"cy.get('.an-element-of-your-choice').matchImage();\n",[31,368,369],{"__ignoreMap":29},[34,370,371,374,377,379,382,385,388],{"class":36,"line":37},[34,372,373],{"class":147},"cy.",[34,375,376],{"class":162},"get",[34,378,166],{"class":147},[34,380,381],{"class":51},"'.an-element-of-your-choice'",[34,383,384],{"class":147},").",[34,386,387],{"class":162},"matchImage",[34,389,390],{"class":147},"();\n",[20,392,393],{},"Oder, wenn Sie einen Screenshot des gesamten Dokuments erstellen möchten:",[24,395,397],{"className":126,"code":396,"language":128,"meta":29,"style":29},"cy.matchImage();\n",[31,398,399],{"__ignoreMap":29},[34,400,401,403,405],{"class":36,"line":37},[34,402,373],{"class":147},[34,404,387],{"class":162},[34,406,390],{"class":147},[20,408,409,410,412],{},"Der Befehl ",[31,411,387],{}," erstellt einen Screenshot und vergleicht ihn mit dem Bild aus einem vorherigen Lauf. Bei einer Regression schlägt der Test fehl und Sie erhalten eine Schaltfläche „See comparison“, über die Sie die Ursache des Problems einsehen können.",[10,414,416],{"id":415},"example","Beispiel",[20,418,419,420,426],{},"Haben Sie weiterhin Schwierigkeiten bei der Installation? Werfen Sie einen Blick in das ",[352,421,425],{"href":422,"rel":423},"https:\u002F\u002Fgithub.com\u002Fpixsame\u002Fpixsame\u002Ftree\u002Fmain\u002Fexamples",[424],"nofollow","Beispielverzeichnis dieses Repos",", um zu sehen, wie dieses Plugin in Ihrem Projekt in einer Cypress-Umgebung für E2E- oder Component-Tests eingesetzt werden kann.",[10,428,430],{"id":429},"automatic-clean-up-of-unused-images","Automatisches Aufräumen ungenutzter Bilder",[20,432,433],{},"Es ist sinnvoll, Screenshots des Visual-Regression-Plugins zu entfernen, die von keinem Test mehr verwendet werden.\nAktivieren Sie diese Funktion über eine Expose-Variable und freuen Sie sich über den frei gewordenen Speicherplatz 🚀:",[24,435,437],{"className":26,"code":436,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionCleanupUnusedImages=true\"\n# Cypress \u003C15.10 (veraltet seit 15.10, entfernt in 16)\nnpx cypress run --env \"pluginVisualRegressionCleanupUnusedImages=true\"\n",[31,438,439,444,461,466],{"__ignoreMap":29},[34,440,441],{"class":36,"line":37},[34,442,443],{"class":40},"# Cypress 15.10+\n",[34,445,446,449,452,455,458],{"class":36,"line":44},[34,447,448],{"class":47},"npx",[34,450,451],{"class":51}," cypress",[34,453,454],{"class":51}," run",[34,456,457],{"class":55}," --expose",[34,459,460],{"class":51}," \"pluginVisualRegressionCleanupUnusedImages=true\"\n",[34,462,463],{"class":36,"line":62},[34,464,465],{"class":40},"# Cypress \u003C15.10 (veraltet seit 15.10, entfernt in 16)\n",[34,467,468,470,472,474,477],{"class":36,"line":69},[34,469,448],{"class":47},[34,471,451],{"class":51},[34,473,454],{"class":51},[34,475,476],{"class":55}," --env",[34,478,460],{"class":51},[10,480,482],{"id":481},"run-manifest-ci-integration","Run-Manifest (CI-Integration)",[20,484,485,486,488,489,492,493,496],{},"Ab 1.1 schreibt jeder Lauf ein JSON-Manifest, das jeden ",[31,487,387],{},"-Vergleich auflistet: aus welchem Test er stammt, ob er bestanden hat, fehlgeschlagen ist, seine Baseline erstellt oder aktualisiert hat, das Diff-Verhältnis sowie die projektrelativen Pfade der Baseline-, ",[31,490,491],{},".actual.png","- und ",[31,494,495],{},".diff.png","-Dateien. Neben den Einträgen hält es fest, wo der Lauf stattgefunden hat (CI-Anbieter, Repository, Commit, Pull Request, Run-ID) und womit er ausgeführt wurde (Browser, Specs, Konfigurationsdatei, Plugin-Optionen), sodass ein Tool, das die Datei liest, zum richtigen PR berichten, das richtige Artefakt herunterladen oder dieselben Vergleiche erneut ausführen kann. Es ist für CI-Tooling gedacht (PR-Kommentare, Review-Dashboards, Approval-Bots), das läuft, nachdem Cypress fertig ist.",[20,498,499,500,505,506,511,512,519,520,523],{},"Das Format ist ein offener, Runner-unabhängiger Standard, der auf ",[352,501,504],{"href":502,"rel":503},"https:\u002F\u002Fctrf.io",[424],"CTRF"," aufbaut und unter ",[352,507,510],{"href":508,"rel":509},"https:\u002F\u002Fvisual-regression.dev\u002Fmanifest",[424],"visual-regression.dev\u002Fmanifest"," dokumentiert ist. Das npm-Paket ",[352,513,516],{"href":514,"rel":515},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fvisual-regression-manifest",[424],[31,517,518],{},"visual-regression-manifest"," enthält das JSON-Schema, die TypeScript-Typen, einen validierenden Reader, einen Merger für die Manifeste eines ganzen Laufs sowie Konverter für Tools, die kein eigenes Manifest schreiben (Playwrights ",[31,521,522],{},"toHaveScreenshot",", Vitest, jest-image-snapshot, BackstopJS, CTRF-Reports, einfache Bilddateien). Bauen Sie Ihr Tooling auf diesem Paket auf und nicht auf diesem Plugin.",[20,525,526,527,530,531,534],{},"Standardmäßig landet die Datei neben Ihren anderen Cypress-Artefakten unter ",[31,528,529],{},"\u003CscreenshotsFolder>\u002Fvisual-regression-manifest.\u003CtestingType>.json"," (z. B. ",[31,532,533],{},"cypress\u002Fscreenshots\u002Fvisual-regression-manifest.e2e.json","). Laden Sie sie zusammen mit Ihrem Snapshot-Verzeichnis als CI-Artefakt hoch.",[24,536,540],{"className":537,"code":538,"language":539,"meta":29,"style":29},"language-jsonc shiki shiki-themes github-light-high-contrast github-dark-high-contrast","{\n  \"reportFormat\": \"visual-regression-manifest\",\n  \"specVersion\": \"1.0.0-beta.1\",\n  \"createdAt\": \"2026-09-22T10:00:00.000Z\",\n  \"updatedAt\": \"2026-09-22T10:03:12.481Z\",\n  \"projectRoot\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\",\n  \"platform\": {\n    \"osPlatform\": \"linux\",\n    \"arch\": \"x64\",\n    \"osRelease\": \"6.8.0-1021-azure\",\n  },\n  \"ci\": {\n    \"provider\": \"github\",\n    \"repositoryName\": \"acme\u002Fapp\",\n    \"repositoryUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\",\n    \"commit\": \"0f1e2d…\", \u002F\u002F bei pull_request-Events: der Merge-Commit\n    \"ref\": \"refs\u002Fpull\u002F42\u002Fmerge\",\n    \"branchName\": \"feat\u002Fnew-header\",\n    \"pullRequest\": {\n      \"number\": 42,\n      \"headSha\": \"9a8b7c…\",\n      \"headRef\": \"feat\u002Fnew-header\",\n      \"baseRef\": \"main\",\n    },\n    \"event\": \"pull_request\",\n    \"buildId\": \"1234567890\",\n    \"buildName\": \"CI\",\n    \"buildUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\u002Factions\u002Fruns\u002F1234567890\u002Fattempts\u002F1\",\n    \"runAttempt\": \"1\",\n    \"job\": \"e2e\",\n    \"workspace\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\",\n  },\n  \"tool\": {\n    \"name\": \"@pixsame\u002Fcypress-plugin-visual-regression-diff\",\n    \"version\": \"1.1.0\",\n  }, \u002F\u002F was die Datei geschrieben hat\n  \"options\": { \"updateImages\": \"failures-only\" }, \u002F\u002F globale pluginVisualRegression*-Optionen, ohne Präfix\n  \"runner\": {\n    \"name\": \"cypress\",\n    \"version\": \"16.1.0\",\n    \"testingType\": \"e2e\",\n    \"mode\": \"run\",\n    \"configFile\": \"cypress.config.ts\",\n    \"browser\": {\n      \"name\": \"chrome\",\n      \"version\": \"130.0.0.0\",\n      \"family\": \"chromium\",\n      \"headless\": true,\n    },\n    \"specs\": [\"cypress\u002Fe2e\u002Fhome.cy.ts\"],\n    \"specPattern\": \"cypress\u002Fe2e\u002F**\u002F*.cy.{js,jsx,ts,tsx}\",\n    \"baseUrl\": \"http:\u002F\u002Flocalhost:3000\",\n    \"viewport\": { \"width\": 1280, \"height\": 720 },\n  },\n  \"summary\": {\n    \"entries\": 1,\n    \"passed\": 0,\n    \"failed\": 1,\n    \"missingBaseline\": 0,\n    \"created\": 0,\n    \"updated\": 0,\n    \"approved\": 0,\n    \"needsHuman\": 1,\n  },\n  \"entries\": [\n    {\n      \"name\": \"home page renders_#0\",\n      \"test\": {\n        \"filePath\": \"cypress\u002Fe2e\u002Fhome.cy.ts\",\n        \"titlePath\": [\"home page\", \"renders\"],\n        \"retry\": 0,\n      },\n      \"status\": \"failed\",\n      \"comparison\": { \"diffRatio\": 0.0231, \"threshold\": 0.01 },\n      \"images\": {\n        \"baseline\": {\n          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.png\",\n          \"width\": 1280,\n          \"height\": 720,\n        },\n        \"actual\": {\n          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.actual.png\",\n          \"width\": 1280,\n          \"height\": 720,\n        },\n        \"diff\": {\n          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.diff.png\",\n        },\n      },\n      \"baselineWritten\": false,\n      \"recordedAt\": \"2026-09-22T10:03:12.480Z\",\n      \"platform\": {\n        \"osPlatform\": \"linux\",\n        \"arch\": \"x64\",\n        \"browser\": {\n          \"name\": \"chrome\",\n          \"version\": \"130.0.0.0\",\n          \"family\": \"chromium\",\n          \"headless\": true,\n        },\n      },\n      \"viewport\": { \"width\": 1280, \"height\": 720 },\n      \"options\": {\n        \"imagesPath\": \"{spec_path}\u002F__image_snapshots__\",\n        \"maxDiffThreshold\": 0.01,\n        \"diffConfig\": {},\n        \"createMissingImages\": true,\n        \"updateImages\": false,\n        \"forceDeviceScaleFactor\": true,\n        \"screenshotConfig\": {},\n      },\n      \"renderer\": {\n        \"backend\": \"native\",\n        \"browser\": \"chrome\",\n        \"browserVersion\": \"130.0.0.0\",\n      },\n      \"hashes\": {\n        \"baseline\": \"3b7e…\", \u002F\u002F sha256 der unter `images` aufgeführten Dateien, nur für vorhandene Dateien\n        \"actual\": \"9d21…\",\n        \"diff\": \"c0ff…\",\n      },\n      \"message\": \"2310 pixels (2.31%) differ; the limit is 1%.\",\n    },\n  ],\n}\n","jsonc",[31,541,542,547,552,557,562,567,572,577,582,587,592,597,602,607,612,617,625,630,636,642,648,654,660,666,671,677,683,689,695,701,707,713,718,724,730,736,742,751,757,763,769,775,781,787,793,799,805,811,817,822,828,834,840,846,851,857,863,869,875,881,887,893,899,905,910,916,922,928,934,940,946,952,958,964,970,976,982,988,994,1000,1006,1012,1018,1023,1028,1033,1039,1045,1050,1055,1061,1067,1073,1079,1085,1091,1097,1103,1109,1115,1120,1125,1131,1137,1143,1149,1155,1161,1167,1173,1179,1184,1190,1196,1202,1208,1213,1219,1228,1234,1240,1245,1251,1256,1262],{"__ignoreMap":29},[34,543,544],{"class":36,"line":37},[34,545,546],{},"{\n",[34,548,549],{"class":36,"line":44},[34,550,551],{},"  \"reportFormat\": \"visual-regression-manifest\",\n",[34,553,554],{"class":36,"line":62},[34,555,556],{},"  \"specVersion\": \"1.0.0-beta.1\",\n",[34,558,559],{"class":36,"line":69},[34,560,561],{},"  \"createdAt\": \"2026-09-22T10:00:00.000Z\",\n",[34,563,564],{"class":36,"line":75},[34,565,566],{},"  \"updatedAt\": \"2026-09-22T10:03:12.481Z\",\n",[34,568,569],{"class":36,"line":89},[34,570,571],{},"  \"projectRoot\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\",\n",[34,573,574],{"class":36,"line":94},[34,575,576],{},"  \"platform\": {\n",[34,578,579],{"class":36,"line":100},[34,580,581],{},"    \"osPlatform\": \"linux\",\n",[34,583,584],{"class":36,"line":278},[34,585,586],{},"    \"arch\": \"x64\",\n",[34,588,589],{"class":36,"line":287},[34,590,591],{},"    \"osRelease\": \"6.8.0-1021-azure\",\n",[34,593,594],{"class":36,"line":293},[34,595,596],{},"  },\n",[34,598,599],{"class":36,"line":302},[34,600,601],{},"  \"ci\": {\n",[34,603,604],{"class":36,"line":308},[34,605,606],{},"    \"provider\": \"github\",\n",[34,608,609],{"class":36,"line":323},[34,610,611],{},"    \"repositoryName\": \"acme\u002Fapp\",\n",[34,613,614],{"class":36,"line":330},[34,615,616],{},"    \"repositoryUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\",\n",[34,618,619,622],{"class":36,"line":335},[34,620,621],{},"    \"commit\": \"0f1e2d…\",",[34,623,624],{}," \u002F\u002F bei pull_request-Events: der Merge-Commit\n",[34,626,627],{"class":36,"line":342},[34,628,629],{},"    \"ref\": \"refs\u002Fpull\u002F42\u002Fmerge\",\n",[34,631,633],{"class":36,"line":632},18,[34,634,635],{},"    \"branchName\": \"feat\u002Fnew-header\",\n",[34,637,639],{"class":36,"line":638},19,[34,640,641],{},"    \"pullRequest\": {\n",[34,643,645],{"class":36,"line":644},20,[34,646,647],{},"      \"number\": 42,\n",[34,649,651],{"class":36,"line":650},21,[34,652,653],{},"      \"headSha\": \"9a8b7c…\",\n",[34,655,657],{"class":36,"line":656},22,[34,658,659],{},"      \"headRef\": \"feat\u002Fnew-header\",\n",[34,661,663],{"class":36,"line":662},23,[34,664,665],{},"      \"baseRef\": \"main\",\n",[34,667,669],{"class":36,"line":668},24,[34,670,290],{},[34,672,674],{"class":36,"line":673},25,[34,675,676],{},"    \"event\": \"pull_request\",\n",[34,678,680],{"class":36,"line":679},26,[34,681,682],{},"    \"buildId\": \"1234567890\",\n",[34,684,686],{"class":36,"line":685},27,[34,687,688],{},"    \"buildName\": \"CI\",\n",[34,690,692],{"class":36,"line":691},28,[34,693,694],{},"    \"buildUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\u002Factions\u002Fruns\u002F1234567890\u002Fattempts\u002F1\",\n",[34,696,698],{"class":36,"line":697},29,[34,699,700],{},"    \"runAttempt\": \"1\",\n",[34,702,704],{"class":36,"line":703},30,[34,705,706],{},"    \"job\": \"e2e\",\n",[34,708,710],{"class":36,"line":709},31,[34,711,712],{},"    \"workspace\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\",\n",[34,714,716],{"class":36,"line":715},32,[34,717,596],{},[34,719,721],{"class":36,"line":720},33,[34,722,723],{},"  \"tool\": {\n",[34,725,727],{"class":36,"line":726},34,[34,728,729],{},"    \"name\": \"@pixsame\u002Fcypress-plugin-visual-regression-diff\",\n",[34,731,733],{"class":36,"line":732},35,[34,734,735],{},"    \"version\": \"1.1.0\",\n",[34,737,739],{"class":36,"line":738},36,[34,740,741],{},"  }, \u002F\u002F was die Datei geschrieben hat\n",[34,743,745,748],{"class":36,"line":744},37,[34,746,747],{},"  \"options\": { \"updateImages\": \"failures-only\" },",[34,749,750],{}," \u002F\u002F globale pluginVisualRegression*-Optionen, ohne Präfix\n",[34,752,754],{"class":36,"line":753},38,[34,755,756],{},"  \"runner\": {\n",[34,758,760],{"class":36,"line":759},39,[34,761,762],{},"    \"name\": \"cypress\",\n",[34,764,766],{"class":36,"line":765},40,[34,767,768],{},"    \"version\": \"16.1.0\",\n",[34,770,772],{"class":36,"line":771},41,[34,773,774],{},"    \"testingType\": \"e2e\",\n",[34,776,778],{"class":36,"line":777},42,[34,779,780],{},"    \"mode\": \"run\",\n",[34,782,784],{"class":36,"line":783},43,[34,785,786],{},"    \"configFile\": \"cypress.config.ts\",\n",[34,788,790],{"class":36,"line":789},44,[34,791,792],{},"    \"browser\": {\n",[34,794,796],{"class":36,"line":795},45,[34,797,798],{},"      \"name\": \"chrome\",\n",[34,800,802],{"class":36,"line":801},46,[34,803,804],{},"      \"version\": \"130.0.0.0\",\n",[34,806,808],{"class":36,"line":807},47,[34,809,810],{},"      \"family\": \"chromium\",\n",[34,812,814],{"class":36,"line":813},48,[34,815,816],{},"      \"headless\": true,\n",[34,818,820],{"class":36,"line":819},49,[34,821,290],{},[34,823,825],{"class":36,"line":824},50,[34,826,827],{},"    \"specs\": [\"cypress\u002Fe2e\u002Fhome.cy.ts\"],\n",[34,829,831],{"class":36,"line":830},51,[34,832,833],{},"    \"specPattern\": \"cypress\u002Fe2e\u002F**\u002F*.cy.{js,jsx,ts,tsx}\",\n",[34,835,837],{"class":36,"line":836},52,[34,838,839],{},"    \"baseUrl\": \"http:\u002F\u002Flocalhost:3000\",\n",[34,841,843],{"class":36,"line":842},53,[34,844,845],{},"    \"viewport\": { \"width\": 1280, \"height\": 720 },\n",[34,847,849],{"class":36,"line":848},54,[34,850,596],{},[34,852,854],{"class":36,"line":853},55,[34,855,856],{},"  \"summary\": {\n",[34,858,860],{"class":36,"line":859},56,[34,861,862],{},"    \"entries\": 1,\n",[34,864,866],{"class":36,"line":865},57,[34,867,868],{},"    \"passed\": 0,\n",[34,870,872],{"class":36,"line":871},58,[34,873,874],{},"    \"failed\": 1,\n",[34,876,878],{"class":36,"line":877},59,[34,879,880],{},"    \"missingBaseline\": 0,\n",[34,882,884],{"class":36,"line":883},60,[34,885,886],{},"    \"created\": 0,\n",[34,888,890],{"class":36,"line":889},61,[34,891,892],{},"    \"updated\": 0,\n",[34,894,896],{"class":36,"line":895},62,[34,897,898],{},"    \"approved\": 0,\n",[34,900,902],{"class":36,"line":901},63,[34,903,904],{},"    \"needsHuman\": 1,\n",[34,906,908],{"class":36,"line":907},64,[34,909,596],{},[34,911,913],{"class":36,"line":912},65,[34,914,915],{},"  \"entries\": [\n",[34,917,919],{"class":36,"line":918},66,[34,920,921],{},"    {\n",[34,923,925],{"class":36,"line":924},67,[34,926,927],{},"      \"name\": \"home page renders_#0\",\n",[34,929,931],{"class":36,"line":930},68,[34,932,933],{},"      \"test\": {\n",[34,935,937],{"class":36,"line":936},69,[34,938,939],{},"        \"filePath\": \"cypress\u002Fe2e\u002Fhome.cy.ts\",\n",[34,941,943],{"class":36,"line":942},70,[34,944,945],{},"        \"titlePath\": [\"home page\", \"renders\"],\n",[34,947,949],{"class":36,"line":948},71,[34,950,951],{},"        \"retry\": 0,\n",[34,953,955],{"class":36,"line":954},72,[34,956,957],{},"      },\n",[34,959,961],{"class":36,"line":960},73,[34,962,963],{},"      \"status\": \"failed\",\n",[34,965,967],{"class":36,"line":966},74,[34,968,969],{},"      \"comparison\": { \"diffRatio\": 0.0231, \"threshold\": 0.01 },\n",[34,971,973],{"class":36,"line":972},75,[34,974,975],{},"      \"images\": {\n",[34,977,979],{"class":36,"line":978},76,[34,980,981],{},"        \"baseline\": {\n",[34,983,985],{"class":36,"line":984},77,[34,986,987],{},"          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.png\",\n",[34,989,991],{"class":36,"line":990},78,[34,992,993],{},"          \"width\": 1280,\n",[34,995,997],{"class":36,"line":996},79,[34,998,999],{},"          \"height\": 720,\n",[34,1001,1003],{"class":36,"line":1002},80,[34,1004,1005],{},"        },\n",[34,1007,1009],{"class":36,"line":1008},81,[34,1010,1011],{},"        \"actual\": {\n",[34,1013,1015],{"class":36,"line":1014},82,[34,1016,1017],{},"          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.actual.png\",\n",[34,1019,1021],{"class":36,"line":1020},83,[34,1022,993],{},[34,1024,1026],{"class":36,"line":1025},84,[34,1027,999],{},[34,1029,1031],{"class":36,"line":1030},85,[34,1032,1005],{},[34,1034,1036],{"class":36,"line":1035},86,[34,1037,1038],{},"        \"diff\": {\n",[34,1040,1042],{"class":36,"line":1041},87,[34,1043,1044],{},"          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.diff.png\",\n",[34,1046,1048],{"class":36,"line":1047},88,[34,1049,1005],{},[34,1051,1053],{"class":36,"line":1052},89,[34,1054,957],{},[34,1056,1058],{"class":36,"line":1057},90,[34,1059,1060],{},"      \"baselineWritten\": false,\n",[34,1062,1064],{"class":36,"line":1063},91,[34,1065,1066],{},"      \"recordedAt\": \"2026-09-22T10:03:12.480Z\",\n",[34,1068,1070],{"class":36,"line":1069},92,[34,1071,1072],{},"      \"platform\": {\n",[34,1074,1076],{"class":36,"line":1075},93,[34,1077,1078],{},"        \"osPlatform\": \"linux\",\n",[34,1080,1082],{"class":36,"line":1081},94,[34,1083,1084],{},"        \"arch\": \"x64\",\n",[34,1086,1088],{"class":36,"line":1087},95,[34,1089,1090],{},"        \"browser\": {\n",[34,1092,1094],{"class":36,"line":1093},96,[34,1095,1096],{},"          \"name\": \"chrome\",\n",[34,1098,1100],{"class":36,"line":1099},97,[34,1101,1102],{},"          \"version\": \"130.0.0.0\",\n",[34,1104,1106],{"class":36,"line":1105},98,[34,1107,1108],{},"          \"family\": \"chromium\",\n",[34,1110,1112],{"class":36,"line":1111},99,[34,1113,1114],{},"          \"headless\": true,\n",[34,1116,1118],{"class":36,"line":1117},100,[34,1119,1005],{},[34,1121,1123],{"class":36,"line":1122},101,[34,1124,957],{},[34,1126,1128],{"class":36,"line":1127},102,[34,1129,1130],{},"      \"viewport\": { \"width\": 1280, \"height\": 720 },\n",[34,1132,1134],{"class":36,"line":1133},103,[34,1135,1136],{},"      \"options\": {\n",[34,1138,1140],{"class":36,"line":1139},104,[34,1141,1142],{},"        \"imagesPath\": \"{spec_path}\u002F__image_snapshots__\",\n",[34,1144,1146],{"class":36,"line":1145},105,[34,1147,1148],{},"        \"maxDiffThreshold\": 0.01,\n",[34,1150,1152],{"class":36,"line":1151},106,[34,1153,1154],{},"        \"diffConfig\": {},\n",[34,1156,1158],{"class":36,"line":1157},107,[34,1159,1160],{},"        \"createMissingImages\": true,\n",[34,1162,1164],{"class":36,"line":1163},108,[34,1165,1166],{},"        \"updateImages\": false,\n",[34,1168,1170],{"class":36,"line":1169},109,[34,1171,1172],{},"        \"forceDeviceScaleFactor\": true,\n",[34,1174,1176],{"class":36,"line":1175},110,[34,1177,1178],{},"        \"screenshotConfig\": {},\n",[34,1180,1182],{"class":36,"line":1181},111,[34,1183,957],{},[34,1185,1187],{"class":36,"line":1186},112,[34,1188,1189],{},"      \"renderer\": {\n",[34,1191,1193],{"class":36,"line":1192},113,[34,1194,1195],{},"        \"backend\": \"native\",\n",[34,1197,1199],{"class":36,"line":1198},114,[34,1200,1201],{},"        \"browser\": \"chrome\",\n",[34,1203,1205],{"class":36,"line":1204},115,[34,1206,1207],{},"        \"browserVersion\": \"130.0.0.0\",\n",[34,1209,1211],{"class":36,"line":1210},116,[34,1212,957],{},[34,1214,1216],{"class":36,"line":1215},117,[34,1217,1218],{},"      \"hashes\": {\n",[34,1220,1222,1225],{"class":36,"line":1221},118,[34,1223,1224],{},"        \"baseline\": \"3b7e…\",",[34,1226,1227],{}," \u002F\u002F sha256 der unter `images` aufgeführten Dateien, nur für vorhandene Dateien\n",[34,1229,1231],{"class":36,"line":1230},119,[34,1232,1233],{},"        \"actual\": \"9d21…\",\n",[34,1235,1237],{"class":36,"line":1236},120,[34,1238,1239],{},"        \"diff\": \"c0ff…\",\n",[34,1241,1243],{"class":36,"line":1242},121,[34,1244,957],{},[34,1246,1248],{"class":36,"line":1247},122,[34,1249,1250],{},"      \"message\": \"2310 pixels (2.31%) differ; the limit is 1%.\",\n",[34,1252,1254],{"class":36,"line":1253},123,[34,1255,290],{},[34,1257,1259],{"class":36,"line":1258},124,[34,1260,1261],{},"  ],\n",[34,1263,1265],{"class":36,"line":1264},125,[34,1266,1267],{},"}\n",[1269,1270,1271,1296],"table",{},[1272,1273,1274],"thead",{},[1275,1276,1277,1283,1286,1291],"tr",{},[1278,1279,1280],"th",{},[31,1281,1282],{},"status",[1278,1284,1285],{},"Bedeutung",[1278,1287,1288],{},[31,1289,1290],{},"images.actual.path",[1278,1292,1293],{},[31,1294,1295],{},"images.diff.path",[1297,1298,1299,1319,1340,1359,1380,1406],"tbody",{},[1275,1300,1301,1307,1310,1315],{},[1302,1303,1304],"td",{},[31,1305,1306],{},"passed",[1302,1308,1309],{},"innerhalb des Schwellenwerts",[1302,1311,1312],{},[31,1313,1314],{},"null",[1302,1316,1317],{},[31,1318,1314],{},[1275,1320,1321,1326,1335,1338],{},[1302,1322,1323],{},[31,1324,1325],{},"failed",[1302,1327,1328,1329,1331,1332,1334],{},"über dem Schwellenwert, ",[31,1330,491],{}," und ",[31,1333,495],{}," bleiben zur Prüfung erhalten",[1302,1336,1337],{},"Pfad",[1302,1339,1337],{},[1275,1341,1342,1347,1353,1355],{},[1302,1343,1344],{},[31,1345,1346],{},"missing-baseline",[1302,1348,1349,1350],{},"keine Baseline und ",[31,1351,1352],{},"createMissingImages: false",[1302,1354,1337],{},[1302,1356,1357],{},[31,1358,1314],{},[1275,1360,1361,1366,1372,1376],{},[1302,1362,1363],{},[31,1364,1365],{},"created",[1302,1367,1368,1369,1371],{},"keine Baseline, ",[31,1370,491],{}," wurde zur Baseline",[1302,1373,1374],{},[31,1375,1314],{},[1302,1377,1378],{},[31,1379,1314],{},[1275,1381,1382,1387,1398,1402],{},[1302,1383,1384],{},[31,1385,1386],{},"updated",[1302,1388,1389,1390,1393,1394,1397],{},"Baseline überschrieben (",[31,1391,1392],{},"updateImages: true"," oder ",[31,1395,1396],{},"'failures-only'",")",[1302,1399,1400],{},[31,1401,1314],{},[1302,1403,1404],{},[31,1405,1314],{},[1275,1407,1408,1413,1416,1420],{},[1302,1409,1410],{},[31,1411,1412],{},"approved",[1302,1414,1415],{},"Baseline aus der Review-Oberfläche im Headed-Modus ersetzt („Replace image“)",[1302,1417,1418],{},[31,1419,1314],{},[1302,1421,1422],{},[31,1423,1314],{},[20,1425,1426],{},"Felder auf Lauf-Ebene:",[1269,1428,1429,1438],{},[1272,1430,1431],{},[1275,1432,1433,1436],{},[1278,1434,1435],{},"Feld",[1278,1437,1285],{},[1297,1439,1440,1453,1488,1498,1519,1541,1592],{},[1275,1441,1442,1450],{},[1302,1443,1444,269,1447],{},[31,1445,1446],{},"createdAt",[31,1448,1449],{},"updatedAt",[1302,1451,1452],{},"wann der Lauf gestartet ist und wann die Datei zuletzt neu geschrieben wurde (ISO 8601)",[1275,1454,1455,1460],{},[1302,1456,1457],{},[31,1458,1459],{},"platform",[1302,1461,1462,1465,1466,269,1469,269,1472,1475,1476,1479,1480,1483,1484,1487],{},[31,1463,1464],{},"osPlatform"," (",[31,1467,1468],{},"linux",[31,1470,1471],{},"darwin",[31,1473,1474],{},"win32","), ",[31,1477,1478],{},"arch",", das Kernel-",[31,1481,1482],{},"osRelease"," und im Run-Modus die menschenlesbare ",[31,1485,1486],{},"osVersion"," der Maschine, die die Tests ausgeführt hat",[1275,1489,1490,1495],{},[1302,1491,1492],{},[31,1493,1494],{},"tool",[1302,1496,1497],{},"was die Datei geschrieben hat: dieses Plugin und seine Version",[1275,1499,1500,1505],{},[1302,1501,1502],{},[31,1503,1504],{},"ci",[1302,1506,1507,1508,1511,1512,1515,1516,1518],{},"wird auf GitHub Actions und GitLab CI aus Umgebungsvariablen erkannt; ",[31,1509,1510],{},"{ \"provider\": null }"," auf anderen CI-Systemen (nur ",[31,1513,1514],{},"CI"," ist gesetzt), ",[31,1517,1314],{}," außerhalb der CI. Es werden ausschließlich die aufgeführten Schlüssel aus der Umgebung übernommen",[1275,1520,1521,1526],{},[1302,1522,1523],{},[31,1524,1525],{},"options",[1302,1527,1528,1529,1532,1533,1536,1537,1540],{},"jede ",[31,1530,1531],{},"pluginVisualRegression*","-Option aus ",[31,1534,1535],{},"expose","\u002F",[31,1538,1539],{},"env",", ohne Präfix, Werte wie konfiguriert (CLI-Werte bleiben Strings)",[1275,1542,1543,1548],{},[1302,1544,1545],{},[31,1546,1547],{},"runner",[1302,1549,1550,1551,1554,1555,1393,1558,1561,1562,1565,1566,1569,1570,1331,1573,1575,1576,1579,1580,269,1583,269,1586,269,1589],{},"was die Tests ausgeführt hat. ",[31,1552,1553],{},"mode"," ist ",[31,1556,1557],{},"run",[31,1559,1560],{},"open","; ",[31,1563,1564],{},"browser"," ist der gestartete Browser; ",[31,1567,1568],{},"specs"," ist nur im Run-Modus bekannt; ",[31,1571,1572],{},"configFile",[31,1574,1568],{}," sind relativ zu ",[31,1577,1578],{},"projectRoot",". Cypress-Cloud-Läufe erhalten zusätzlich ",[31,1581,1582],{},"cloud.runUrl",[31,1584,1585],{},"group",[31,1587,1588],{},"tag",[31,1590,1591],{},"parallel",[1275,1593,1594,1599],{},[1302,1595,1596],{},[31,1597,1598],{},"summary",[1302,1600,1601,1602,1554,1605,1607,1608,1611],{},"Anzahl der Einträge pro Status; ",[31,1603,1604],{},"needsHuman",[31,1606,1325],{}," + ",[31,1609,1610],{},"missingBaseline",", sodass ein Consumer entscheiden kann, ohne die Einträge zu lesen",[20,1613,1614],{},"Hinweise für Consumer:",[114,1616,1617,1645,1659,1667,1718,1740,1775,1785,1817,1831,1850,1871],{},[117,1618,1619,1620,1622,1623,1625,1626,1629,1630,1633,1634,1636,1637,1640,1641,1644],{},"Alle Pfade sind relativ zu ",[31,1621,1578],{}," und verwenden ",[31,1624,1536],{}," als Trenner; sie können aus dem Projekt hinausführen (",[31,1627,1628],{},"..\u002F…","), wenn ",[31,1631,1632],{},"imagesPath"," absolut ist. ",[31,1635,1578],{}," ist das Cypress-Projekt, nicht zwingend der Repository-Stamm: ",[31,1638,1639],{},"ci.workspace"," ist das Checkout-Verzeichnis, ",[31,1642,1643],{},"relative(ci.workspace, projectRoot)"," ergibt also das Pfadpräfix innerhalb des Repositorys.",[117,1646,1647,1331,1649,1651,1652,1654,1655,1658],{},[31,1648,1325],{},[31,1650,1346],{}," sind die Einträge, die einen Menschen brauchen: Wer ",[31,1653,1290],{}," über ",[31,1656,1657],{},"images.baseline.path"," kopiert, gibt sie frei.",[117,1660,1661,1664,1665,356],{},[31,1662,1663],{},"baselineWritten"," gibt an, ob sich der Arbeitsbaum für diesen Screenshot geändert hat, unabhängig vom ",[31,1666,1282],{},[117,1668,1669,1670,1673,1674,1677,1678,1465,1681,269,1684,269,1687,1393,1690,1693,1694,1697,1698,1701,1702,1705,1706,1709,1710,1713,1714,1717],{},"Ein Eintrag, dessen Vergleich Unterschiede gefunden hat, enthält ",[31,1671,1672],{},"extra.pixsame.analysis"," (sofern ",[31,1675,1676],{},"analysis"," nicht ausgeschaltet ist): ein ",[31,1679,1680],{},"label",[31,1682,1683],{},"content-change",[31,1685,1686],{},"moved",[31,1688,1689],{},"noise-like",[31,1691,1692],{},"size-change","), eine ",[31,1695,1696],{},"description"," in einem Satz, die geänderten ",[31,1699,1700],{},"regions"," mit ihren Rahmen, einen erkannten ",[31,1703,1704],{},"shift"," und einen ",[31,1707,1708],{},"bundleKey",", der für Einträge mit der gleichen Änderung gleich ist. ",[31,1711,1712],{},"bundle()"," aus ",[31,1715,1716],{},"@pixsame\u002Fanalysis"," gruppiert Einträge danach.",[117,1719,1720,1721,1331,1723,1726,1727,1729,1730,1732,1733,1735,1736,1739],{},"Jeder Eintrag trägt sein eigenes ",[31,1722,1459],{},[31,1724,1725],{},"viewport",", sodass sich Einträge aus einer Matrix von Maschinen auch nach dem Zusammenführen mehrerer Manifeste auseinanderhalten lassen. ",[31,1728,1525],{}," an einem Eintrag ist die exakte ",[31,1731,387],{},"-Eingabe (",[31,1734,1632],{}," behält seine Platzhalter unaufgelöst); ",[31,1737,1738],{},"comparison"," ist das Ergebnis.",[117,1741,1742,1744,1745,1748,1749,1752,1753,1331,1756,1759,1760,1763,1764,1331,1767,1770,1771,1774],{},[31,1743,1459],{}," ist, wo der Test gelaufen ist, ",[31,1746,1747],{},"renderer"," ist, woher die Pixel stammen. Derzeit wird jeder Screenshot von dem Browser aufgenommen, den Cypress steuert, daher ist ",[31,1750,1751],{},"renderer.backend"," ",[31,1754,1755],{},"native",[31,1757,1758],{},"renderer.browser"," wiederholt ",[31,1761,1762],{},"platform.browser.name",". Das Feld existiert, damit sich ein anderer Renderer als der lokale Browser (ein gepinntes Docker-Image, ein gehosteter Renderer) über ",[31,1765,1766],{},"rendererVersion",[31,1768,1769],{},"imageDigest"," identifizieren kann und damit ein Lauf, der auf den lokalen Browser zurückfallen musste, mit ",[31,1772,1773],{},"renderer.fallback: true"," markiert werden kann. Behandeln Sie Einträge mit unterschiedlichen Renderern als unterschiedliche Baselines.",[117,1776,1777,1780,1781,1784],{},[31,1778,1779],{},"hashes"," enthält den sha256 jeder Datei aus ",[31,1782,1783],{},"images",", die auf der Festplatte existiert. Nutzen Sie ihn, um das erneute Hochladen unveränderter Baselines zu überspringen, um zu prüfen, ob ein Artefakt zum Manifest passt, oder um zwei Einträge zu erkennen, die identische Pixel erzeugt haben.",[117,1786,1787,1788,1331,1791,1794,1795,1798,1799,1802,1803,1806,1807,1810,1811,1331,1814,356],{},"Zuordnung zu einem Pull Request: Verwenden Sie ",[31,1789,1790],{},"ci.repositoryName",[31,1792,1793],{},"ci.pullRequest.number",". Bei GitHub-",[31,1796,1797],{},"pull_request","-Events ist ",[31,1800,1801],{},"ci.commit"," der temporäre Merge-Commit; alles, was auf den PR-Branch pusht, muss daher ",[31,1804,1805],{},"ci.pullRequest.headSha"," \u002F ",[31,1808,1809],{},"headRef"," verwenden. Das Workflow-Artefakt finden Sie über ",[31,1812,1813],{},"ci.buildId",[31,1815,1816],{},"ci.runAttempt",[117,1818,1819,1820,1823,1824,1827,1828,1830],{},"Einen Lauf reproduzieren: ",[31,1821,1822],{},"npx cypress run --\u003Crunner.testingType> --browser \u003Crunner.browser.name> --config-file \u003Crunner.configFile> --spec \u003Crunner.specs joined with ,>"," plus ein ",[31,1825,1826],{},"--expose \"pluginVisualRegression\u003CKey>=\u003Cvalue>\""," pro Eintrag von ",[31,1829,1525],{},". Das Manifest speichert diese Angaben als Einzelteile statt als Befehlszeile; Shell-Quoting und Paketmanager bleiben also Ihnen überlassen.",[117,1832,1833,1834,1465,1837,1840,1841,1607,1844,1713,1847,1849],{},"Die Datei wird nach jedem Vergleich neu geschrieben, sie ist also auch dann vollständig, wenn der Lauf abgebrochen wird. Laufen Specs parallel auf mehreren Maschinen, schreibt jede Maschine ihr eigenes Manifest; ",[31,1835,1836],{},"**\u002Fvisual-regression-manifest{,.*}.json",[31,1838,1839],{},"MANIFEST_FILE_GLOB"," im Paket) findet sie alle in einem Artefakt, und ",[31,1842,1843],{},"readManifestFiles",[31,1845,1846],{},"mergeManifests",[31,1848,518],{}," machen daraus eine einzige Liste, in der ein späterer CI-Versuch einen früheren überstimmt.",[117,1851,1852,1853,1855,1856,1858,1859,1862,1863,1866,1867,1870],{},"Nur der ",[31,1854,1547],{},"-Block und die Schlüssel von ",[31,1857,1525],{}," sind Cypress-spezifisch; den Rest des Formats teilen sich alle anderen Writer. ",[31,1860,1861],{},"specVersion"," folgt semver, und die Major-Version wird nur bei Breaking Changes am Format erhöht; Consumer ignorieren Schlüssel, die sie nicht kennen. Da die Feldnamen CTRF folgen, verwandelt ",[31,1864,1865],{},"toCtrf"," aus dem Paket ein Manifest in einen ",[352,1868,504],{"href":502,"rel":1869},[424],"-Report für Tooling, das dieses Format liest.",[117,1872,1873,1874,1877,1878,1881,1882,356],{},"Die ",[31,1875,1876],{},"Manifest*","-Typen werden der Einfachheit halber aus ",[31,1879,1880],{},"@pixsame\u002Fcypress-plugin-visual-regression-diff\u002Fplugins"," re-exportiert; es sind dieselben wie in ",[31,1883,518],{},[20,1885,1886,1887,1465,1890,1893],{},"Das Manifest ist standardmäßig aktiviert. Um es an einem anderen Ort zu schreiben (Pfade werden relativ zum Projektstamm aufgelöst) oder es abzuschalten, verwenden Sie den Schlüssel ",[31,1888,1889],{},"pluginVisualRegressionManifestPath",[31,1891,1892],{},"false"," deaktiviert es, sonst ändert sich nichts):",[24,1895,1897],{"className":26,"code":1896,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionManifestPath=reports\u002Fvisual-regression.json\"\nnpx cypress run --expose \"pluginVisualRegressionManifestPath=false\"\n# Cypress \u003C15.10 (veraltet seit 15.10, entfernt in 16)\nnpx cypress run --env \"pluginVisualRegressionManifestPath=false\"\n",[31,1898,1899,1903,1916,1929,1933],{"__ignoreMap":29},[34,1900,1901],{"class":36,"line":37},[34,1902,443],{"class":40},[34,1904,1905,1907,1909,1911,1913],{"class":36,"line":44},[34,1906,448],{"class":47},[34,1908,451],{"class":51},[34,1910,454],{"class":51},[34,1912,457],{"class":55},[34,1914,1915],{"class":51}," \"pluginVisualRegressionManifestPath=reports\u002Fvisual-regression.json\"\n",[34,1917,1918,1920,1922,1924,1926],{"class":36,"line":62},[34,1919,448],{"class":47},[34,1921,451],{"class":51},[34,1923,454],{"class":51},[34,1925,457],{"class":55},[34,1927,1928],{"class":51}," \"pluginVisualRegressionManifestPath=false\"\n",[34,1930,1931],{"class":36,"line":69},[34,1932,465],{"class":40},[34,1934,1935,1937,1939,1941,1943],{"class":36,"line":75},[34,1936,448],{"class":47},[34,1938,451],{"class":51},[34,1940,454],{"class":51},[34,1942,476],{"class":55},[34,1944,1928],{"class":51},[20,1946,1947],{},"Wenn Sie E2E- und Component-Tests mit einem eigenen Pfad ausführen, nehmen Sie den Testing-Type selbst in den Pfad auf; andernfalls würden sich die Läufe gegenseitig die Datei überschreiben.",[10,1949,1951],{"id":1950},"configuration","Konfiguration",[20,1953,1954],{},"Konfigurieren Sie das Plugin:",[114,1956,1957],{},[117,1958,1959,1960,1962],{},"indem Sie die Konfiguration als Argument an den Befehl ",[31,1961,387],{}," übergeben:",[24,1964,1966],{"className":126,"code":1965,"language":128,"meta":29,"style":29},"cy.matchImage({\n  \u002F\u002F Screenshot-Konfiguration, wird direkt an die Screenshot-Methode von Cypress durchgereicht: https:\u002F\u002Fdocs.cypress.io\u002Fapi\u002Fcypress-api\u002Fscreenshot-api#Arguments\n  \u002F\u002F Standard: { }\n  screenshotConfig: {\n    blackout: ['.element-to-be-blackouted'],\n  },\n  \u002F\u002F pixelmatch-Optionen, siehe: https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fpixelmatch#pixelmatchimg1-img2-output-width-height-options\n  \u002F\u002F Standard: {} - pixelmatch-Standardwerte, vor allem includeAA: false (Kantenpixel mit Anti-Aliasing werden nicht als Unterschiede gezählt)\n  diffConfig: {\n    threshold: 0.01,\n  },\n  \u002F\u002F ob fehlende Baseline-Bilder automatisch erstellt werden sollen\n  \u002F\u002F Standard: true\n  createMissingImages: false,\n  \u002F\u002F ob Bilder automatisch aktualisiert werden sollen – nützlich in der CI\n  \u002F\u002F - true: alle Baseline-Bilder ohne Vergleich überschreiben (am schnellsten)\n  \u002F\u002F - 'failures-only': zuerst vergleichen, Baseline nur aktualisieren, wenn der Diff den Schwellenwert überschreitet\n  \u002F\u002F - false: Baseline-Bilder nie automatisch aktualisieren\n  \u002F\u002F Standard: false\n  updateImages: true,\n  \u002F\u002F Verzeichnispfad, in dem die Screenshots gespeichert werden\n  \u002F\u002F relative Pfade werden relativ zum Projektstamm aufgelöst\n  \u002F\u002F absolute Pfade (sowohl unter Unix als auch unter Windows) werden unterstützt\n  \u002F\u002F Pfadtrenner werden vom Plugin je nach Betriebssystem normalisiert; verwenden Sie immer \u002F als Pfadtrenner, z. B.: C:\u002Fmy-directory\u002Fnested für Windows-Laufwerksnotation\n  \u002F\u002F Diese Variablen können im Pfad verwendet werden:\n  \u002F\u002F - {spec_path} – relativer Pfad vom Projektstamm zum Verzeichnis der aktuellen Spec-Datei (z. B. `\u002Fsrc\u002Fcomponents\u002Fmy-tested-component`); muss ein ganzes Pfadsegment sein\n  \u002F\u002F - {platform} – `{os}-{browser}`, z. B. `linux-chrome`, `darwin-electron`, `win32-firefox`\n  \u002F\u002F - {os} – Cypress.platform: `linux`, `darwin` oder `win32`\n  \u002F\u002F - {browser} – der Browser, in dem Cypress die Spec ausführt (Cypress.browser.name): `electron`, sofern `--browser` nichts anderes vorgibt, `chrome`, `firefox`, `edge`, ...\n  \u002F\u002F {platform}, {os} und {browser} können auch Teil eines Segments sein (`shots-{platform}`); `matchAgainstPath` wird nie expandiert\n  \u002F\u002F Damit halten Sie die Baselines verschiedener Betriebssysteme\u002FBrowser auseinander, siehe „Baselines pro Plattform“ weiter unten\n  \u002F\u002F Standard: '{spec_path}\u002F__image_snapshots__'\n  imagesPath: 'this-might-be-your-custom\u002Fmaybe-nested-directory',\n  \u002F\u002F maximaler Schwellenwert, ab dem der Test fehlschlagen soll\n  \u002F\u002F Standard: 0.01\n  maxDiffThreshold: 0.1,\n  \u002F\u002F beschreibt, was sich geändert hat, wenn ein Vergleich Unterschiede findet, z. B. \"Everything below y=340 moved down by 12 px.\"\n  \u002F\u002F der Satz steht am Ende der Fehlermeldung, erscheint im Review-Karussell und wird im Run-Manifest festgehalten\n  \u002F\u002F er ändert nie, ob der Vergleich besteht\n  \u002F\u002F Standard: true\n  analysis: false,\n  \u002F\u002F erzwingt den Skalierungsfaktor \"1\"\n  \u002F\u002F hilft gegen 2x skalierte Screenshots auf hochauflösenden Displays wie Mac Retina\n  \u002F\u002F Standard: true\n  forceDeviceScaleFactor: false,\n  \u002F\u002F wendet das Preset für deterministisches Rendering an, siehe „Reducing cross-OS rendering noise“ unten\n  \u002F\u002F pro Aufruf steuert es nur das für den Screenshot in die Seite eingefügte CSS (Caret, Animationen, Scrollbars);\n  \u002F\u002F die Browser-Schalter gelten prozessweit und folgen der globalen Option pluginVisualRegressionDeterministicRendering\n  \u002F\u002F Standard: true\n  deterministicRendering: false,\n  \u002F\u002F Titel, der für den Dateinamen des Bildes verwendet wird\n  \u002F\u002F Standard: Cypress.currentTest.titlePath (der Titel Ihres Tests)\n  title: `${Cypress.currentTest.titlePath.join(' ')} (${Cypress.browser.displayName})`,\n  \u002F\u002F Pfad zu einem eigenen Bild, das für den Vergleich verwendet werden soll,\n  \u002F\u002F anstatt gegen das Bild aus dem vorherigen Lauf zu prüfen\n  \u002F\u002F Standard: undefined\n  matchAgainstPath: '\u002Fpath\u002Fto\u002Freference-image.png',\n});\n",[31,1967,1968,1976,1981,1986,1991,2002,2006,2011,2016,2021,2031,2035,2040,2045,2054,2059,2064,2069,2074,2079,2089,2094,2099,2104,2109,2114,2119,2124,2129,2134,2139,2144,2149,2159,2164,2169,2179,2184,2189,2194,2198,2207,2212,2217,2221,2230,2235,2240,2245,2249,2258,2263,2268,2320,2325,2330,2335,2345],{"__ignoreMap":29},[34,1969,1970,1972,1974],{"class":36,"line":37},[34,1971,373],{"class":147},[34,1973,387],{"class":162},[34,1975,246],{"class":147},[34,1977,1978],{"class":36,"line":44},[34,1979,1980],{"class":40},"  \u002F\u002F Screenshot-Konfiguration, wird direkt an die Screenshot-Methode von Cypress durchgereicht: https:\u002F\u002Fdocs.cypress.io\u002Fapi\u002Fcypress-api\u002Fscreenshot-api#Arguments\n",[34,1982,1983],{"class":36,"line":62},[34,1984,1985],{"class":40},"  \u002F\u002F Standard: { }\n",[34,1987,1988],{"class":36,"line":69},[34,1989,1990],{"class":147},"  screenshotConfig: {\n",[34,1992,1993,1996,1999],{"class":36,"line":75},[34,1994,1995],{"class":147},"    blackout: [",[34,1997,1998],{"class":51},"'.element-to-be-blackouted'",[34,2000,2001],{"class":147},"],\n",[34,2003,2004],{"class":36,"line":89},[34,2005,596],{"class":147},[34,2007,2008],{"class":36,"line":94},[34,2009,2010],{"class":40},"  \u002F\u002F pixelmatch-Optionen, siehe: https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fpixelmatch#pixelmatchimg1-img2-output-width-height-options\n",[34,2012,2013],{"class":36,"line":100},[34,2014,2015],{"class":40},"  \u002F\u002F Standard: {} - pixelmatch-Standardwerte, vor allem includeAA: false (Kantenpixel mit Anti-Aliasing werden nicht als Unterschiede gezählt)\n",[34,2017,2018],{"class":36,"line":278},[34,2019,2020],{"class":147},"  diffConfig: {\n",[34,2022,2023,2026,2029],{"class":36,"line":287},[34,2024,2025],{"class":147},"    threshold: ",[34,2027,2028],{"class":55},"0.01",[34,2030,299],{"class":147},[34,2032,2033],{"class":36,"line":293},[34,2034,596],{"class":147},[34,2036,2037],{"class":36,"line":302},[34,2038,2039],{"class":40},"  \u002F\u002F ob fehlende Baseline-Bilder automatisch erstellt werden sollen\n",[34,2041,2042],{"class":36,"line":308},[34,2043,2044],{"class":40},"  \u002F\u002F Standard: true\n",[34,2046,2047,2050,2052],{"class":36,"line":323},[34,2048,2049],{"class":147},"  createMissingImages: ",[34,2051,1892],{"class":55},[34,2053,299],{"class":147},[34,2055,2056],{"class":36,"line":330},[34,2057,2058],{"class":40},"  \u002F\u002F ob Bilder automatisch aktualisiert werden sollen – nützlich in der CI\n",[34,2060,2061],{"class":36,"line":335},[34,2062,2063],{"class":40},"  \u002F\u002F - true: alle Baseline-Bilder ohne Vergleich überschreiben (am schnellsten)\n",[34,2065,2066],{"class":36,"line":342},[34,2067,2068],{"class":40},"  \u002F\u002F - 'failures-only': zuerst vergleichen, Baseline nur aktualisieren, wenn der Diff den Schwellenwert überschreitet\n",[34,2070,2071],{"class":36,"line":632},[34,2072,2073],{"class":40},"  \u002F\u002F - false: Baseline-Bilder nie automatisch aktualisieren\n",[34,2075,2076],{"class":36,"line":638},[34,2077,2078],{"class":40},"  \u002F\u002F Standard: false\n",[34,2080,2081,2084,2087],{"class":36,"line":644},[34,2082,2083],{"class":147},"  updateImages: ",[34,2085,2086],{"class":55},"true",[34,2088,299],{"class":147},[34,2090,2091],{"class":36,"line":650},[34,2092,2093],{"class":40},"  \u002F\u002F Verzeichnispfad, in dem die Screenshots gespeichert werden\n",[34,2095,2096],{"class":36,"line":656},[34,2097,2098],{"class":40},"  \u002F\u002F relative Pfade werden relativ zum Projektstamm aufgelöst\n",[34,2100,2101],{"class":36,"line":662},[34,2102,2103],{"class":40},"  \u002F\u002F absolute Pfade (sowohl unter Unix als auch unter Windows) werden unterstützt\n",[34,2105,2106],{"class":36,"line":668},[34,2107,2108],{"class":40},"  \u002F\u002F Pfadtrenner werden vom Plugin je nach Betriebssystem normalisiert; verwenden Sie immer \u002F als Pfadtrenner, z. B.: C:\u002Fmy-directory\u002Fnested für Windows-Laufwerksnotation\n",[34,2110,2111],{"class":36,"line":673},[34,2112,2113],{"class":40},"  \u002F\u002F Diese Variablen können im Pfad verwendet werden:\n",[34,2115,2116],{"class":36,"line":679},[34,2117,2118],{"class":40},"  \u002F\u002F - {spec_path} – relativer Pfad vom Projektstamm zum Verzeichnis der aktuellen Spec-Datei (z. B. `\u002Fsrc\u002Fcomponents\u002Fmy-tested-component`); muss ein ganzes Pfadsegment sein\n",[34,2120,2121],{"class":36,"line":685},[34,2122,2123],{"class":40},"  \u002F\u002F - {platform} – `{os}-{browser}`, z. B. `linux-chrome`, `darwin-electron`, `win32-firefox`\n",[34,2125,2126],{"class":36,"line":691},[34,2127,2128],{"class":40},"  \u002F\u002F - {os} – Cypress.platform: `linux`, `darwin` oder `win32`\n",[34,2130,2131],{"class":36,"line":697},[34,2132,2133],{"class":40},"  \u002F\u002F - {browser} – der Browser, in dem Cypress die Spec ausführt (Cypress.browser.name): `electron`, sofern `--browser` nichts anderes vorgibt, `chrome`, `firefox`, `edge`, ...\n",[34,2135,2136],{"class":36,"line":703},[34,2137,2138],{"class":40},"  \u002F\u002F {platform}, {os} und {browser} können auch Teil eines Segments sein (`shots-{platform}`); `matchAgainstPath` wird nie expandiert\n",[34,2140,2141],{"class":36,"line":709},[34,2142,2143],{"class":40},"  \u002F\u002F Damit halten Sie die Baselines verschiedener Betriebssysteme\u002FBrowser auseinander, siehe „Baselines pro Plattform“ weiter unten\n",[34,2145,2146],{"class":36,"line":715},[34,2147,2148],{"class":40},"  \u002F\u002F Standard: '{spec_path}\u002F__image_snapshots__'\n",[34,2150,2151,2154,2157],{"class":36,"line":720},[34,2152,2153],{"class":147},"  imagesPath: ",[34,2155,2156],{"class":51},"'this-might-be-your-custom\u002Fmaybe-nested-directory'",[34,2158,299],{"class":147},[34,2160,2161],{"class":36,"line":726},[34,2162,2163],{"class":40},"  \u002F\u002F maximaler Schwellenwert, ab dem der Test fehlschlagen soll\n",[34,2165,2166],{"class":36,"line":732},[34,2167,2168],{"class":40},"  \u002F\u002F Standard: 0.01\n",[34,2170,2171,2174,2177],{"class":36,"line":738},[34,2172,2173],{"class":147},"  maxDiffThreshold: ",[34,2175,2176],{"class":55},"0.1",[34,2178,299],{"class":147},[34,2180,2181],{"class":36,"line":744},[34,2182,2183],{"class":40},"  \u002F\u002F beschreibt, was sich geändert hat, wenn ein Vergleich Unterschiede findet, z. B. \"Everything below y=340 moved down by 12 px.\"\n",[34,2185,2186],{"class":36,"line":753},[34,2187,2188],{"class":40},"  \u002F\u002F der Satz steht am Ende der Fehlermeldung, erscheint im Review-Karussell und wird im Run-Manifest festgehalten\n",[34,2190,2191],{"class":36,"line":759},[34,2192,2193],{"class":40},"  \u002F\u002F er ändert nie, ob der Vergleich besteht\n",[34,2195,2196],{"class":36,"line":765},[34,2197,2044],{"class":40},[34,2199,2200,2203,2205],{"class":36,"line":771},[34,2201,2202],{"class":147},"  analysis: ",[34,2204,1892],{"class":55},[34,2206,299],{"class":147},[34,2208,2209],{"class":36,"line":777},[34,2210,2211],{"class":40},"  \u002F\u002F erzwingt den Skalierungsfaktor \"1\"\n",[34,2213,2214],{"class":36,"line":783},[34,2215,2216],{"class":40},"  \u002F\u002F hilft gegen 2x skalierte Screenshots auf hochauflösenden Displays wie Mac Retina\n",[34,2218,2219],{"class":36,"line":789},[34,2220,2044],{"class":40},[34,2222,2223,2226,2228],{"class":36,"line":795},[34,2224,2225],{"class":147},"  forceDeviceScaleFactor: ",[34,2227,1892],{"class":55},[34,2229,299],{"class":147},[34,2231,2232],{"class":36,"line":801},[34,2233,2234],{"class":40},"  \u002F\u002F wendet das Preset für deterministisches Rendering an, siehe „Reducing cross-OS rendering noise“ unten\n",[34,2236,2237],{"class":36,"line":807},[34,2238,2239],{"class":40},"  \u002F\u002F pro Aufruf steuert es nur das für den Screenshot in die Seite eingefügte CSS (Caret, Animationen, Scrollbars);\n",[34,2241,2242],{"class":36,"line":813},[34,2243,2244],{"class":40},"  \u002F\u002F die Browser-Schalter gelten prozessweit und folgen der globalen Option pluginVisualRegressionDeterministicRendering\n",[34,2246,2247],{"class":36,"line":819},[34,2248,2044],{"class":40},[34,2250,2251,2254,2256],{"class":36,"line":824},[34,2252,2253],{"class":147},"  deterministicRendering: ",[34,2255,1892],{"class":55},[34,2257,299],{"class":147},[34,2259,2260],{"class":36,"line":830},[34,2261,2262],{"class":40},"  \u002F\u002F Titel, der für den Dateinamen des Bildes verwendet wird\n",[34,2264,2265],{"class":36,"line":836},[34,2266,2267],{"class":40},"  \u002F\u002F Standard: Cypress.currentTest.titlePath (der Titel Ihres Tests)\n",[34,2269,2270,2273,2276,2279,2281,2284,2286,2289,2291,2294,2296,2299,2301,2304,2306,2308,2310,2312,2315,2318],{"class":36,"line":842},[34,2271,2272],{"class":147},"  title: ",[34,2274,2275],{"class":51},"`${",[34,2277,2278],{"class":147},"Cypress",[34,2280,356],{"class":51},[34,2282,2283],{"class":147},"currentTest",[34,2285,356],{"class":51},[34,2287,2288],{"class":147},"titlePath",[34,2290,356],{"class":51},[34,2292,2293],{"class":162},"join",[34,2295,166],{"class":51},[34,2297,2298],{"class":51},"' '",[34,2300,1397],{"class":51},[34,2302,2303],{"class":51},"} (${",[34,2305,2278],{"class":147},[34,2307,356],{"class":51},[34,2309,1564],{"class":147},[34,2311,356],{"class":51},[34,2313,2314],{"class":147},"displayName",[34,2316,2317],{"class":51},"})`",[34,2319,299],{"class":147},[34,2321,2322],{"class":36,"line":848},[34,2323,2324],{"class":40},"  \u002F\u002F Pfad zu einem eigenen Bild, das für den Vergleich verwendet werden soll,\n",[34,2326,2327],{"class":36,"line":853},[34,2328,2329],{"class":40},"  \u002F\u002F anstatt gegen das Bild aus dem vorherigen Lauf zu prüfen\n",[34,2331,2332],{"class":36,"line":859},[34,2333,2334],{"class":40},"  \u002F\u002F Standard: undefined\n",[34,2336,2337,2340,2343],{"class":36,"line":865},[34,2338,2339],{"class":147},"  matchAgainstPath: ",[34,2341,2342],{"class":51},"'\u002Fpath\u002Fto\u002Freference-image.png'",[34,2344,299],{"class":147},[34,2346,2347],{"class":36,"line":871},[34,2348,2349],{"class":147},"});\n",[114,2351,2352],{},[117,2353,2354,2355,2360,2361,2364],{},"über die ",[352,2356,2359],{"href":2357,"rel":2358},"https:\u002F\u002Fon.cypress.io\u002Fexpose",[424],"globale Expose-Konfiguration"," (Cypress 15.10+). Die Konfigurationsschlüssel entsprechen den Schlüsseln des obigen Konfigurationsobjekts, jeweils mit vorangestelltem ",[31,2362,2363],{},"pluginVisualRegression",", z. B.:",[24,2366,2368],{"className":26,"code":2367,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionUpdateImages=true,pluginVisualRegressionDiffConfig={\\\"threshold\\\":0.01}\"\n# Cypress \u003C15.10 (veraltet seit 15.10, entfernt in 16)\nnpx cypress run --env \"pluginVisualRegressionUpdateImages=true,pluginVisualRegressionDiffConfig={\\\"threshold\\\":0.01}\"\n",[31,2369,2370,2374,2398,2402],{"__ignoreMap":29},[34,2371,2372],{"class":36,"line":37},[34,2373,443],{"class":40},[34,2375,2376,2378,2380,2382,2384,2387,2390,2393,2395],{"class":36,"line":44},[34,2377,448],{"class":47},[34,2379,451],{"class":51},[34,2381,454],{"class":51},[34,2383,457],{"class":55},[34,2385,2386],{"class":51}," \"pluginVisualRegressionUpdateImages=true,pluginVisualRegressionDiffConfig={",[34,2388,2389],{"class":140},"\\\"",[34,2391,2392],{"class":51},"threshold",[34,2394,2389],{"class":140},[34,2396,2397],{"class":51},":0.01}\"\n",[34,2399,2400],{"class":36,"line":62},[34,2401,465],{"class":40},[34,2403,2404,2406,2408,2410,2412,2414,2416,2418,2420],{"class":36,"line":69},[34,2405,448],{"class":47},[34,2407,451],{"class":51},[34,2409,454],{"class":51},[34,2411,476],{"class":55},[34,2413,2386],{"class":51},[34,2415,2389],{"class":140},[34,2417,2392],{"class":51},[34,2419,2389],{"class":140},[34,2421,2397],{"class":51},[20,2423,2424,2425,181,2428,2431],{},"Übergeben Sie mehrere Optionen kommagetrennt in einem einzigen Flag. Wird ",[31,2426,2427],{},"--expose",[31,2429,2430],{},"--env",") mehrfach angegeben, berücksichtigt Cypress nur das letzte Vorkommen.",[24,2433,2435],{"className":126,"code":2434,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress 15.10+)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  expose: {\n    pluginVisualRegressionUpdateImages: true,\n    pluginVisualRegressionDiffConfig: { threshold: 0.01 },\n  },\n});\n",[31,2436,2437,2442,2454,2458,2468,2473,2482,2492,2498],{"__ignoreMap":29},[34,2438,2439],{"class":36,"line":37},[34,2440,2441],{"class":40},"\u002F\u002F cypress.config.ts (Cypress 15.10+)\n",[34,2443,2444,2446,2448,2450,2452],{"class":36,"line":44},[34,2445,141],{"class":140},[34,2447,200],{"class":147},[34,2449,203],{"class":140},[34,2451,206],{"class":51},[34,2453,148],{"class":147},[34,2455,2456],{"class":36,"line":62},[34,2457,66],{"emptyLinePlaceholder":65},[34,2459,2460,2462,2464,2466],{"class":36,"line":69},[34,2461,237],{"class":140},[34,2463,240],{"class":140},[34,2465,243],{"class":162},[34,2467,246],{"class":47},[34,2469,2470],{"class":36,"line":75},[34,2471,2472],{"class":147},"  expose: {\n",[34,2474,2475,2478,2480],{"class":36,"line":89},[34,2476,2477],{"class":147},"    pluginVisualRegressionUpdateImages: ",[34,2479,2086],{"class":55},[34,2481,299],{"class":147},[34,2483,2484,2487,2489],{"class":36,"line":94},[34,2485,2486],{"class":147},"    pluginVisualRegressionDiffConfig: { threshold: ",[34,2488,2028],{"class":55},[34,2490,2491],{"class":147}," },\n",[34,2493,2494,2496],{"class":36,"line":100},[34,2495,296],{"class":147},[34,2497,299],{"class":47},[34,2499,2500,2502],{"class":36,"line":278},[34,2501,345],{"class":47},[34,2503,148],{"class":147},[24,2505,2507],{"className":126,"code":2506,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress \u003C15.10, in neueren Versionen veraltet)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  env: {\n    pluginVisualRegressionUpdateImages: true,\n    pluginVisualRegressionDiffConfig: { threshold: 0.01 },\n  },\n});\n",[31,2508,2509,2514,2526,2530,2540,2545,2553,2561,2567],{"__ignoreMap":29},[34,2510,2511],{"class":36,"line":37},[34,2512,2513],{"class":40},"\u002F\u002F cypress.config.ts (Cypress \u003C15.10, in neueren Versionen veraltet)\n",[34,2515,2516,2518,2520,2522,2524],{"class":36,"line":44},[34,2517,141],{"class":140},[34,2519,200],{"class":147},[34,2521,203],{"class":140},[34,2523,206],{"class":51},[34,2525,148],{"class":147},[34,2527,2528],{"class":36,"line":62},[34,2529,66],{"emptyLinePlaceholder":65},[34,2531,2532,2534,2536,2538],{"class":36,"line":69},[34,2533,237],{"class":140},[34,2535,240],{"class":140},[34,2537,243],{"class":162},[34,2539,246],{"class":47},[34,2541,2542],{"class":36,"line":75},[34,2543,2544],{"class":147},"  env: {\n",[34,2546,2547,2549,2551],{"class":36,"line":89},[34,2548,2477],{"class":147},[34,2550,2086],{"class":55},[34,2552,299],{"class":147},[34,2554,2555,2557,2559],{"class":36,"line":94},[34,2556,2486],{"class":147},[34,2558,2028],{"class":55},[34,2560,2491],{"class":147},[34,2562,2563,2565],{"class":36,"line":100},[34,2564,296],{"class":147},[34,2566,299],{"class":47},[34,2568,2569,2571],{"class":36,"line":278},[34,2570,345],{"class":47},[34,2572,148],{"class":147},[20,2574,2575,2576,356],{},"Weitere Möglichkeiten, Expose-Variablen zu setzen, ",[352,2577,2579],{"href":2357,"rel":2578},[424],"finden Sie hier",[10,2581,2583],{"id":2582},"per-platform-baselines","Baselines pro Plattform",[20,2585,2586,2587,2589],{},"Chrome überlässt die Text-Rasterisierung dem Betriebssystem, daher wird dieselbe Seite unter macOS, Linux und Windows nie Byte für Byte identisch gerendert, und die Browser unterscheiden sich obendrein noch voneinander. Eine auf dem Mac eines Entwicklers aufgenommene Baseline passt deshalb selten zu dem Screenshot, den ein Linux-CI-Job von derselben Seite macht. ",[31,2588,1632],{}," versteht drei Platzhalter, die die Baselines verschiedener Plattformen auseinanderhalten, statt sie sich gegenseitig überschreiben zu lassen:",[1269,2591,2592,2602],{},[1272,2593,2594],{},[1275,2595,2596,2599],{},[1278,2597,2598],{},"Platzhalter",[1278,2600,2601],{},"wird ersetzt durch",[1297,2603,2604,2623,2654],{},[1275,2605,2606,2611],{},[1302,2607,2608],{},[31,2609,2610],{},"{os}",[1302,2612,2613,2616,2617,269,2619,1393,2621],{},[31,2614,2615],{},"Cypress.platform",": ",[31,2618,1468],{},[31,2620,1471],{},[31,2622,1474],{},[1275,2624,2625,2630],{},[1302,2626,2627],{},[31,2628,2629],{},"{browser}",[1302,2631,2632,2635,2636,2639,2640,2643,2644,269,2647,269,2650,2653],{},[31,2633,2634],{},"Cypress.browser.name",", der Browser, in dem Cypress die Spec ausführt: ",[31,2637,2638],{},"electron",", sofern Sie kein ",[31,2641,2642],{},"--browser"," übergeben, sonst ",[31,2645,2646],{},"chrome",[31,2648,2649],{},"firefox",[31,2651,2652],{},"edge",", ...",[1275,2655,2656,2661],{},[1302,2657,2658],{},[31,2659,2660],{},"{platform}",[1302,2662,2663,2666,2667,269,2670],{},[31,2664,2665],{},"{os}-{browser}",", z. B. ",[31,2668,2669],{},"linux-chrome",[31,2671,2672],{},"darwin-electron",[20,2674,2675,2676,2678,2679,2682,2683,2685,2686,2688,2689,2692,2693,2696],{},"Jeder Screenshot wird von dem Browser aufgenommen, den Cypress steuert, also ist ",[31,2677,2629],{}," genau dieser Browser; ",[31,2680,2681],{},"cypress run"," ohne ",[31,2684,2642],{}," verwendet Electron, weshalb der Ordner ",[31,2687,2672],{}," heißt und nicht ",[31,2690,2691],{},"darwin-chrome",", sofern die CI nicht ",[31,2694,2695],{},"--browser chrome"," übergibt.",[20,2698,2699,2700,2702,2703,2706,2707,2710],{},"Die Platzhalter sind opt-in: Der Standard-",[31,2701,1632],{}," bleibt ",[31,2704,2705],{},"{spec_path}\u002F__image_snapshots__",", ein einziger Satz Baselines für alle. Das ist die richtige Struktur, wenn jeder Lauf auf demselben Betriebssystem und Browser stattfindet (etwa in einem Container, siehe FAQ) oder wenn die verbleibende Abweichung unter Ihrem ",[31,2708,2709],{},"maxDiffThreshold"," bleibt. Um nach Plattform aufzuteilen, fügen Sie den Platzhalter global hinzu:",[24,2712,2714],{"className":26,"code":2713,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{platform}\"\n# Cypress \u003C15.10 (veraltet seit 15.10, entfernt in 16)\nnpx cypress run --env \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{platform}\"\n",[31,2715,2716,2720,2733,2737],{"__ignoreMap":29},[34,2717,2718],{"class":36,"line":37},[34,2719,443],{"class":40},[34,2721,2722,2724,2726,2728,2730],{"class":36,"line":44},[34,2723,448],{"class":47},[34,2725,451],{"class":51},[34,2727,454],{"class":51},[34,2729,457],{"class":55},[34,2731,2732],{"class":51}," \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{platform}\"\n",[34,2734,2735],{"class":36,"line":62},[34,2736,465],{"class":40},[34,2738,2739,2741,2743,2745,2747],{"class":36,"line":69},[34,2740,448],{"class":47},[34,2742,451],{"class":51},[34,2744,454],{"class":51},[34,2746,476],{"class":55},[34,2748,2732],{"class":51},[24,2750,2752],{"className":126,"code":2751,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress 15.10+; unter Cypress \u003C15.10 `env` statt `expose` verwenden)\nexport default defineConfig({\n  expose: {\n    pluginVisualRegressionImagesPath:\n      '{spec_path}\u002F__image_snapshots__\u002F{platform}',\n  },\n});\n",[31,2753,2754,2759,2769,2773,2778,2785,2791],{"__ignoreMap":29},[34,2755,2756],{"class":36,"line":37},[34,2757,2758],{"class":40},"\u002F\u002F cypress.config.ts (Cypress 15.10+; unter Cypress \u003C15.10 `env` statt `expose` verwenden)\n",[34,2760,2761,2763,2765,2767],{"class":36,"line":44},[34,2762,237],{"class":140},[34,2764,240],{"class":140},[34,2766,243],{"class":162},[34,2768,246],{"class":47},[34,2770,2771],{"class":36,"line":62},[34,2772,2472],{"class":147},[34,2774,2775],{"class":36,"line":69},[34,2776,2777],{"class":147},"    pluginVisualRegressionImagesPath:\n",[34,2779,2780,2783],{"class":36,"line":75},[34,2781,2782],{"class":51},"      '{spec_path}\u002F__image_snapshots__\u002F{platform}'",[34,2784,299],{"class":147},[34,2786,2787,2789],{"class":36,"line":89},[34,2788,296],{"class":147},[34,2790,299],{"class":47},[34,2792,2793,2795],{"class":36,"line":94},[34,2794,345],{"class":47},[34,2796,148],{"class":147},[24,2798,2803],{"className":2799,"code":2801,"language":2802},[2800],"language-text","cypress\u002Fe2e\u002F__image_snapshots__\u002F\n├── darwin-electron\u002F   # was `cypress open` auf einem Mac schreibt\n│   └── home page renders_#0.png\n└── linux-chrome\u002F      # was Ihr CI-Job schreibt\n    └── home page renders_#0.png\n","text",[31,2804,2801],{"__ignoreMap":29},[20,2806,2807],{},"Nach der Aufteilung gibt es ein paar Dinge zu entscheiden:",[114,2809,2810,2847,2861],{},[117,2811,2812,2816,2817,2839,2842,2843,384],{},[2813,2814,2815],"strong",{},"Welche Baselines committet werden."," Die meisten Teams committen nur die CI-Plattform und halten die lokalen Baselines aus Git heraus, sodass jeder Entwickler seinen eigenen Satz bekommt, ohne das Repository zu verunreinigen:",[24,2818,2822],{"className":2819,"code":2820,"language":2821,"meta":29,"style":29},"language-gitignore shiki shiki-themes github-light-high-contrast github-dark-high-contrast","# alle Plattform-Ordner ignorieren, außer dem, den die CI erzeugt\n**\u002F__image_snapshots__\u002F*\u002F\n!**\u002F__image_snapshots__\u002Flinux-chrome\u002F\n","gitignore",[31,2823,2824,2829,2834],{"__ignoreMap":29},[34,2825,2826],{"class":36,"line":37},[34,2827,2828],{},"# alle Plattform-Ordner ignorieren, außer dem, den die CI erzeugt\n",[34,2830,2831],{"class":36,"line":44},[34,2832,2833],{},"**\u002F__image_snapshots__\u002F*\u002F\n",[34,2835,2836],{"class":36,"line":62},[34,2837,2838],{},"!**\u002F__image_snapshots__\u002Flinux-chrome\u002F\n",[2840,2841],"br",{},"Neue CI-Baselines müssen dann in der CI erzeugt und von dort committet werden (oder aus einem PR heraus freigegeben, siehe ",[352,2844,2846],{"href":2845},"#run-manifest-ci-integration","Run-Manifest",[117,2848,2849,2852,2853,1393,2855,2857,2858,356],{},[2813,2850,2851],{},"Nur nach Browser oder nur nach Betriebssystem aufteilen."," Verwenden Sie ",[31,2854,2629],{},[31,2856,2610],{}," allein, z. B. ",[31,2859,2860],{},"{spec_path}\u002F__image_snapshots__\u002F{browser}",[117,2862,2863,1752,2866,2869,2870,2872,2873,2876,2877,2880],{},[2813,2864,2865],{},"Das Aufräumen löscht die Baselines der anderen Plattformen.",[31,2867,2868],{},"pluginVisualRegressionCleanupUnusedImages"," durchsucht das gesamte Projekt nach vom Plugin erzeugten PNGs und weiß nichts von Plattformen: Ein Lauf auf ",[31,2871,2672],{}," behandelt jede Datei unter ",[31,2874,2875],{},"linux-chrome\u002F"," als ungenutzt und löscht sie. Lassen Sie die Option auf Maschinen deaktiviert, die die Ordner mehrerer Plattformen enthalten (ein Entwickler-Checkout mit committeten CI-Baselines ist genau so ein Fall), und aktivieren Sie sie nur dort, wo die Baselines einer einzigen Plattform liegen – typischerweise in dem CI-Job, der sie erzeugt. Falls es doch einmal passiert, holen Sie die gelöschten Ordner mit ",[31,2878,2879],{},"git checkout -- \u003Cfolder>"," zurück.",[20,2882,2883,2884,2889,2890,2892,2893,2895,2896,1744,2898,2900],{},"Wohin die Reise geht: Für ",[352,2885,2888],{"href":2886,"rel":2887},"https:\u002F\u002Fgithub.com\u002FFRSOURCE\u002Fcypress-plugin-visual-regression-diff\u002Fissues\u002F212",[424],"#212"," ist ein Renderer geplant, der die Pixel in einem festgelegten Docker-Image erzeugt, egal wo Cypress läuft, sodass lokale und CI-Bilder konstruktionsbedingt nicht mehr auseinanderdriften. ",[31,2891,2629],{}," bezeichnet dann den Browser des Renderers statt des von Cypress gesteuerten Browsers, und ",[31,2894,2660],{}," bleibt nützlich, um mehrere gerenderte Browser auseinanderzuhalten – nicht mehr für die Abweichung zwischen lokal und CI. Das Manifest hält bereits beide Seiten fest: ",[31,2897,1459],{},[31,2899,1747],{}," ist, woher die Pixel stammen.",[10,2902,2904],{"id":2903},"batch-review-mode","Batch Review Mode",[20,2906,2907,2908,2911],{},"Der Batch Review Mode ist ",[2813,2909,2910],{},"standardmäßig aktiviert",". Er ermöglicht es Ihnen, eine komplette Test-Suite auszuführen, ohne beim ersten fehlgeschlagenen visuellen Diff anzuhalten. Stattdessen werden alle fehlgeschlagenen Snapshots gesammelt und nach Abschluss der Tests in einer interaktiven Review-Oberfläche angezeigt, sodass Sie Änderungen gesammelt übernehmen oder überspringen können.",[15,2913,2915],{"id":2914},"additions-in-headed-mode-non-ci-environments","Zusätzliche Funktionen im Headed-Modus (außerhalb der CI)",[20,2917,2918],{},"Unten rechts im Cypress-Test-Runner erscheint ein Floating Action Button (FAB). Während die Tests laufen:",[114,2920,2921,2928,2931],{},[117,2922,2923,2924,2927],{},"Immer wenn ein ",[31,2925,2926],{},"matchImage()","-Aufruf den Diff-Schwellenwert überschreitet, wird der Zähler auf dem FAB erhöht, statt sofort einen Fehler zu werfen.",[117,2929,2930],{},"Sobald alle Tests abgeschlossen sind, wird ein Fehler mit der Gesamtzahl der Fehlschläge geworfen.",[117,2932,2933,2934,2937,2938,2941],{},"Ein Klick auf den FAB öffnet ein Karussell, in dem Sie jeden fehlgeschlagenen Snapshot im direkten Vergleich (neu vs. alt) prüfen und die Baseline entweder ",[2813,2935,2936],{},"ersetzen"," oder die Änderung ",[2813,2939,2940],{},"überspringen"," können.",[20,2943,2944],{},[2945,2946],"img",{"alt":2947,"src":2948},"Demo des Batch Review Mode","https:\u002F\u002Fraw.githubusercontent.com\u002Fpixsame\u002Fpixsame\u002Fmain\u002Fassets\u002Fbatch-review-mode.gif",[2950,2951,2952],"blockquote",{},[20,2953,2954,2955,2958,2959,2964],{},"Hinweis: Vor Version 2 von ",[31,2956,2957],{},"@pixsame\u002Fcypress-plugin-visual-regression-diff"," war der Batch Review Mode optional. Siehe den ",[352,2960,2963],{"href":2961,"rel":2962},"https:\u002F\u002Fgithub.com\u002Fpixsame\u002Fpixsame\u002Fblob\u002Fmain\u002Fpackages\u002Fcypress-plugin-visual-regression-diff\u002FMIGRATION.md#4x---5x",[424],"Migrationsleitfaden",", wenn Sie von 4.x aktualisieren.",[15,2966,2968],{"id":2967},"how-to-disable","Deaktivierung",[20,2970,2971,2972,2974,2975,2977,2978,2981,2982,2984],{},"Der Batch Review Mode ist eine globale Option (sie kann nicht direkt an ",[31,2973,387],{}," übergeben werden). Um wieder sofort beim ersten Unterschied mit ",[31,2976,2926],{}," fehlzuschlagen, setzen Sie den Schlüssel ",[31,2979,2980],{},"pluginVisualRegressionBatchReviewMode"," auf ",[31,2983,1892],{},":",[24,2986,2988],{"className":26,"code":2987,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress open --expose \"pluginVisualRegressionBatchReviewMode=false\"\n# Cypress \u003C15.10 (veraltet seit 15.10, entfernt in 16)\nnpx cypress open --env \"pluginVisualRegressionBatchReviewMode=false\"\n",[31,2989,2990,2994,3008,3012],{"__ignoreMap":29},[34,2991,2992],{"class":36,"line":37},[34,2993,443],{"class":40},[34,2995,2996,2998,3000,3003,3005],{"class":36,"line":44},[34,2997,448],{"class":47},[34,2999,451],{"class":51},[34,3001,3002],{"class":51}," open",[34,3004,457],{"class":55},[34,3006,3007],{"class":51}," \"pluginVisualRegressionBatchReviewMode=false\"\n",[34,3009,3010],{"class":36,"line":62},[34,3011,465],{"class":40},[34,3013,3014,3016,3018,3020,3022],{"class":36,"line":69},[34,3015,448],{"class":47},[34,3017,451],{"class":51},[34,3019,3002],{"class":51},[34,3021,476],{"class":55},[34,3023,3007],{"class":51},[24,3025,3027],{"className":126,"code":3026,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress 15.10+)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  expose: {\n    pluginVisualRegressionBatchReviewMode: false,\n  },\n});\n",[31,3028,3029,3033,3045,3049,3059,3063,3072,3078],{"__ignoreMap":29},[34,3030,3031],{"class":36,"line":37},[34,3032,2441],{"class":40},[34,3034,3035,3037,3039,3041,3043],{"class":36,"line":44},[34,3036,141],{"class":140},[34,3038,200],{"class":147},[34,3040,203],{"class":140},[34,3042,206],{"class":51},[34,3044,148],{"class":147},[34,3046,3047],{"class":36,"line":62},[34,3048,66],{"emptyLinePlaceholder":65},[34,3050,3051,3053,3055,3057],{"class":36,"line":69},[34,3052,237],{"class":140},[34,3054,240],{"class":140},[34,3056,243],{"class":162},[34,3058,246],{"class":47},[34,3060,3061],{"class":36,"line":75},[34,3062,2472],{"class":147},[34,3064,3065,3068,3070],{"class":36,"line":89},[34,3066,3067],{"class":147},"    pluginVisualRegressionBatchReviewMode: ",[34,3069,1892],{"class":55},[34,3071,299],{"class":147},[34,3073,3074,3076],{"class":36,"line":94},[34,3075,296],{"class":147},[34,3077,299],{"class":47},[34,3079,3080,3082],{"class":36,"line":100},[34,3081,345],{"class":47},[34,3083,148],{"class":147},[24,3085,3087],{"className":126,"code":3086,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress \u003C15.10, in neueren Versionen veraltet)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  env: {\n    pluginVisualRegressionBatchReviewMode: false,\n  },\n});\n",[31,3088,3089,3093,3105,3109,3119,3123,3131,3137],{"__ignoreMap":29},[34,3090,3091],{"class":36,"line":37},[34,3092,2513],{"class":40},[34,3094,3095,3097,3099,3101,3103],{"class":36,"line":44},[34,3096,141],{"class":140},[34,3098,200],{"class":147},[34,3100,203],{"class":140},[34,3102,206],{"class":51},[34,3104,148],{"class":147},[34,3106,3107],{"class":36,"line":62},[34,3108,66],{"emptyLinePlaceholder":65},[34,3110,3111,3113,3115,3117],{"class":36,"line":69},[34,3112,237],{"class":140},[34,3114,240],{"class":140},[34,3116,243],{"class":162},[34,3118,246],{"class":47},[34,3120,3121],{"class":36,"line":75},[34,3122,2544],{"class":147},[34,3124,3125,3127,3129],{"class":36,"line":89},[34,3126,3067],{"class":147},[34,3128,1892],{"class":55},[34,3130,299],{"class":147},[34,3132,3133,3135],{"class":36,"line":94},[34,3134,296],{"class":147},[34,3136,299],{"class":47},[34,3138,3139,3141],{"class":36,"line":100},[34,3140,345],{"class":47},[34,3142,148],{"class":147},[15,3144,3146],{"id":3145},"reviewing-passing-images","Bestandene Bilder prüfen",[20,3148,3149,3150,3152,3153,3156,3157,3159],{},"Bilder, die von der Baseline abweichen, aber innerhalb von ",[31,3151,2709],{}," bleiben, lassen den Test nicht fehlschlagen, werden aber trotzdem gesammelt. Das Karussell bietet eine Checkbox ",[2813,3154,3155],{},"Show passing",", mit der Sie diese Bilder durchsehen (jedes ist mit dem Badge ",[31,3158,1306],{}," markiert) und ebenfalls deren Baseline ersetzen können – etwa um kleine, angesammelte Abweichungen loszuwerden.",[20,3161,3162,3163,3166],{},"Die Checkbox ist standardmäßig nicht aktiviert. Mit dem Schlüssel ",[31,3164,3165],{},"pluginVisualRegressionBatchReviewModeShowPassingImages"," können Sie sie standardmäßig aktivieren:",[24,3168,3170],{"className":26,"code":3169,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress open --expose \"pluginVisualRegressionBatchReviewModeShowPassingImages=true\"\n# Cypress \u003C15.10 (veraltet seit 15.10, entfernt in 16)\nnpx cypress open --env \"pluginVisualRegressionBatchReviewModeShowPassingImages=true\"\n",[31,3171,3172,3176,3189,3193],{"__ignoreMap":29},[34,3173,3174],{"class":36,"line":37},[34,3175,443],{"class":40},[34,3177,3178,3180,3182,3184,3186],{"class":36,"line":44},[34,3179,448],{"class":47},[34,3181,451],{"class":51},[34,3183,3002],{"class":51},[34,3185,457],{"class":55},[34,3187,3188],{"class":51}," \"pluginVisualRegressionBatchReviewModeShowPassingImages=true\"\n",[34,3190,3191],{"class":36,"line":62},[34,3192,465],{"class":40},[34,3194,3195,3197,3199,3201,3203],{"class":36,"line":69},[34,3196,448],{"class":47},[34,3198,451],{"class":51},[34,3200,3002],{"class":51},[34,3202,476],{"class":55},[34,3204,3188],{"class":51},[24,3206,3208],{"className":126,"code":3207,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress 15.10+)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  expose: {\n    pluginVisualRegressionBatchReviewModeShowPassingImages: true,\n  },\n});\n",[31,3209,3210,3214,3226,3230,3240,3244,3253,3259],{"__ignoreMap":29},[34,3211,3212],{"class":36,"line":37},[34,3213,2441],{"class":40},[34,3215,3216,3218,3220,3222,3224],{"class":36,"line":44},[34,3217,141],{"class":140},[34,3219,200],{"class":147},[34,3221,203],{"class":140},[34,3223,206],{"class":51},[34,3225,148],{"class":147},[34,3227,3228],{"class":36,"line":62},[34,3229,66],{"emptyLinePlaceholder":65},[34,3231,3232,3234,3236,3238],{"class":36,"line":69},[34,3233,237],{"class":140},[34,3235,240],{"class":140},[34,3237,243],{"class":162},[34,3239,246],{"class":47},[34,3241,3242],{"class":36,"line":75},[34,3243,2472],{"class":147},[34,3245,3246,3249,3251],{"class":36,"line":89},[34,3247,3248],{"class":147},"    pluginVisualRegressionBatchReviewModeShowPassingImages: ",[34,3250,2086],{"class":55},[34,3252,299],{"class":147},[34,3254,3255,3257],{"class":36,"line":94},[34,3256,296],{"class":147},[34,3258,299],{"class":47},[34,3260,3261,3263],{"class":36,"line":100},[34,3262,345],{"class":47},[34,3264,148],{"class":147},[20,3266,3267],{},"Das Umschalten der Checkbox im Runner wird im Local Storage des Browsers gespeichert und hat bei späteren Läufen Vorrang vor dem konfigurierten Wert.",[10,3269,3271],{"id":3270},"reducing-cross-os-rendering-noise","Reducing cross-OS rendering noise",[20,3273,3274,3275,3278],{},"Browser überlassen die Text-Rasterisierung dem Betriebssystem (CoreText unter macOS, DirectWrite unter Windows, FreeType unter Linux). Dieselbe Seite wird daher auf dem Laptop eines Entwicklers und auf einem Linux-CI-Runner nie byte-genau identisch dargestellt. Das Plugin kann das nicht vollständig beseitigen, aber das ",[31,3276,3277],{},"deterministicRendering","-Preset (standardmäßig aktiviert) entfernt den Teil des Rauschens, der im Browser selbst entsteht:",[114,3280,3281,3302,3312,3325],{},[117,3282,3283,3286,3287,3290,3291,3294,3295,1713,3298,3301],{},[2813,3284,3285],{},"Chrome, Chromium, Edge"," werden mit ",[31,3288,3289],{},"--font-render-hinting=none --disable-font-subpixel-positioning --disable-lcd-text --force-color-profile=srgb --disable-gpu"," gestartet (Text ohne OS-Hinting und Subpixel-Tricks, ohne Farbmanagement, Rasterisierung auf der CPU), im Headless-Modus zusätzlich mit ",[31,3292,3293],{},"--hide-scrollbars",". Die Liste wird als ",[31,3296,3297],{},"DETERMINISTIC_RENDERING_CHROMIUM_ARGS",[31,3299,3300],{},"@pixsame\u002Fcypress-plugin-visual-regression-diff\u002Fconstants"," exportiert.",[117,3303,3304,3307,3308,3311],{},[2813,3305,3306],{},"Firefox"," erhält die Einstellung ",[31,3309,3310],{},"gfx.webrender.software"," (Rendering auf der CPU). Firefox hat keinen plattformübergreifenden Schalter für Font-Hinting, daher kann sich Text zwischen Betriebssystemen weiterhin unterscheiden.",[117,3313,3314,3317,3318,3320,3321,3324],{},[2813,3315,3316],{},"Jeder Browser",": Für die Dauer eines ",[31,3319,387],{},"-Screenshots wird in die getestete Seite ein ",[31,3322,3323],{},"\u003Cstyle>","-Element eingefügt, das den Text-Cursor (Caret) ausblendet, CSS-Transitions, Animationen und sanftes Scrollen deaktiviert und Scrollbars ausblendet. Es wird direkt nach dem Screenshot wieder entfernt.",[117,3326,3327,3328,1331,3331,3334],{},"Der Vergleich läuft mit ",[31,3329,3330],{},"pixelmatch",[31,3332,3333],{},"includeAA: false",", sodass Kantenpixel mit Anti-Aliasing erkannt und nicht als Unterschiede gezählt werden.",[20,3336,3337,3338,1331,3341,3343],{},"Was das Preset nicht löst: unterschiedliche Schriftdateien und Fallbacks pro Betriebssystem (der klassische Fall Arial vs. Liberation Sans), Emoji-Schriften, die Text-Rasterisierung in WebKit und Firefox sowie mit WebGL gezeichnete Bilder. Behalten Sie dafür pro Plattform eine eigene Baseline (siehe die Optionen ",[31,3339,3340],{},"title",[31,3342,1632],{}," sowie den FAQ-Eintrag zu Browsernamen) oder erzeugen Sie Ihre Baselines in derselben Umgebung, die Ihre CI verwendet.",[20,3345,3346,3349],{},[2813,3347,3348],{},"Electron"," ignoriert von Plugins gesetzte Schalter. Übergeben Sie sie stattdessen über die Umgebung:",[24,3351,3353],{"className":26,"code":3352,"language":28,"meta":29,"style":29},"ELECTRON_EXTRA_LAUNCH_ARGS=\"--font-render-hinting=none --disable-font-subpixel-positioning --disable-lcd-text --force-color-profile=srgb --disable-gpu --hide-scrollbars\" npx cypress run\n",[31,3354,3355],{"__ignoreMap":29},[34,3356,3357,3360,3363,3366,3369,3371],{"class":36,"line":37},[34,3358,3359],{"class":147},"ELECTRON_EXTRA_LAUNCH_ARGS",[34,3361,3362],{"class":140},"=",[34,3364,3365],{"class":51},"\"--font-render-hinting=none --disable-font-subpixel-positioning --disable-lcd-text --force-color-profile=srgb --disable-gpu --hide-scrollbars\"",[34,3367,3368],{"class":47}," npx",[34,3370,451],{"class":51},[34,3372,3373],{"class":51}," run\n",[20,3375,3376,2616,3379,3382,3383,3386,3387,3390,3391,3394,3395,356],{},[2813,3377,3378],{},"WebGL",[31,3380,3381],{},"--disable-gpu"," kann dazu führen, dass Seiten, die auf WebGL angewiesen sind, keinen Rendering-Kontext erhalten. Deaktivieren Sie entweder das Preset oder fügen Sie in Ihrem eigenen ",[31,3384,3385],{},"before:browser:launch","-Handler ",[31,3388,3389],{},"--use-gl=angle --use-angle=swiftshader"," hinzu (aktuelles Chrome verlangt zusätzlich ",[31,3392,3393],{},"--enable-unsafe-swiftshader",") und kombinieren Sie ihn mit dem Handler des Plugins über ",[352,3396,3399],{"href":3397,"rel":3398},"https:\u002F\u002Fgithub.com\u002Fbahmutov\u002Fcypress-on-fix",[424],[31,3400,3401],{},"cypress-on-fix",[20,3403,3404,3407,3408,492,3411,3414,3415,3418,3419,3422],{},[2813,3405,3406],{},"Screenshot hooks",": Das Plugin übergibt bei jedem von ihm aufgenommenen Screenshot eigene ",[31,3409,3410],{},"onBeforeScreenshot",[31,3412,3413],{},"onAfterScreenshot","-Hooks. Über ",[31,3416,3417],{},"screenshotConfig"," übergebene Hooks werden weiterhin aufgerufen, global mit ",[31,3420,3421],{},"Cypress.Screenshot.defaults()"," gesetzte Hooks dagegen nicht.",[20,3424,3425],{},"Um das Preset global auszuschalten (Browser-Schalter und CSS):",[24,3427,3429],{"className":26,"code":3428,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionDeterministicRendering=false\"\n# Cypress \u003C15.10 (veraltet seit 15.10, entfernt in 16)\nnpx cypress run --env \"pluginVisualRegressionDeterministicRendering=false\"\n",[31,3430,3431,3435,3448,3452],{"__ignoreMap":29},[34,3432,3433],{"class":36,"line":37},[34,3434,443],{"class":40},[34,3436,3437,3439,3441,3443,3445],{"class":36,"line":44},[34,3438,448],{"class":47},[34,3440,451],{"class":51},[34,3442,454],{"class":51},[34,3444,457],{"class":55},[34,3446,3447],{"class":51}," \"pluginVisualRegressionDeterministicRendering=false\"\n",[34,3449,3450],{"class":36,"line":62},[34,3451,465],{"class":40},[34,3453,3454,3456,3458,3460,3462],{"class":36,"line":69},[34,3455,448],{"class":47},[34,3457,451],{"class":51},[34,3459,454],{"class":51},[34,3461,476],{"class":55},[34,3463,3447],{"class":51},[24,3465,3467],{"className":126,"code":3466,"language":128,"meta":29,"style":29},"\u002F\u002F cypress.config.ts (Cypress 15.10+)\nimport { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  expose: {\n    pluginVisualRegressionDeterministicRendering: false,\n  },\n});\n",[31,3468,3469,3473,3485,3489,3499,3503,3512,3518],{"__ignoreMap":29},[34,3470,3471],{"class":36,"line":37},[34,3472,2441],{"class":40},[34,3474,3475,3477,3479,3481,3483],{"class":36,"line":44},[34,3476,141],{"class":140},[34,3478,200],{"class":147},[34,3480,203],{"class":140},[34,3482,206],{"class":51},[34,3484,148],{"class":147},[34,3486,3487],{"class":36,"line":62},[34,3488,66],{"emptyLinePlaceholder":65},[34,3490,3491,3493,3495,3497],{"class":36,"line":69},[34,3492,237],{"class":140},[34,3494,240],{"class":140},[34,3496,243],{"class":162},[34,3498,246],{"class":47},[34,3500,3501],{"class":36,"line":75},[34,3502,2472],{"class":147},[34,3504,3505,3508,3510],{"class":36,"line":89},[34,3506,3507],{"class":147},"    pluginVisualRegressionDeterministicRendering: ",[34,3509,1892],{"class":55},[34,3511,299],{"class":147},[34,3513,3514,3516],{"class":36,"line":94},[34,3515,296],{"class":147},[34,3517,299],{"class":47},[34,3519,3520,3522],{"class":36,"line":100},[34,3521,345],{"class":47},[34,3523,148],{"class":147},[20,3525,3526],{},"Um die Browser-Schalter beizubehalten, aber das CSS für einen einzelnen Screenshot zu überspringen (z. B. wenn Sie den Endzustand einer Animation erfassen möchten):",[24,3528,3530],{"className":126,"code":3529,"language":128,"meta":29,"style":29},"cy.matchImage({ deterministicRendering: false });\n",[31,3531,3532],{"__ignoreMap":29},[34,3533,3534,3536,3538,3541,3543],{"class":36,"line":37},[34,3535,373],{"class":147},[34,3537,387],{"class":162},[34,3539,3540],{"class":147},"({ deterministicRendering: ",[34,3542,1892],{"class":55},[34,3544,3545],{"class":147}," });\n",[10,3547,3549],{"id":3548},"faq","FAQ",[15,3551,3553,3554,3556],{"id":3552},"why-screenshots-doesnt-conform-to-the-viewport-set-in-my-cypress-configuration","Warum entsprechen die Screenshots nicht dem ",[31,3555,1725],{}," aus meiner Cypress-Konfiguration?",[20,3558,3559],{},"Screenshots in Cypress werden standardmäßig nicht an die Viewport-Größe angepasst. Sie können dieses Verhalten ändern:",[114,3561,3562,3568],{},[117,3563,3564,3565],{},"global, indem Sie die Standard-Screenshot-Konfiguration anpassen: ",[31,3566,3567],{},"Cypress.Screenshot.defaults({ capture: 'viewport' });",[117,3569,3570,3571,3574,3575],{},"lokal, indem Sie die Screenshot-Konfiguration direkt an den Befehl ",[31,3572,3573],{},".matchImage"," übergeben: ",[31,3576,3577],{},"cy.matchImage({ screenshotConfig: { capture: 'viewport' } });",[15,3579,3581],{"id":3580},"ive-upgraded-version-of-this-plugin-and-all-on-my-baseline-images-has-been-automatically-updated-why","Ich habe dieses Plugin aktualisiert und alle meine Baseline-Bilder wurden automatisch neu erzeugt. Warum?",[20,3583,3584],{},"Manchmal müssen wir Breaking Changes an den Algorithmen für Bildvergleich oder Bilderzeugung vornehmen. Um Ihnen den Upgrade-Pfad so einfach wie möglich zu machen, aktualisiert das Plugin Ihre Baseline-Bilder automatisch. Committen Sie sie nach dem Upgrade einfach in Ihr Repository – mehr ist nicht nötig!",[15,3586,3588,3589,1331,3591,3594],{"id":3587},"screenshots-look-different-between-cypress-run-and-cypress-open-how-do-i-fix-it","Screenshots sehen zwischen ",[31,3590,2681],{},[31,3592,3593],{},"cypress open"," unterschiedlich aus. Wie behebe ich das?",[20,3596,3597,3598,3601,3602,3605],{},"Die Ursache sind in der Regel unterschiedliche Device-Pixel-Ratios im Headless- und Headed-Modus. Verwenden Sie die Option ",[31,3599,3600],{},"forceDeviceScaleFactor",", um den Skalierungsfaktor auf ",[31,3603,3604],{},"1"," zu normalisieren:",[24,3607,3609],{"className":126,"code":3608,"language":128,"meta":29,"style":29},"cy.matchImage({ forceDeviceScaleFactor: true });\n",[31,3610,3611],{"__ignoreMap":29},[34,3612,3613,3615,3617,3620,3622],{"class":36,"line":37},[34,3614,373],{"class":147},[34,3616,387],{"class":162},[34,3618,3619],{"class":147},"({ forceDeviceScaleFactor: ",[34,3621,2086],{"class":55},[34,3623,3545],{"class":147},[20,3625,3626],{},"Oder setzen Sie sie global über eine Expose-Variable:",[24,3628,3630],{"className":26,"code":3629,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionForceDeviceScaleFactor=true\"\n# Cypress \u003C15.10 (veraltet seit 15.10, entfernt in 16)\nnpx cypress run --env \"pluginVisualRegressionForceDeviceScaleFactor=true\"\n",[31,3631,3632,3636,3649,3653],{"__ignoreMap":29},[34,3633,3634],{"class":36,"line":37},[34,3635,443],{"class":40},[34,3637,3638,3640,3642,3644,3646],{"class":36,"line":44},[34,3639,448],{"class":47},[34,3641,451],{"class":51},[34,3643,454],{"class":51},[34,3645,457],{"class":55},[34,3647,3648],{"class":51}," \"pluginVisualRegressionForceDeviceScaleFactor=true\"\n",[34,3650,3651],{"class":36,"line":62},[34,3652,465],{"class":40},[34,3654,3655,3657,3659,3661,3663],{"class":36,"line":69},[34,3656,448],{"class":47},[34,3658,451],{"class":51},[34,3660,454],{"class":51},[34,3662,476],{"class":55},[34,3664,3648],{"class":51},[20,3666,3667,3668,3671,3672,3674,3675,123],{},"Bei anhaltenden Unterschieden in der Viewport-Größe sollten Sie die Fenstergröße des Browsers explizit in ",[31,3669,3670],{},"setupNodeEvents"," festlegen (kombinieren Sie das mit dem eigenen ",[31,3673,3385],{},"-Handler des Plugins über ",[352,3676,3678],{"href":3397,"rel":3677},[424],[31,3679,3401],{},[24,3681,3683],{"className":126,"code":3682,"language":128,"meta":29,"style":29},"on('before:browser:launch', (browser, launchOptions) => {\n  if (browser.family === 'chromium' && browser.isHeadless) {\n    launchOptions.args.push('--window-size=1280,720');\n  }\n  return launchOptions;\n});\n",[31,3684,3685,3713,3733,3748,3753,3761],{"__ignoreMap":29},[34,3686,3687,3689,3691,3694,3697,3699,3701,3704,3707,3710],{"class":36,"line":37},[34,3688,266],{"class":162},[34,3690,166],{"class":147},[34,3692,3693],{"class":51},"'before:browser:launch'",[34,3695,3696],{"class":147},", (",[34,3698,1564],{"class":47},[34,3700,269],{"class":147},[34,3702,3703],{"class":47},"launchOptions",[34,3705,3706],{"class":147},") ",[34,3708,3709],{"class":140},"=>",[34,3711,3712],{"class":147}," {\n",[34,3714,3715,3718,3721,3724,3727,3730],{"class":36,"line":44},[34,3716,3717],{"class":140},"  if",[34,3719,3720],{"class":147}," (browser.family ",[34,3722,3723],{"class":140},"===",[34,3725,3726],{"class":51}," 'chromium'",[34,3728,3729],{"class":140}," &&",[34,3731,3732],{"class":147}," browser.isHeadless) {\n",[34,3734,3735,3738,3741,3743,3746],{"class":36,"line":62},[34,3736,3737],{"class":147},"    launchOptions.args.",[34,3739,3740],{"class":162},"push",[34,3742,166],{"class":147},[34,3744,3745],{"class":51},"'--window-size=1280,720'",[34,3747,172],{"class":147},[34,3749,3750],{"class":36,"line":69},[34,3751,3752],{"class":147},"  }\n",[34,3754,3755,3758],{"class":36,"line":75},[34,3756,3757],{"class":140},"  return",[34,3759,3760],{"class":147}," launchOptions;\n",[34,3762,3763],{"class":36,"line":89},[34,3764,2349],{"class":147},[20,3766,3767,3768,356],{},"Wenn die beiden Läufe auf unterschiedlichen Betriebssystemen stattfinden (macOS-Laptop vs. Linux-CI-Runner), stammen die verbleibenden Unterschiede vom Font-Rendering. Siehe ",[352,3769,3271],{"href":3770},"#reducing-cross-os-rendering-noise",[15,3772,3774,3775,3777],{"id":3773},"how-do-i-use-this-plugin-alongside-other-cypress-plugins-that-also-register-setupnodeevents-events","Wie verwende ich dieses Plugin zusammen mit anderen Cypress-Plugins, die ebenfalls ",[31,3776,3670],{},"-Events registrieren?",[20,3779,3780,3781,3784,3785,2984],{},"Cypress unterstützt nur einen einzigen Handler pro Event. Registrieren mehrere Plugins dasselbe Event (z. B. ",[31,3782,3783],{},"after:screenshot","), wird nur das zuletzt registrierte aufgerufen. Um mehrere Plugins sicher zu kombinieren, verwenden Sie ",[352,3786,3788],{"href":3397,"rel":3787},[424],[31,3789,3401],{},[24,3791,3793],{"className":126,"code":3792,"language":128,"meta":29,"style":29},"import { defineConfig } from 'cypress';\nimport { initPlugin as initVisualRegressionPlugin } from '@pixsame\u002Fcypress-plugin-visual-regression-diff\u002Fplugins';\nimport fix from 'cypress-on-fix';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(on, config) {\n      const fixedOn = fix(on);\n      initVisualRegressionPlugin(fixedOn, config);\n      \u002F\u002F weitere Plugins hier über fixedOn registrieren\n    },\n  },\n});\n",[31,3794,3795,3807,3823,3837,3841,3851,3855,3869,3886,3893,3898,3902,3908],{"__ignoreMap":29},[34,3796,3797,3799,3801,3803,3805],{"class":36,"line":37},[34,3798,141],{"class":140},[34,3800,200],{"class":147},[34,3802,203],{"class":140},[34,3804,206],{"class":51},[34,3806,148],{"class":147},[34,3808,3809,3811,3813,3815,3817,3819,3821],{"class":36,"line":44},[34,3810,141],{"class":140},[34,3812,215],{"class":147},[34,3814,218],{"class":140},[34,3816,221],{"class":147},[34,3818,203],{"class":140},[34,3820,226],{"class":51},[34,3822,148],{"class":147},[34,3824,3825,3827,3830,3832,3835],{"class":36,"line":62},[34,3826,141],{"class":140},[34,3828,3829],{"class":147}," fix ",[34,3831,203],{"class":140},[34,3833,3834],{"class":51}," 'cypress-on-fix'",[34,3836,148],{"class":147},[34,3838,3839],{"class":36,"line":69},[34,3840,66],{"emptyLinePlaceholder":65},[34,3842,3843,3845,3847,3849],{"class":36,"line":75},[34,3844,237],{"class":140},[34,3846,240],{"class":140},[34,3848,243],{"class":162},[34,3850,246],{"class":47},[34,3852,3853],{"class":36,"line":89},[34,3854,256],{"class":147},[34,3856,3857,3859,3861,3863,3865,3867],{"class":36,"line":94},[34,3858,261],{"class":162},[34,3860,166],{"class":147},[34,3862,266],{"class":47},[34,3864,269],{"class":147},[34,3866,272],{"class":47},[34,3868,275],{"class":147},[34,3870,3871,3874,3877,3880,3883],{"class":36,"line":100},[34,3872,3873],{"class":140},"      const",[34,3875,3876],{"class":55}," fixedOn",[34,3878,3879],{"class":140}," =",[34,3881,3882],{"class":162}," fix",[34,3884,3885],{"class":147},"(on);\n",[34,3887,3888,3890],{"class":36,"line":278},[34,3889,281],{"class":162},[34,3891,3892],{"class":147},"(fixedOn, config);\n",[34,3894,3895],{"class":36,"line":287},[34,3896,3897],{"class":40},"      \u002F\u002F weitere Plugins hier über fixedOn registrieren\n",[34,3899,3900],{"class":36,"line":293},[34,3901,290],{"class":147},[34,3903,3904,3906],{"class":36,"line":302},[34,3905,296],{"class":147},[34,3907,299],{"class":47},[34,3909,3910,3912],{"class":36,"line":308},[34,3911,345],{"class":47},[34,3913,148],{"class":147},[15,3915,3917],{"id":3916},"how-do-i-integrate-with-mochawesome-or-other-reporters-that-embed-screenshot-images","Wie integriere ich mochawesome oder andere Reporter, die Screenshots einbetten?",[20,3919,3920,3921,3924,3925,3928],{},"Das Plugin speichert Baseline-Bilder außerhalb des Standardverzeichnisses ",[31,3922,3923],{},"cypress\u002Fscreenshots\u002F",". Manche Reporter (etwa ",[31,3926,3927],{},"cypress-mochawesome-reporter",") erwarten die Screenshots jedoch in genau diesem Ordner.",[20,3930,3931,3932,3935,3936,3938,3939,2984],{},"Über den Task-Hook ",[31,3933,3934],{},"processImgPath"," steuern Sie, wo die Screenshot-Datei abgelegt wird. Überschreiben Sie ihn in ",[31,3937,3670],{}," nach dem Aufruf von ",[31,3940,3941],{},"initPlugin",[24,3943,3945],{"className":126,"code":3944,"language":128,"meta":29,"style":29},"setupNodeEvents(on, config) {\n  initVisualRegressionPlugin(on, config);\n\n  \u002F\u002F Pfadverarbeitung überschreiben, damit die Screenshots für den Reporter erreichbar bleiben\n  on('task', {\n    'cp-visual-regression-diff-processImgPath': ({ path }: { path: string }) => {\n      \u002F\u002F einen neuen Pfad zurückgeben, oder denselben Pfad, um das Standardverhalten beizubehalten\n      return path;\n    },\n  });\n}\n",[31,3946,3947,3954,3961,3965,3970,3983,4016,4021,4029,4033,4038],{"__ignoreMap":29},[34,3948,3949,3951],{"class":36,"line":37},[34,3950,3670],{"class":162},[34,3952,3953],{"class":147},"(on, config) {\n",[34,3955,3956,3959],{"class":36,"line":44},[34,3957,3958],{"class":162},"  initVisualRegressionPlugin",[34,3960,284],{"class":147},[34,3962,3963],{"class":36,"line":62},[34,3964,66],{"emptyLinePlaceholder":65},[34,3966,3967],{"class":36,"line":69},[34,3968,3969],{"class":40},"  \u002F\u002F Pfadverarbeitung überschreiben, damit die Screenshots für den Reporter erreichbar bleiben\n",[34,3971,3972,3975,3977,3980],{"class":36,"line":75},[34,3973,3974],{"class":162},"  on",[34,3976,166],{"class":147},[34,3978,3979],{"class":51},"'task'",[34,3981,3982],{"class":147},", {\n",[34,3984,3985,3988,3991,3994,3997,3999,4002,4004,4006,4009,4012,4014],{"class":36,"line":89},[34,3986,3987],{"class":51},"    'cp-visual-regression-diff-processImgPath'",[34,3989,3990],{"class":147},": ({ ",[34,3992,3993],{"class":47},"path",[34,3995,3996],{"class":147}," }",[34,3998,2984],{"class":140},[34,4000,4001],{"class":147}," { ",[34,4003,3993],{"class":47},[34,4005,2984],{"class":140},[34,4007,4008],{"class":55}," string",[34,4010,4011],{"class":147}," }) ",[34,4013,3709],{"class":140},[34,4015,3712],{"class":147},[34,4017,4018],{"class":36,"line":94},[34,4019,4020],{"class":40},"      \u002F\u002F einen neuen Pfad zurückgeben, oder denselben Pfad, um das Standardverhalten beizubehalten\n",[34,4022,4023,4026],{"class":36,"line":100},[34,4024,4025],{"class":140},"      return",[34,4027,4028],{"class":147}," path;\n",[34,4030,4031],{"class":36,"line":278},[34,4032,290],{"class":147},[34,4034,4035],{"class":36,"line":287},[34,4036,4037],{"class":147},"  });\n",[34,4039,4040],{"class":36,"line":293},[34,4041,1267],{"class":147},[15,4043,4045],{"id":4044},"how-to-fail-on-any-visual-difference-no-matter-how-small","Wie lasse ich den Test bei jeder noch so kleinen visuellen Abweichung fehlschlagen?",[20,4047,4048,4049,2981,4051,2984],{},"Setzen Sie ",[31,4050,2709],{},[31,4052,4053],{},"0",[24,4055,4057],{"className":126,"code":4056,"language":128,"meta":29,"style":29},"cy.matchImage({ maxDiffThreshold: 0 });\n",[31,4058,4059],{"__ignoreMap":29},[34,4060,4061,4063,4065,4068,4070],{"class":36,"line":37},[34,4062,373],{"class":147},[34,4064,387],{"class":162},[34,4066,4067],{"class":147},"({ maxDiffThreshold: ",[34,4069,4053],{"class":55},[34,4071,3545],{"class":147},[20,4073,4074],{},"Oder global über eine Expose-Variable:",[24,4076,4078],{"className":26,"code":4077,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionMaxDiffThreshold=0\"\n# Cypress \u003C15.10 (veraltet seit 15.10, entfernt in 16)\nnpx cypress run --env \"pluginVisualRegressionMaxDiffThreshold=0\"\n",[31,4079,4080,4084,4097,4101],{"__ignoreMap":29},[34,4081,4082],{"class":36,"line":37},[34,4083,443],{"class":40},[34,4085,4086,4088,4090,4092,4094],{"class":36,"line":44},[34,4087,448],{"class":47},[34,4089,451],{"class":51},[34,4091,454],{"class":51},[34,4093,457],{"class":55},[34,4095,4096],{"class":51}," \"pluginVisualRegressionMaxDiffThreshold=0\"\n",[34,4098,4099],{"class":36,"line":62},[34,4100,465],{"class":40},[34,4102,4103,4105,4107,4109,4111],{"class":36,"line":69},[34,4104,448],{"class":47},[34,4106,451],{"class":51},[34,4108,454],{"class":51},[34,4110,476],{"class":55},[34,4112,4096],{"class":51},[15,4114,4116],{"id":4115},"why-is-the-actual-screenshot-deleted-after-a-successful-image-comparison","Warum wird der aktuelle Screenshot nach einem erfolgreichen Bildvergleich gelöscht?",[20,4118,4119,4120,4122],{},"Stimmen die Bilder überein, ist die Datei ",[31,4121,491],{}," nur temporär und wird nach dem Vergleich aufgeräumt. Nur das Baseline-Bild (ohne Suffix) bleibt erhalten. So werden keine redundanten Dateien gespeichert.",[20,4124,4125,4126,4128],{},"Stimmen die Bilder nicht überein, bleibt die Datei ",[31,4127,491],{}," erhalten und trägt dieselben Plugin-Metadaten wie ein Baseline-Bild. Sie können sie gefahrlos umbenennen oder über die Baseline kopieren (z. B. in einem CI-Job, der einen Pull Request mit aktualisierten Baselines öffnet) – das Plugin behandelt sie dann als aktuelle Baseline und schreibt sie beim nächsten Lauf nicht neu.",[20,4130,4131,4132,4134,4135,4137,4138],{},"Falls die aktuellen Screenshots für einen Reporter (z. B. ",[31,4133,3927],{},") erreichbar bleiben müssen, steuern Sie den Speicherort über den Task-Hook ",[31,4136,3934],{},". Siehe ",[352,4139,3917],{"href":4140},"#how-do-i-integrate-with-mochawesome-or-other-reporters-that-embed-screenshot-images",[15,4142,4144],{"id":4143},"how-to-remove-spaces-from-screenshot-filenames","Wie entferne ich Leerzeichen aus den Screenshot-Dateinamen?",[20,4146,4147,4148,4150,4151,4153],{},"Die Dateinamen der Screenshots werden aus den Cypress-Testtiteln abgeleitet, die Leerzeichen enthalten können. Für einen Dateinamen ohne Leerzeichen übergeben Sie jedem ",[31,4149,387],{},"-Aufruf eine eigene ",[31,4152,3340],{},"-Option:",[24,4155,4157],{"className":126,"code":4156,"language":128,"meta":29,"style":29},"cy.matchImage({ title: 'my-screenshot-without-spaces' });\n",[31,4158,4159],{"__ignoreMap":29},[34,4160,4161,4163,4165,4168,4171],{"class":36,"line":37},[34,4162,373],{"class":147},[34,4164,387],{"class":162},[34,4166,4167],{"class":147},"({ title: ",[34,4169,4170],{"class":51},"'my-screenshot-without-spaces'",[34,4172,3545],{"class":147},[20,4174,4175,4176,4178,4179,123],{},"Um dies global für alle ",[31,4177,387],{},"-Aufrufe anzuwenden, überschreiben Sie den Befehl in Ihrer Support-Datei (",[31,4180,4181],{},"cypress\u002Fsupport\u002Fcommands.ts",[24,4183,4185],{"className":126,"code":4184,"language":128,"meta":29,"style":29},"Cypress.Commands.overwrite('matchImage', (originalFn, subject, options = {}) =>\n  originalFn(subject, {\n    title: Cypress.currentTest.titlePath.join(' ').replace(\u002F\\s+\u002Fg, '-'),\n    ...options,\n  }),\n);\n",[31,4186,4187,4222,4230,4269,4277,4282],{"__ignoreMap":29},[34,4188,4189,4192,4195,4197,4200,4202,4205,4207,4210,4212,4214,4216,4219],{"class":36,"line":37},[34,4190,4191],{"class":147},"Cypress.Commands.",[34,4193,4194],{"class":162},"overwrite",[34,4196,166],{"class":147},[34,4198,4199],{"class":51},"'matchImage'",[34,4201,3696],{"class":147},[34,4203,4204],{"class":47},"originalFn",[34,4206,269],{"class":147},[34,4208,4209],{"class":47},"subject",[34,4211,269],{"class":147},[34,4213,1525],{"class":47},[34,4215,3879],{"class":140},[34,4217,4218],{"class":147}," {}) ",[34,4220,4221],{"class":140},"=>\n",[34,4223,4224,4227],{"class":36,"line":44},[34,4225,4226],{"class":162},"  originalFn",[34,4228,4229],{"class":147},"(subject, {\n",[34,4231,4232,4235,4237,4239,4241,4243,4246,4248,4250,4253,4256,4258,4261,4263,4266],{"class":36,"line":62},[34,4233,4234],{"class":147},"    title: Cypress.currentTest.titlePath.",[34,4236,2293],{"class":162},[34,4238,166],{"class":147},[34,4240,2298],{"class":51},[34,4242,384],{"class":147},[34,4244,4245],{"class":162},"replace",[34,4247,166],{"class":147},[34,4249,1536],{"class":51},[34,4251,4252],{"class":55},"\\s",[34,4254,4255],{"class":140},"+",[34,4257,1536],{"class":51},[34,4259,4260],{"class":140},"g",[34,4262,269],{"class":147},[34,4264,4265],{"class":51},"'-'",[34,4267,4268],{"class":147},"),\n",[34,4270,4271,4274],{"class":36,"line":69},[34,4272,4273],{"class":140},"    ...",[34,4275,4276],{"class":147},"options,\n",[34,4278,4279],{"class":36,"line":75},[34,4280,4281],{"class":147},"  }),\n",[34,4283,4284],{"class":36,"line":89},[34,4285,172],{"class":147},[15,4287,4289],{"id":4288},"how-to-include-the-browser-name-in-image-filenames-for-cross-browser-testing","Wie nehme ich den Browsernamen in die Bilddateinamen auf (für Cross-Browser-Tests)?",[20,4291,4292,4293,4295,4296,4298,4299,269,4301,269,4303,4305],{},"Verwenden Sie den Platzhalter ",[31,4294,2629],{}," in ",[31,4297,1632],{},"; er wird durch den Namen des Browsers ersetzt, der den Screenshot gerendert hat (",[31,4300,2646],{},[31,4302,2649],{},[31,4304,2638],{},", ...):",[24,4307,4309],{"className":126,"code":4308,"language":128,"meta":29,"style":29},"cy.matchImage({ imagesPath: '{spec_path}\u002F__image_snapshots__\u002F{browser}' });\n",[31,4310,4311],{"__ignoreMap":29},[34,4312,4313,4315,4317,4320,4323],{"class":36,"line":37},[34,4314,373],{"class":147},[34,4316,387],{"class":162},[34,4318,4319],{"class":147},"({ imagesPath: ",[34,4321,4322],{"class":51},"'{spec_path}\u002F__image_snapshots__\u002F{browser}'",[34,4324,3545],{"class":147},[20,4326,4327],{},"Oder global:",[24,4329,4331],{"className":26,"code":4330,"language":28,"meta":29,"style":29},"# Cypress 15.10+\nnpx cypress run --expose \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{browser}\"\n# Cypress \u003C15.10 (veraltet seit 15.10, entfernt in 16)\nnpx cypress run --env \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{browser}\"\n",[31,4332,4333,4337,4350,4354],{"__ignoreMap":29},[34,4334,4335],{"class":36,"line":37},[34,4336,443],{"class":40},[34,4338,4339,4341,4343,4345,4347],{"class":36,"line":44},[34,4340,448],{"class":47},[34,4342,451],{"class":51},[34,4344,454],{"class":51},[34,4346,457],{"class":55},[34,4348,4349],{"class":51}," \"pluginVisualRegressionImagesPath={spec_path}\u002F__image_snapshots__\u002F{browser}\"\n",[34,4351,4352],{"class":36,"line":62},[34,4353,465],{"class":40},[34,4355,4356,4358,4360,4362,4364],{"class":36,"line":69},[34,4357,448],{"class":47},[34,4359,451],{"class":51},[34,4361,454],{"class":51},[34,4363,476],{"class":55},[34,4365,4349],{"class":51},[20,4367,4368,4369,269,4372,4375,4376,4379,4380,1331,4382,4384,4385,4387],{},"So entstehen separate Bildverzeichnisse pro Browser (",[31,4370,4371],{},"__image_snapshots__\u002Fchrome\u002F",[31,4373,4374],{},"__image_snapshots__\u002Ffirefox\u002F","). Unter ",[352,4377,2583],{"href":4378},"#per-platform-baselines"," finden Sie ",[31,4381,2660],{},[31,4383,2610],{},", die zusätzlich nach Betriebssystem aufteilen, welche Ordner committet werden sollten und warum ",[31,4386,2868],{}," auf einer Maschine, die die Ordner mehrerer Browser enthält, deaktiviert bleiben muss (sie würde die Baselines der anderen Browser löschen).",[15,4389,4391],{"id":4390},"how-to-generate-an-html-report-showing-baseline-diff-and-actual-images","Wie erzeuge ich einen HTML-Report mit Baseline-, Diff- und aktuellem Bild?",[20,4393,4394],{},"Das Plugin bringt ein integriertes Vergleichs-Overlay in der Cypress-Oberfläche mit: Ein Klick auf „See comparison“ bei einem fehlgeschlagenen Test zeigt Baseline, Diff und aktuelles Bild nebeneinander.",[20,4396,4397,4398,4404,4405,356],{},"Für die CI oder teilbare HTML-Reports integrieren Sie einen Reporter wie ",[352,4399,4402],{"href":4400,"rel":4401},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcypress-mochawesome-reporter",[424],[31,4403,3927],{},". Details zur Einrichtung finden Sie unter ",[352,4406,3917],{"href":4140},[4408,4409,4410],"style",{},"html pre.shiki code .sLBg1, html code.shiki .sLBg1{--shiki-default:#66707B;--shiki-dark:#BDC4CC}html pre.shiki code .soyes, html code.shiki .soyes{--shiki-default:#702C00;--shiki-dark:#FFB757}html pre.shiki code .sT6z2, html code.shiki .sT6z2{--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .s-5SL, html code.shiki .s-5SL{--shiki-default:#023B95;--shiki-dark:#91CBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHUrx, html code.shiki .sHUrx{--shiki-default:#A0111F;--shiki-dark:#FF9492}html pre.shiki code .suds8, html code.shiki .suds8{--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sKwhi, html code.shiki .sKwhi{--shiki-default:#622CBC;--shiki-dark:#DBB7FF}",{"title":29,"searchDepth":44,"depth":44,"links":4412},[4413,4416,4417,4418,4419,4420,4421,4422,4427,4428],{"id":12,"depth":44,"text":13,"children":4414},[4415],{"id":17,"depth":62,"text":18},{"id":359,"depth":44,"text":360},{"id":415,"depth":44,"text":416},{"id":429,"depth":44,"text":430},{"id":481,"depth":44,"text":482},{"id":1950,"depth":44,"text":1951},{"id":2582,"depth":44,"text":2583},{"id":2903,"depth":44,"text":2904,"children":4423},[4424,4425,4426],{"id":2914,"depth":62,"text":2915},{"id":2967,"depth":62,"text":2968},{"id":3145,"depth":62,"text":3146},{"id":3270,"depth":44,"text":3271},{"id":3548,"depth":44,"text":3549,"children":4429},[4430,4432,4433,4435,4437,4438,4439,4440,4441,4442],{"id":3552,"depth":62,"text":4431},"Warum entsprechen die Screenshots nicht dem viewport aus meiner Cypress-Konfiguration?",{"id":3580,"depth":62,"text":3581},{"id":3587,"depth":62,"text":4434},"Screenshots sehen zwischen cypress run und cypress open unterschiedlich aus. Wie behebe ich das?",{"id":3773,"depth":62,"text":4436},"Wie verwende ich dieses Plugin zusammen mit anderen Cypress-Plugins, die ebenfalls setupNodeEvents-Events registrieren?",{"id":3916,"depth":62,"text":3917},{"id":4044,"depth":62,"text":4045},{"id":4115,"depth":62,"text":4116},{"id":4143,"depth":62,"text":4144},{"id":4288,"depth":62,"text":4289},{"id":4390,"depth":62,"text":4391},"md",{},"\u002Freadme\u002Freadme-de",false,{"description":29},"3f4ca9c7906dc926","readme\u002FREADME-de","ynV7LmlzebI6TU8XZ6lLQFiNPfHa85r9AZWmMYx5VWk",1794530806905]