Best JavaScript code snippet using playwright-internal
background.js
Source: background.js
...405 if (a32[i] !== b32[i]) { identical = false; break; }406 }407 if (identical) { // fast path if identical408 if (output && !options.diffMask) {409 for (let i = 0; i < len; i++) drawGrayPixel(img1, 4 * i, options.alpha, output);410 }411 return 0;412 }413 // maximum acceptable square distance between two colors;414 // 35215 is the maximum possible value for the YIQ difference metric415 const maxDelta = 35215 * options.threshold * options.threshold;416 let diff = 0;417 const [aaR, aaG, aaB] = options.aaColor;418 const [diffR, diffG, diffB] = options.diffColor;419 // compare each pixel of one image against the other one420 for (let y = 0; y < height; y++) {421 for (let x = 0; x < width; x++) {422 const pos = (y * width + x) * 4;423 // squared YUV distance between colors at this pixel position424 const delta = colorDelta(img1, img2, pos, pos);425 // the color difference is above the threshold426 if (delta > maxDelta) {427 // check it's a real rendering difference or just anti-aliasing428 if (!options.includeAA && (antialiased(img1, x, y, width, height, img2) ||429 antialiased(img2, x, y, width, height, img1))) {430 // one of the pixels is anti-aliasing; draw as yellow and do not count as difference431 // note that we do not include such pixels in a mask432 if (output && !options.diffMask) drawPixel(output, pos, aaR, aaG, aaB);433 } else {434 // found substantial difference not caused by anti-aliasing; draw it as red435 if (output) {436 drawPixel(output, pos, diffR, diffG, diffB);437 diff++;438 }439 }440 } else if (output) {441 // pixels are similar; draw background as grayscale image blended with white442 if (!options.diffMask) drawGrayPixel(img1, pos, options.alpha, output);443 }444 }445 }446 // return the number of different pixels447 return diff;448}449function isPixelData(arr) {450 // work around instanceof Uint8Array not working properly in some Jest environments451 return ArrayBuffer.isView(arr) && arr.constructor.BYTES_PER_ELEMENT === 1;452}453// check if a pixel is likely a part of anti-aliasing;454// based on "Anti-aliased Pixel and Intensity Slope Detector" paper by V. Vysniauskas, 2009455function antialiased(img, x1, y1, width, height, img2) {456 const x0 = Math.max(x1 - 1, 0);457 const y0 = Math.max(y1 - 1, 0);458 const x2 = Math.min(x1 + 1, width - 1);459 const y2 = Math.min(y1 + 1, height - 1);460 const pos = (y1 * width + x1) * 4;461 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;462 let min = 0;463 let max = 0;464 let minX, minY, maxX, maxY;465 // go through 8 adjacent pixels466 for (let x = x0; x <= x2; x++) {467 for (let y = y0; y <= y2; y++) {468 if (x === x1 && y === y1) continue;469 // brightness delta between the center pixel and adjacent one470 const delta = colorDelta(img, img, pos, (y * width + x) * 4, true);471 // count the number of equal, darker and brighter adjacent pixels472 if (delta === 0) {473 zeroes++;474 // if found more than 2 equal siblings, it's definitely not anti-aliasing475 if (zeroes > 2) return false;476 // remember the darkest pixel477 } else if (delta < min) {478 min = delta;479 minX = x;480 minY = y;481 // remember the brightest pixel482 } else if (delta > max) {483 max = delta;484 maxX = x;485 maxY = y;486 }487 }488 }489 // if there are no both darker and brighter pixels among siblings, it's not anti-aliasing490 if (min === 0 || max === 0) return false;491 // if either the darkest or the brightest pixel has 3+ equal siblings in both images492 // (definitely not anti-aliased), this pixel is anti-aliased493 return (hasManySiblings(img, minX, minY, width, height) && hasManySiblings(img2, minX, minY, width, height)) ||494 (hasManySiblings(img, maxX, maxY, width, height) && hasManySiblings(img2, maxX, maxY, width, height));495}496// check if a pixel has 3+ adjacent pixels of the same color.497function hasManySiblings(img, x1, y1, width, height) {498 const x0 = Math.max(x1 - 1, 0);499 const y0 = Math.max(y1 - 1, 0);500 const x2 = Math.min(x1 + 1, width - 1);501 const y2 = Math.min(y1 + 1, height - 1);502 const pos = (y1 * width + x1) * 4;503 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;504 // go through 8 adjacent pixels505 for (let x = x0; x <= x2; x++) {506 for (let y = y0; y <= y2; y++) {507 if (x === x1 && y === y1) continue;508 const pos2 = (y * width + x) * 4;509 if (img[pos] === img[pos2] &&510 img[pos + 1] === img[pos2 + 1] &&511 img[pos + 2] === img[pos2 + 2] &&512 img[pos + 3] === img[pos2 + 3]) zeroes++;513 if (zeroes > 2) return true;514 }515 }516 return false;517}518// calculate color difference according to the paper "Measuring perceived color difference519// using YIQ NTSC transmission color space in mobile applications" by Y. Kotsarenko and F. Ramos520function colorDelta(img1, img2, k, m, yOnly) {521 let r1 = img1[k + 0];522 let g1 = img1[k + 1];523 let b1 = img1[k + 2];524 let a1 = img1[k + 3];525 let r2 = img2[m + 0];526 let g2 = img2[m + 1];527 let b2 = img2[m + 2];528 let a2 = img2[m + 3];529 if (a1 === a2 && r1 === r2 && g1 === g2 && b1 === b2) return 0;530 if (a1 < 255) {531 a1 /= 255;532 r1 = blend(r1, a1);533 g1 = blend(g1, a1);534 b1 = blend(b1, a1);535 }536 if (a2 < 255) {537 a2 /= 255;538 r2 = blend(r2, a2);539 g2 = blend(g2, a2);540 b2 = blend(b2, a2);541 }542 const y = rgb2y(r1, g1, b1) - rgb2y(r2, g2, b2);543 if (yOnly) return y; // brightness difference only544 const i = rgb2i(r1, g1, b1) - rgb2i(r2, g2, b2);545 const q = rgb2q(r1, g1, b1) - rgb2q(r2, g2, b2);546 return 0.5053 * y * y + 0.299 * i * i + 0.1957 * q * q;547}548function rgb2y(r, g, b) { return r * 0.29889531 + g * 0.58662247 + b * 0.11448223; }549function rgb2i(r, g, b) { return r * 0.59597799 - g * 0.27417610 - b * 0.32180189; }550function rgb2q(r, g, b) { return r * 0.21147017 - g * 0.52261711 + b * 0.31114694; }551// blend semi-transparent color with white552function blend(c, a) {553 return 255 + (c - 255) * a;554}555function drawPixel(output, pos, r, g, b) {556 output[pos + 0] = r;557 output[pos + 1] = g;558 output[pos + 2] = b;559 output[pos + 3] = 255;560}561function drawGrayPixel(img, i, alpha, output) {562 const r = img[i + 0];563 const g = img[i + 1];564 const b = img[i + 2];565 const val = blend(rgb2y(r, g, b), alpha * img[i + 3] / 255);566 drawPixel(output, i, val, val, val);567}568/******************************************************************/569/************* PIXELMATCH SOURCE CODE ENDS HERE ******************/...
image.js
Source: image.js
...276 if (a32[i] !== b32[i]) { identical = false; break; }277 }278 if (identical) { // fast path if identical279 if (output && !options.diffMask) {280 for (let i = 0; i < len; i++) drawGrayPixel(img1, 4 * i, options.alpha, output);281 }282 return 0;283 }284 // maximum acceptable square distance between two colors;285 // 35215 is the maximum possible value for the YIQ difference metric286 const maxDelta = 35215 * options.threshold * options.threshold;287 let diff = 0;288 // compare each pixel of one image against the other one289 for (let y = 0; y < height; y++) {290 for (let x = 0; x < width; x++) {291 const pos = (y * width + x) * 4;292 // squared YUV distance between colors at this pixel position, negative if the img2 pixel is darker293 const delta = colorDelta(img1, img2, pos, pos);294 // the color difference is above the threshold295 if (Math.abs(delta) > maxDelta) {296 // check it's a real rendering difference or just anti-aliasing297 if (!options.includeAA && (antialiased(img1, x, y, width, height, img2) ||298 antialiased(img2, x, y, width, height, img1))) {299 // one of the pixels is anti-aliasing; draw as yellow and do not count as difference300 // note that we do not include such pixels in a mask301 if (output && !options.diffMask) drawPixel(output, pos, ...options.aaColor);302 } else {303 // found substantial difference not caused by anti-aliasing; draw it as such304 if (output) {305 drawPixel(output, pos, ...(delta < 0 && options.diffColorAlt || options.diffColor));306 }307 diff++;308 }309 } else if (output) {310 // pixels are similar; draw background as grayscale image blended with white311 if (!options.diffMask) drawGrayPixel(img1, pos, options.alpha, output);312 }313 }314 }315 // return the number of different pixels316 return diff;317}318function isPixelData(arr) {319 // work around instanceof Uint8Array not working properly in some Jest environments320 return ArrayBuffer.isView(arr) && arr.constructor.BYTES_PER_ELEMENT === 1;321}322// check if a pixel is likely a part of anti-aliasing;323// based on "Anti-aliased Pixel and Intensity Slope Detector" paper by V. Vysniauskas, 2009324function antialiased(img, x1, y1, width, height, img2) {325 const x0 = Math.max(x1 - 1, 0);326 const y0 = Math.max(y1 - 1, 0);327 const x2 = Math.min(x1 + 1, width - 1);328 const y2 = Math.min(y1 + 1, height - 1);329 const pos = (y1 * width + x1) * 4;330 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;331 let min = 0;332 let max = 0;333 let minX, minY, maxX, maxY;334 // go through 8 adjacent pixels335 for (let x = x0; x <= x2; x++) {336 for (let y = y0; y <= y2; y++) {337 if (x === x1 && y === y1) continue;338 // brightness delta between the center pixel and adjacent one339 const delta = colorDelta(img, img, pos, (y * width + x) * 4, true);340 // count the number of equal, darker and brighter adjacent pixels341 if (delta === 0) {342 zeroes++;343 // if found more than 2 equal siblings, it's definitely not anti-aliasing344 if (zeroes > 2) return false;345 // remember the darkest pixel346 } else if (delta < min) {347 min = delta;348 minX = x;349 minY = y;350 // remember the brightest pixel351 } else if (delta > max) {352 max = delta;353 maxX = x;354 maxY = y;355 }356 }357 }358 // if there are no both darker and brighter pixels among siblings, it's not anti-aliasing359 if (min === 0 || max === 0) return false;360 // if either the darkest or the brightest pixel has 3+ equal siblings in both images361 // (definitely not anti-aliased), this pixel is anti-aliased362 return (hasManySiblings(img, minX, minY, width, height) && hasManySiblings(img2, minX, minY, width, height)) ||363 (hasManySiblings(img, maxX, maxY, width, height) && hasManySiblings(img2, maxX, maxY, width, height));364}365// check if a pixel has 3+ adjacent pixels of the same color.366function hasManySiblings(img, x1, y1, width, height) {367 const x0 = Math.max(x1 - 1, 0);368 const y0 = Math.max(y1 - 1, 0);369 const x2 = Math.min(x1 + 1, width - 1);370 const y2 = Math.min(y1 + 1, height - 1);371 const pos = (y1 * width + x1) * 4;372 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;373 // go through 8 adjacent pixels374 for (let x = x0; x <= x2; x++) {375 for (let y = y0; y <= y2; y++) {376 if (x === x1 && y === y1) continue;377 const pos2 = (y * width + x) * 4;378 if (img[pos] === img[pos2] &&379 img[pos + 1] === img[pos2 + 1] &&380 img[pos + 2] === img[pos2 + 2] &&381 img[pos + 3] === img[pos2 + 3]) zeroes++;382 if (zeroes > 2) return true;383 }384 }385 return false;386}387// calculate color difference according to the paper "Measuring perceived color difference388// using YIQ NTSC transmission color space in mobile applications" by Y. Kotsarenko and F. Ramos389function colorDelta(img1, img2, k, m, yOnly) {390 let r1 = img1[k + 0];391 let g1 = img1[k + 1];392 let b1 = img1[k + 2];393 let a1 = img1[k + 3];394 let r2 = img2[m + 0];395 let g2 = img2[m + 1];396 let b2 = img2[m + 2];397 let a2 = img2[m + 3];398 if (a1 === a2 && r1 === r2 && g1 === g2 && b1 === b2) return 0;399 if (a1 < 255) {400 a1 /= 255;401 r1 = blend(r1, a1);402 g1 = blend(g1, a1);403 b1 = blend(b1, a1);404 }405 if (a2 < 255) {406 a2 /= 255;407 r2 = blend(r2, a2);408 g2 = blend(g2, a2);409 b2 = blend(b2, a2);410 }411 const y1 = rgb2y(r1, g1, b1);412 const y2 = rgb2y(r2, g2, b2);413 const y = y1 - y2;414 if (yOnly) return y; // brightness difference only415 const i = rgb2i(r1, g1, b1) - rgb2i(r2, g2, b2);416 const q = rgb2q(r1, g1, b1) - rgb2q(r2, g2, b2);417 const delta = 0.5053 * y * y + 0.299 * i * i + 0.1957 * q * q;418 // encode whether the pixel lightens or darkens in the sign419 return y1 > y2 ? -delta : delta;420}421function rgb2y(r, g, b) { return r * 0.29889531 + g * 0.58662247 + b * 0.11448223; }422function rgb2i(r, g, b) { return r * 0.59597799 - g * 0.27417610 - b * 0.32180189; }423function rgb2q(r, g, b) { return r * 0.21147017 - g * 0.52261711 + b * 0.31114694; }424// blend semi-transparent color with white425function blend(c, a) {426 return 255 + (c - 255) * a;427}428function drawPixel(output, pos, r, g, b) {429 output[pos + 0] = r;430 output[pos + 1] = g;431 output[pos + 2] = b;432 output[pos + 3] = 255;433}434function drawGrayPixel(img, i, alpha, output) {435 const r = img[i + 0];436 const g = img[i + 1];437 const b = img[i + 2];438 const val = blend(rgb2y(r, g, b), alpha * img[i + 3] / 255);439 drawPixel(output, i, val, val, val);440}441function resizeCanvasImage(canvas, img, max_width, max_height) {442 if (!canvas) {443 return444 }445 var width = canvas.width;446 var height = canvas.height;447 if (width > height) {448 if (width > max_width) {...
pixelmatch.js
Source: pixelmatch.js
...51 for (let i = 0; i < len; i++) {52 if (a32[i] !== b32[i]) { identical = false; break; }53 }54 if (identical) { // fast path if identical55 for (let i = 0; i < len; i++) drawGrayPixel(img1, 4 * i, options.alpha, output);56 return 0;57 }58 // maximum acceptable square distance between two colors;59 // 35215 is the maximum possible value for the YIQ difference metric60 const threshold2 = options.threshold * options.threshold;61 const maxDelta = 35215 * threshold2;62 let diff = 0;63 const [aaR, aaG, aaB] = options.aaColor;64 const [diffR, diffG, diffB] = options.diffColor;65 // let deltas = []66 // compare each pixel of one image against the other one67 for (let y = 0; y < height; y++) {68 for (let x = 0; x < width; x++) {69 const pos = (y * width + x) * 4;70 // squared YUV distance between colors at this pixel position71 let distance = colorDelta(img1, img2, pos, pos)72 let delta = 1 - (distance / 35215 / threshold2);73 // for display, we offer scaling74 let scaled_delta = Math.max(0, Math.min(1, delta));75 // deltas.push(scaled_delta)76 if (options.colorScale) {77 if (scaled_delta > 0.95)78 drawGrayPixel(img1, pos, options.alpha, output)79 else {80 let is_antialiased = antialiased(img1, x, y, width, height, img2) || antialiased(img2, x, y, width, height, img1);81 if (!options.includeAA && is_antialiased) {82 drawPixel(output, pos, aaR, aaG, aaB);83 } else {84 let color = rgb(interpolateInferno(scaled_delta))85 drawPixel(output, pos, color.r, color.g, color.b); 86 }87 }88 continue89 }90 // the color difference is above the threshold91 if (delta > maxDelta) {92 // check it's a real rendering difference or just anti-aliasing93 if (!options.includeAA && (antialiased(img1, x, y, width, height, img2) ||94 antialiased(img2, x, y, width, height, img1))) {95 // one of the pixels is anti-aliasing; draw as yellow and do not count as difference96 drawPixel(output, pos, aaR, aaG, aaB);97 } else {98 // found substantial difference not caused by anti-aliasing; draw it as red99 drawPixel(output, pos, diffR, diffG, diffB);100 diff++;101 }102 } else {103 // pixels are similar; draw background as grayscale image blended with white104 drawGrayPixel(img1, pos, options.alpha, output);105 }106 }107 }108 // console.log(deltas)109 // console.log("min:", deltas.reduce((a, b) => Math.min(a,b), 10))110 // console.log("max:", deltas.reduce((a, b) => Math.max(a,b), -10))111 // return the number of different pixels112 return diff;113}114function isPixelData(arr) {115 // work around instanceof Uint8Array not working properly in some Jest environments116 return ArrayBuffer.isView(arr) && arr.constructor.BYTES_PER_ELEMENT === 1;117}118// check if a pixel is likely a part of anti-aliasing;119// based on "Anti-aliased Pixel and Intensity Slope Detector" paper by V. Vysniauskas, 2009120function antialiased(img, x1, y1, width, height, img2) {121 const x0 = Math.max(x1 - 1, 0);122 const y0 = Math.max(y1 - 1, 0);123 const x2 = Math.min(x1 + 1, width - 1);124 const y2 = Math.min(y1 + 1, height - 1);125 const pos = (y1 * width + x1) * 4;126 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;127 let min = 0;128 let max = 0;129 let minX, minY, maxX, maxY;130 // go through 8 adjacent pixels131 for (let x = x0; x <= x2; x++) {132 for (let y = y0; y <= y2; y++) {133 if (x === x1 && y === y1) continue;134 // brightness delta between the center pixel and adjacent one135 const delta = colorDelta(img, img, pos, (y * width + x) * 4, true);136 // count the number of equal, darker and brighter adjacent pixels137 if (delta === 0) {138 zeroes++;139 // if found more than 2 equal siblings, it's definitely not anti-aliasing140 if (zeroes > 2) return false;141 // remember the darkest pixel142 } else if (delta < min) {143 min = delta;144 minX = x;145 minY = y;146 // remember the brightest pixel147 } else if (delta > max) {148 max = delta;149 maxX = x;150 maxY = y;151 }152 }153 }154 // if there are no both darker and brighter pixels among siblings, it's not anti-aliasing155 if (min === 0 || max === 0) return false;156 // if either the darkest or the brightest pixel has 3+ equal siblings in both images157 // (definitely not anti-aliased), this pixel is anti-aliased158 return (hasManySiblings(img, minX, minY, width, height) && hasManySiblings(img2, minX, minY, width, height)) ||159 (hasManySiblings(img, maxX, maxY, width, height) && hasManySiblings(img2, maxX, maxY, width, height));160}161// check if a pixel has 3+ adjacent pixels of the same color.162function hasManySiblings(img, x1, y1, width, height) {163 const x0 = Math.max(x1 - 1, 0);164 const y0 = Math.max(y1 - 1, 0);165 const x2 = Math.min(x1 + 1, width - 1);166 const y2 = Math.min(y1 + 1, height - 1);167 const pos = (y1 * width + x1) * 4;168 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;169 // go through 8 adjacent pixels170 for (let x = x0; x <= x2; x++) {171 for (let y = y0; y <= y2; y++) {172 if (x === x1 && y === y1) continue;173 const pos2 = (y * width + x) * 4;174 if (img[pos] === img[pos2] &&175 img[pos + 1] === img[pos2 + 1] &&176 img[pos + 2] === img[pos2 + 2] &&177 img[pos + 3] === img[pos2 + 3]) zeroes++;178 if (zeroes > 2) return true;179 }180 }181 return false;182}183// calculate color difference according to the paper "Measuring perceived color difference184// using YIQ NTSC transmission color space in mobile applications" by Y. Kotsarenko and F. Ramos185function colorDelta(img1, img2, k, m, yOnly) {186 let r1 = img1[k + 0];187 let g1 = img1[k + 1];188 let b1 = img1[k + 2];189 let a1 = img1[k + 3];190 let r2 = img2[m + 0];191 let g2 = img2[m + 1];192 let b2 = img2[m + 2];193 let a2 = img2[m + 3];194 if (a1 === a2 && r1 === r2 && g1 === g2 && b1 === b2) return 0;195 if (a1 < 255) {196 a1 /= 255;197 r1 = blend(r1, a1);198 g1 = blend(g1, a1);199 b1 = blend(b1, a1);200 }201 if (a2 < 255) {202 a2 /= 255;203 r2 = blend(r2, a2);204 g2 = blend(g2, a2);205 b2 = blend(b2, a2);206 }207 const y = rgb2y(r1, g1, b1) - rgb2y(r2, g2, b2);208 if (yOnly) return y; // brightness difference only209 const i = rgb2i(r1, g1, b1) - rgb2i(r2, g2, b2);210 const q = rgb2q(r1, g1, b1) - rgb2q(r2, g2, b2);211 return 0.5053 * y * y + 0.299 * i * i + 0.1957 * q * q;212}213function rgb2y(r, g, b) { return r * 0.29889531 + g * 0.58662247 + b * 0.11448223; }214function rgb2i(r, g, b) { return r * 0.59597799 - g * 0.27417610 - b * 0.32180189; }215function rgb2q(r, g, b) { return r * 0.21147017 - g * 0.52261711 + b * 0.31114694; }216// blend semi-transparent color with white217function blend(c, a) {218 return 255 + (c - 255) * a;219}220function drawPixel(output, pos, r, g, b) {221 output[pos + 0] = r;222 output[pos + 1] = g;223 output[pos + 2] = b;224 output[pos + 3] = 255;225}226function drawGrayPixel(img, pos, alpha, output) {227 const r = img[pos + 0];228 const g = img[pos + 1];229 const b = img[pos + 2];230 const y = rgb2y(r, g, b)231 const val = blend(y, alpha * img[pos + 3] / 255);232 drawPixel(output, pos, val, val, val);233}234// function drawAlphaPixel(output, pos, r, g, b, alpha) {235// const r = img[pos + 0];236// const g = img[pos + 1];237// const b = img[pos + 2];238// const y = rgb2y(r, g, b)239// }240export default pixelmatch;
pixelmatch.mjs
Source: pixelmatch.mjs
...43 if (a32[i] !== b32[i]) { identical = false; break; }44 }45 if (identical) { // fast path if identical46 if (output && !options.diffMask) {47 for (let i = 0; i < len; i++) drawGrayPixel(img1, 4 * i, options.alpha, output);48 }49 return 0;50 }51 // maximum acceptable square distance between two colors;52 // 35215 is the maximum possible value for the YIQ difference metric53 const maxDelta = 35215 * options.threshold * options.threshold;54 let diff = 0;55 // compare each pixel of one image against the other one56 for (let y = 0; y < height; y++) {57 for (let x = 0; x < width; x++) {58 const pos = (y * width + x) * 4;59 // squared YUV distance between colors at this pixel position, negative if the img2 pixel is darker60 const delta = colorDelta(img1, img2, pos, pos);61 // the color difference is above the threshold62 if (Math.abs(delta) > maxDelta) {63 // check it's a real rendering difference or just anti-aliasing64 if (!options.includeAA && (antialiased(img1, x, y, width, height, img2) ||65 antialiased(img2, x, y, width, height, img1))) {66 // one of the pixels is anti-aliasing; draw as yellow and do not count as difference67 // note that we do not include such pixels in a mask68 if (output && !options.diffMask) drawPixel(output, pos, ...options.aaColor);69 } else {70 // found substantial difference not caused by anti-aliasing; draw it as such71 if (output) {72 drawPixel(output, pos, ...(delta < 0 && options.diffColorAlt || options.diffColor));73 }74 diff++;75 }76 } else if (output) {77 // pixels are similar; draw background as grayscale image blended with white78 if (!options.diffMask) drawGrayPixel(img1, pos, options.alpha, output);79 }80 }81 }82 // return the number of different pixels83 return diff;84}85function isPixelData(arr) {86 // work around instanceof Uint8Array not working properly in some Jest environments87 return ArrayBuffer.isView(arr) && arr.constructor.BYTES_PER_ELEMENT === 1;88}89// check if a pixel is likely a part of anti-aliasing;90// based on "Anti-aliased Pixel and Intensity Slope Detector" paper by V. Vysniauskas, 200991function antialiased(img, x1, y1, width, height, img2) {92 const x0 = Math.max(x1 - 1, 0);93 const y0 = Math.max(y1 - 1, 0);94 const x2 = Math.min(x1 + 1, width - 1);95 const y2 = Math.min(y1 + 1, height - 1);96 const pos = (y1 * width + x1) * 4;97 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;98 let min = 0;99 let max = 0;100 let minX, minY, maxX, maxY;101 // go through 8 adjacent pixels102 for (let x = x0; x <= x2; x++) {103 for (let y = y0; y <= y2; y++) {104 if (x === x1 && y === y1) continue;105 // brightness delta between the center pixel and adjacent one106 const delta = colorDelta(img, img, pos, (y * width + x) * 4, true);107 // count the number of equal, darker and brighter adjacent pixels108 if (delta === 0) {109 zeroes++;110 // if found more than 2 equal siblings, it's definitely not anti-aliasing111 if (zeroes > 2) return false;112 // remember the darkest pixel113 } else if (delta < min) {114 min = delta;115 minX = x;116 minY = y;117 // remember the brightest pixel118 } else if (delta > max) {119 max = delta;120 maxX = x;121 maxY = y;122 }123 }124 }125 // if there are no both darker and brighter pixels among siblings, it's not anti-aliasing126 if (min === 0 || max === 0) return false;127 // if either the darkest or the brightest pixel has 3+ equal siblings in both images128 // (definitely not anti-aliased), this pixel is anti-aliased129 return (hasManySiblings(img, minX, minY, width, height) && hasManySiblings(img2, minX, minY, width, height)) ||130 (hasManySiblings(img, maxX, maxY, width, height) && hasManySiblings(img2, maxX, maxY, width, height));131}132// check if a pixel has 3+ adjacent pixels of the same color.133function hasManySiblings(img, x1, y1, width, height) {134 const x0 = Math.max(x1 - 1, 0);135 const y0 = Math.max(y1 - 1, 0);136 const x2 = Math.min(x1 + 1, width - 1);137 const y2 = Math.min(y1 + 1, height - 1);138 const pos = (y1 * width + x1) * 4;139 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;140 // go through 8 adjacent pixels141 for (let x = x0; x <= x2; x++) {142 for (let y = y0; y <= y2; y++) {143 if (x === x1 && y === y1) continue;144 const pos2 = (y * width + x) * 4;145 if (img[pos] === img[pos2] &&146 img[pos + 1] === img[pos2 + 1] &&147 img[pos + 2] === img[pos2 + 2] &&148 img[pos + 3] === img[pos2 + 3]) zeroes++;149 if (zeroes > 2) return true;150 }151 }152 return false;153}154// calculate color difference according to the paper "Measuring perceived color difference155// using YIQ NTSC transmission color space in mobile applications" by Y. Kotsarenko and F. Ramos156function colorDelta(img1, img2, k, m, yOnly) {157 let r1 = img1[k + 0];158 let g1 = img1[k + 1];159 let b1 = img1[k + 2];160 let a1 = img1[k + 3];161 let r2 = img2[m + 0];162 let g2 = img2[m + 1];163 let b2 = img2[m + 2];164 let a2 = img2[m + 3];165 if (a1 === a2 && r1 === r2 && g1 === g2 && b1 === b2) return 0;166 if (a1 < 255) {167 a1 /= 255;168 r1 = blend(r1, a1);169 g1 = blend(g1, a1);170 b1 = blend(b1, a1);171 }172 if (a2 < 255) {173 a2 /= 255;174 r2 = blend(r2, a2);175 g2 = blend(g2, a2);176 b2 = blend(b2, a2);177 }178 const y1 = rgb2y(r1, g1, b1);179 const y2 = rgb2y(r2, g2, b2);180 const y = y1 - y2;181 if (yOnly) return y; // brightness difference only182 const i = rgb2i(r1, g1, b1) - rgb2i(r2, g2, b2);183 const q = rgb2q(r1, g1, b1) - rgb2q(r2, g2, b2);184 const delta = 0.5053 * y * y + 0.299 * i * i + 0.1957 * q * q;185 // encode whether the pixel lightens or darkens in the sign186 return y1 > y2 ? -delta : delta;187}188function rgb2y(r, g, b) { return r * 0.29889531 + g * 0.58662247 + b * 0.11448223; }189function rgb2i(r, g, b) { return r * 0.59597799 - g * 0.27417610 - b * 0.32180189; }190function rgb2q(r, g, b) { return r * 0.21147017 - g * 0.52261711 + b * 0.31114694; }191// blend semi-transparent color with white192function blend(c, a) {193 return 255 + (c - 255) * a;194}195function drawPixel(output, pos, r, g, b) {196 output[pos + 0] = r;197 output[pos + 1] = g;198 output[pos + 2] = b;199 output[pos + 3] = 255;200}201function drawGrayPixel(img, i, alpha, output) {202 const r = img[i + 0];203 const g = img[i + 1];204 const b = img[i + 2];205 const val = blend(rgb2y(r, g, b), alpha * img[i + 3] / 255);206 drawPixel(output, i, val, val, val);...
ImgDiffUtil.js
Source: ImgDiffUtil.js
...25 if (a32[i] !== b32[i]) { identical = false; break; }26 }27 if (identical) { // fast path if identical28 if (output && !options.diffMask) {29 for (let i = 0; i < len; i++) ImgDiffUtil.drawGrayPixel(img1, 4 * i, options.alpha, output);30 }31 return 0;32 }33 // maximum acceptable square distance between two colors;34 // 35215 is the maximum possible value for the YIQ difference metric35 const maxDelta = 35215 * options.threshold * options.threshold;36 let diff = 0;37 // compare each pixel of one image against the other one38 for (let y = 0; y < height; y++) {39 for (let x = 0; x < width; x++) {40 const pos = (y * width + x) * 4;41 // squared YUV distance between colors at this pixel position, negative if the img2 pixel is darker42 const delta = ImgDiffUtil.colorDelta(img1, img2, pos, pos);43 // the color difference is above the threshold44 if (Math.abs(delta) > maxDelta) {45 // check it's a real rendering difference or just anti-aliasing46 if (!options.includeAA && (ImgDiffUtil.antialiased(img1, x, y, width, height, img2) ||47 ImgDiffUtil.antialiased(img2, x, y, width, height, img1))) {48 // one of the pixels is anti-aliasing; draw as yellow and do not count as difference49 // note that we do not include such pixels in a mask50 if (output && !options.diffMask) ImgDiffUtil.drawPixel(output, pos, ...options.aaColor);51 } else {52 // found substantial difference not caused by anti-aliasing; draw it as such53 if (output) {54 ImgDiffUtil.drawPixel(output, pos, ...(delta < 0 && options.diffColorAlt || options.diffColor));55 }56 diff++;57 }58 } else if (output) {59 // pixels are similar; draw background as grayscale image blended with white60 if (!options.diffMask) ImgDiffUtil.drawGrayPixel(img1, pos, options.alpha, output);61 }62 }63 }64 // return the number of different pixels65 return diff;66 },67 isPixelData: function (arr) {68 // work around instanceof Uint8Array not working properly in some Jest environments69 return ArrayBuffer.isView(arr) && arr.constructor.BYTES_PER_ELEMENT === 1;70 },71// check if a pixel is likely a part of anti-aliasing;72// based on "Anti-aliased Pixel and Intensity Slope Detector" paper by V. Vysniauskas, 200973 antialiased: function (img, x1, y1, width, height, img2) {74 const x0 = Math.max(x1 - 1, 0);...
index.js
Source: index.js
...25 if (a32[i] !== b32[i]) { identical = false; break; }26 }27 if (identical) { // fast path if identical28 if (output && !options.diffMask) {29 for (let i = 0; i < len; i++) drawGrayPixel(img1, 4 * i, options.alpha, output);30 }31 return 0;32 }33 // maximum acceptable square distance between two colors;34 // 35215 is the maximum possible value for the YIQ difference metric35 const maxDelta = 35215 * options.threshold * options.threshold;36 let diff = 0;37 // compare each pixel of one image against the other one38 for (let y = 0; y < height; y++) {39 for (let x = 0; x < width; x++) {40 const pos = (y * width + x) * 4;41 // squared YUV distance between colors at this pixel position, negative if the img2 pixel is darker42 const delta = colorDelta(img1, img2, pos, pos);43 // the color difference is above the threshold44 if (Math.abs(delta) > maxDelta) {45 // check it's a real rendering difference or just anti-aliasing46 if (!options.includeAA && (antialiased(img1, x, y, width, height, img2) ||47 antialiased(img2, x, y, width, height, img1))) {48 // one of the pixels is anti-aliasing; draw as yellow and do not count as difference49 // note that we do not include such pixels in a mask50 if (output && !options.diffMask) drawPixel(output, pos, ...options.aaColor);51 } else {52 // found substantial difference not caused by anti-aliasing; draw it as such53 if (output) {54 drawPixel(output, pos, ...(delta < 0 && options.diffColorAlt || options.diffColor));55 }56 diff++;57 }58 } else if (output) {59 // pixels are similar; draw background as grayscale image blended with white60 if (!options.diffMask) drawGrayPixel(img1, pos, options.alpha, output);61 }62 }63 }64 // return the number of different pixels65 return diff;66}67function isPixelData(arr) {68 // work around instanceof Uint8Array not working properly in some Jest environments69 return ArrayBuffer.isView(arr) && arr.constructor.BYTES_PER_ELEMENT === 1;70}71// check if a pixel is likely a part of anti-aliasing;72// based on "Anti-aliased Pixel and Intensity Slope Detector" paper by V. Vysniauskas, 200973function antialiased(img, x1, y1, width, height, img2) {74 const x0 = Math.max(x1 - 1, 0);75 const y0 = Math.max(y1 - 1, 0);76 const x2 = Math.min(x1 + 1, width - 1);77 const y2 = Math.min(y1 + 1, height - 1);78 const pos = (y1 * width + x1) * 4;79 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;80 let min = 0;81 let max = 0;82 let minX, minY, maxX, maxY;83 // go through 8 adjacent pixels84 for (let x = x0; x <= x2; x++) {85 for (let y = y0; y <= y2; y++) {86 if (x === x1 && y === y1) continue;87 // brightness delta between the center pixel and adjacent one88 const delta = colorDelta(img, img, pos, (y * width + x) * 4, true);89 // count the number of equal, darker and brighter adjacent pixels90 if (delta === 0) {91 zeroes++;92 // if found more than 2 equal siblings, it's definitely not anti-aliasing93 if (zeroes > 2) return false;94 // remember the darkest pixel95 } else if (delta < min) {96 min = delta;97 minX = x;98 minY = y;99 // remember the brightest pixel100 } else if (delta > max) {101 max = delta;102 maxX = x;103 maxY = y;104 }105 }106 }107 // if there are no both darker and brighter pixels among siblings, it's not anti-aliasing108 if (min === 0 || max === 0) return false;109 // if either the darkest or the brightest pixel has 3+ equal siblings in both images110 // (definitely not anti-aliased), this pixel is anti-aliased111 return (hasManySiblings(img, minX, minY, width, height) && hasManySiblings(img2, minX, minY, width, height)) ||112 (hasManySiblings(img, maxX, maxY, width, height) && hasManySiblings(img2, maxX, maxY, width, height));113}114// check if a pixel has 3+ adjacent pixels of the same color.115function hasManySiblings(img, x1, y1, width, height) {116 const x0 = Math.max(x1 - 1, 0);117 const y0 = Math.max(y1 - 1, 0);118 const x2 = Math.min(x1 + 1, width - 1);119 const y2 = Math.min(y1 + 1, height - 1);120 const pos = (y1 * width + x1) * 4;121 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;122 // go through 8 adjacent pixels123 for (let x = x0; x <= x2; x++) {124 for (let y = y0; y <= y2; y++) {125 if (x === x1 && y === y1) continue;126 const pos2 = (y * width + x) * 4;127 if (img[pos] === img[pos2] &&128 img[pos + 1] === img[pos2 + 1] &&129 img[pos + 2] === img[pos2 + 2] &&130 img[pos + 3] === img[pos2 + 3]) zeroes++;131 if (zeroes > 2) return true;132 }133 }134 return false;135}136// calculate color difference according to the paper "Measuring perceived color difference137// using YIQ NTSC transmission color space in mobile applications" by Y. Kotsarenko and F. Ramos138function colorDelta(img1, img2, k, m, yOnly) {139 let r1 = img1[k + 0];140 let g1 = img1[k + 1];141 let b1 = img1[k + 2];142 let a1 = img1[k + 3];143 let r2 = img2[m + 0];144 let g2 = img2[m + 1];145 let b2 = img2[m + 2];146 let a2 = img2[m + 3];147 if (a1 === a2 && r1 === r2 && g1 === g2 && b1 === b2) return 0;148 if (a1 < 255) {149 a1 /= 255;150 r1 = blend(r1, a1);151 g1 = blend(g1, a1);152 b1 = blend(b1, a1);153 }154 if (a2 < 255) {155 a2 /= 255;156 r2 = blend(r2, a2);157 g2 = blend(g2, a2);158 b2 = blend(b2, a2);159 }160 const y1 = rgb2y(r1, g1, b1);161 const y2 = rgb2y(r2, g2, b2);162 const y = y1 - y2;163 if (yOnly) return y; // brightness difference only164 const i = rgb2i(r1, g1, b1) - rgb2i(r2, g2, b2);165 const q = rgb2q(r1, g1, b1) - rgb2q(r2, g2, b2);166 const delta = 0.5053 * y * y + 0.299 * i * i + 0.1957 * q * q;167 // encode whether the pixel lightens or darkens in the sign168 return y1 > y2 ? -delta : delta;169}170function rgb2y(r, g, b) { return r * 0.29889531 + g * 0.58662247 + b * 0.11448223; }171function rgb2i(r, g, b) { return r * 0.59597799 - g * 0.27417610 - b * 0.32180189; }172function rgb2q(r, g, b) { return r * 0.21147017 - g * 0.52261711 + b * 0.31114694; }173// blend semi-transparent color with white174function blend(c, a) {175 return 255 + (c - 255) * a;176}177function drawPixel(output, pos, r, g, b) {178 output[pos + 0] = r;179 output[pos + 1] = g;180 output[pos + 2] = b;181 output[pos + 3] = 255;182}183function drawGrayPixel(img, i, alpha, output) {184 const r = img[i + 0];185 const g = img[i + 1];186 const b = img[i + 2];187 const val = blend(rgb2y(r, g, b), alpha * img[i + 3] / 255);188 drawPixel(output, i, val, val, val);...
pixelmatch-5.2.0.js
Source: pixelmatch-5.2.0.js
...25 if (a32[i] !== b32[i]) { identical = false; break; }26 }27 if (identical) { // fast path if identical28 if (output && !options.diffMask) {29 for (let i = 0; i < len; i++) drawGrayPixel(img1, 4 * i, options.alpha, output);30 }31 return 0;32 }33 // maximum acceptable square distance between two colors;34 // 35215 is the maximum possible value for the YIQ difference metric35 const maxDelta = 35215 * options.threshold * options.threshold;36 let diff = 0;37 // compare each pixel of one image against the other one38 for (let y = 0; y < height; y++) {39 for (let x = 0; x < width; x++) {40 const pos = (y * width + x) * 4;41 // squared YUV distance between colors at this pixel position, negative if the img2 pixel is darker42 const delta = colorDelta(img1, img2, pos, pos);43 // the color difference is above the threshold44 if (Math.abs(delta) > maxDelta) {45 // check it's a real rendering difference or just anti-aliasing46 if (!options.includeAA && (antialiased(img1, x, y, width, height, img2) ||47 antialiased(img2, x, y, width, height, img1))) {48 // one of the pixels is anti-aliasing; draw as yellow and do not count as difference49 // note that we do not include such pixels in a mask50 if (output && !options.diffMask) drawPixel(output, pos, ...options.aaColor);51 } else {52 // found substantial difference not caused by anti-aliasing; draw it as such53 if (output) {54 drawPixel(output, pos, ...(delta < 0 && options.diffColorAlt || options.diffColor));55 }56 diff++;57 }58 } else if (output) {59 // pixels are similar; draw background as grayscale image blended with white60 if (!options.diffMask) drawGrayPixel(img1, pos, options.alpha, output);61 }62 }63 }64 // return the number of different pixels65 return diff;66}67function isPixelData(arr) {68 // work around instanceof Uint8Array not working properly in some Jest environments69 return ArrayBuffer.isView(arr) && arr.constructor.BYTES_PER_ELEMENT === 1;70}71// check if a pixel is likely a part of anti-aliasing;72// based on "Anti-aliased Pixel and Intensity Slope Detector" paper by V. Vysniauskas, 200973function antialiased(img, x1, y1, width, height, img2) {74 const x0 = Math.max(x1 - 1, 0);75 const y0 = Math.max(y1 - 1, 0);76 const x2 = Math.min(x1 + 1, width - 1);77 const y2 = Math.min(y1 + 1, height - 1);78 const pos = (y1 * width + x1) * 4;79 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;80 let min = 0;81 let max = 0;82 let minX, minY, maxX, maxY;83 // go through 8 adjacent pixels84 for (let x = x0; x <= x2; x++) {85 for (let y = y0; y <= y2; y++) {86 if (x === x1 && y === y1) continue;87 // brightness delta between the center pixel and adjacent one88 const delta = colorDelta(img, img, pos, (y * width + x) * 4, true);89 // count the number of equal, darker and brighter adjacent pixels90 if (delta === 0) {91 zeroes++;92 // if found more than 2 equal siblings, it's definitely not anti-aliasing93 if (zeroes > 2) return false;94 // remember the darkest pixel95 } else if (delta < min) {96 min = delta;97 minX = x;98 minY = y;99 // remember the brightest pixel100 } else if (delta > max) {101 max = delta;102 maxX = x;103 maxY = y;104 }105 }106 }107 // if there are no both darker and brighter pixels among siblings, it's not anti-aliasing108 if (min === 0 || max === 0) return false;109 // if either the darkest or the brightest pixel has 3+ equal siblings in both images110 // (definitely not anti-aliased), this pixel is anti-aliased111 return (hasManySiblings(img, minX, minY, width, height) && hasManySiblings(img2, minX, minY, width, height)) ||112 (hasManySiblings(img, maxX, maxY, width, height) && hasManySiblings(img2, maxX, maxY, width, height));113}114// check if a pixel has 3+ adjacent pixels of the same color.115function hasManySiblings(img, x1, y1, width, height) {116 const x0 = Math.max(x1 - 1, 0);117 const y0 = Math.max(y1 - 1, 0);118 const x2 = Math.min(x1 + 1, width - 1);119 const y2 = Math.min(y1 + 1, height - 1);120 const pos = (y1 * width + x1) * 4;121 let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0;122 // go through 8 adjacent pixels123 for (let x = x0; x <= x2; x++) {124 for (let y = y0; y <= y2; y++) {125 if (x === x1 && y === y1) continue;126 const pos2 = (y * width + x) * 4;127 if (img[pos] === img[pos2] &&128 img[pos + 1] === img[pos2 + 1] &&129 img[pos + 2] === img[pos2 + 2] &&130 img[pos + 3] === img[pos2 + 3]) zeroes++;131 if (zeroes > 2) return true;132 }133 }134 return false;135}136// calculate color difference according to the paper "Measuring perceived color difference137// using YIQ NTSC transmission color space in mobile applications" by Y. Kotsarenko and F. Ramos138function colorDelta(img1, img2, k, m, yOnly) {139 let r1 = img1[k + 0];140 let g1 = img1[k + 1];141 let b1 = img1[k + 2];142 let a1 = img1[k + 3];143 let r2 = img2[m + 0];144 let g2 = img2[m + 1];145 let b2 = img2[m + 2];146 let a2 = img2[m + 3];147 if (a1 === a2 && r1 === r2 && g1 === g2 && b1 === b2) return 0;148 if (a1 < 255) {149 a1 /= 255;150 r1 = blend(r1, a1);151 g1 = blend(g1, a1);152 b1 = blend(b1, a1);153 }154 if (a2 < 255) {155 a2 /= 255;156 r2 = blend(r2, a2);157 g2 = blend(g2, a2);158 b2 = blend(b2, a2);159 }160 const y1 = rgb2y(r1, g1, b1);161 const y2 = rgb2y(r2, g2, b2);162 const y = y1 - y2;163 if (yOnly) return y; // brightness difference only164 const i = rgb2i(r1, g1, b1) - rgb2i(r2, g2, b2);165 const q = rgb2q(r1, g1, b1) - rgb2q(r2, g2, b2);166 const delta = 0.5053 * y * y + 0.299 * i * i + 0.1957 * q * q;167 // encode whether the pixel lightens or darkens in the sign168 return y1 > y2 ? -delta : delta;169}170function rgb2y(r, g, b) { return r * 0.29889531 + g * 0.58662247 + b * 0.11448223; }171function rgb2i(r, g, b) { return r * 0.59597799 - g * 0.27417610 - b * 0.32180189; }172function rgb2q(r, g, b) { return r * 0.21147017 - g * 0.52261711 + b * 0.31114694; }173// blend semi-transparent color with white174function blend(c, a) {175 return 255 + (c - 255) * a;176}177function drawPixel(output, pos, r, g, b) {178 output[pos + 0] = r;179 output[pos + 1] = g;180 output[pos + 2] = b;181 output[pos + 3] = 255;182}183function drawGrayPixel(img, i, alpha, output) {184 const r = img[i + 0];185 const g = img[i + 1];186 const b = img[i + 2];187 const val = blend(rgb2y(r, g, b), alpha * img[i + 3] / 255);188 drawPixel(output, i, val, val, val);...
Using AI Code Generation
1const { drawGrayPixel } = require('playwright/lib/server/chromium/crPage');2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext();5 const page = await context.newPage();6 const rect = await page.evaluate(() => {7 const rect = document.querySelector('#js-link-box-en').getBoundingClientRect();8 return {9 };10 });11 await drawGrayPixel(page, rect.x, rect.y);12 await page.screenshot({ path: 'wikipedia.png' });13 await browser.close();14})();15const { drawGrayPixel } = require('playwright/lib/server/chromium/crPage');16(async () => {17 const browser = await chromium.launch();18 const context = await browser.newContext();19 const page = await context.newPage();20 const rect = await page.evaluate(() => {21 const rect = document.querySelector('#js-link-box-en').getBoundingClientRect();22 return {23 };24 });25 await drawGrayPixel(page, rect.x, rect.y);26 await page.screenshot({ path: 'wikipedia.png' });27 await browser.close();28})();29const { drawGrayPixel } = require('playwright/lib/server/chromium/crPage');30(async () => {31 const browser = await chromium.launch();32 const context = await browser.newContext();33 const page = await context.newPage();34 const rect = await page.evaluate(() => {35 const rect = document.querySelector('#js-link-box-en').getBoundingClientRect();36 return {37 };38 });39 await drawGrayPixel(page, rect.x, rect.y);40 await page.screenshot({ path: 'w
Using AI Code Generation
1const {chromium} = require('playwright');2const {drawGrayPixel} = require('playwright/lib/server/screencast/screencast');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.screenshot({ path: 'example.png' });8 await browser.close();9})();10const { drawGrayPixel } = require('./drawGrayPixel');11class Screencast {12 constructor(page, context, options) {13 this._page = page;14 this._context = context;15 this._options = options;16 this._video = new VideoWriter(options);17 this._pageProxy = page._delegate;18 this._pageProxy.on(PageProxyEvents.ScreencastFrame, this._onScreencastFrame.bind(this));19 this._pageProxy.on(PageProxyEvents.ScreencastVisibilityChanged, this._onScreencastVisibilityChanged.bind(this));20 this._pageProxy.on(PageProxyEvents.Close, () => this.stop());21 this._page.on(Page.Events.Close, () => this.stop());22 this._page.on(Page.Events.Popup, popup => this._onPopup(popup));23 this._page.on(Page.Events.Video, video => this._onVideo(video));24 this._page.on(Page.Events.Console, message => this._onConsoleMessage(message));25 this._page.on(Page.Events.Download, download => this._onDownload(download));26 this._page.on(Page.Events.Request, request => this._onRequest(request));27 this._page.on(Page.Events.Response, response => this._onResponse(response));28 this._page.on(Page.Events.RequestFailed, request => this._onRequestFailed(request));29 this._page.on(Page.Events.RequestFinished, request => this._onRequestFinished(request));30 this._page.on(Page.Events.DOMContentLoaded, () => this._onDOMContentLoaded());31 this._page.on(Page.Events.Load, () => this._onLoad());32 this._page.on(Page.Events.FrameAttached, frame => this._onFrameAttached(frame));33 this._page.on(Page.Events.FrameNavigated, frame => this._onFrameNavigated(frame));34 this._page.on(Page.Events
Using AI Code Generation
1const { drawGrayPixel } = require('playwright-core/lib/server/chromium/crPage');2const { chromium } = require('playwright-core');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.evaluate(() => {8 drawGrayPixel(10, 10, 1, 1, 0.5);9 });10 await page.screenshot({ path: 'example.png' });11 await browser.close();12})();13const { drawGrayPixel } = require('playwright-core/lib/server/chromium/crPage');14const { chromium } = require('playwright-core');15(async () => {16 const browser = await chromium.launch();17 const context = await browser.newContext();18 const page = await context.newPage();19 await page.evaluate(() => {20 drawGrayPixel(10, 10, 1, 1, 0.5);21 });22 await page.screenshot({ path: 'example.png' });23 await browser.close();24})();25const { drawGrayPixel } = require('playwright-core/lib/server/chromium/crPage');26const { chromium } = require('playwright-core');27(async () => {28 const browser = await chromium.launch();29 const context = await browser.newContext();30 const page = await context.newPage();31 await page.evaluate(() => {32 drawGrayPixel(10, 10, 1, 1, 0.5);33 });34 await page.screenshot({ path: 'example.png' });35 await browser.close();36})();
Using AI Code Generation
1const { drawGrayPixel } = require('playwright-core/lib/server/chromium/crBrowser');2const { chromium } = require('playwright-core');3(async () => {4 const browser = await chromium.launch({ headless: false });5 const page = await browser.newPage();6 const context = await page.context();7 const frame = page.mainFrame();8 await drawGrayPixel(context, frame, 10, 10);9 await page.screenshot({ path: 'google.png' });10 await browser.close();11})();
Using AI Code Generation
1const { devices } = require('@playwright/test');2const iPhone = devices['iPhone 11 Pro'];3const drawGrayPixel = async (page, x, y) => {4 await page.evaluate(async (x, y) => {5 const context = window._playwrightInternal.context;6 const canvas = context.canvas;7 const context2d = canvas.getContext('2d');8 context2d.fillStyle = 'gray';9 context2d.fillRect(x, y, 1, 1);10 }, x, y);11};12(async () => {13 const browser = await chromium.launch();14 const context = await browser.newContext({15 viewport: { width: 400, height: 400 },16 });17 const page = await context.newPage();18 await drawGrayPixel(page, 10, 10);19 await page.screenshot({ path: 'example.png' });20 await browser.close();21})();22test.describe('Test', () => {23 test.beforeEach(async ({ page }) => {24 });25 test('should work', async ({ page }) => {26 await drawGrayPixel(page, 10, 10);27 await page.screenshot({ path: 'example.png' });28 });29});
Using AI Code Generation
1const { drawGrayPixel } = require('playwright/lib/server/screencast/screencast');2drawGrayPixel(0, 0, 0, 0, 0);3const { drawGrayPixel } = require('playwright/lib/server/screencast/screencast');4drawGrayPixel(0, 0, 0, 0, 0);5const { drawGrayPixel } = require('playwright/lib/server/screencast/screencast');6drawGrayPixel(0, 0, 0, 0, 0);7const { drawGrayPixel } = require('playwright/lib/server/screencast/screencast');8drawGrayPixel(0, 0, 0, 0, 0);9const { drawGrayPixel } = require('playwright/lib/server/screencast/screencast');10drawGrayPixel(0, 0, 0, 0, 0);11const { drawGrayPixel } = require('playwright/lib/server/screencast/screencast');12drawGrayPixel(0, 0, 0, 0, 0);13const { drawGrayPixel } = require('playwright/lib/server/screencast/screencast');14drawGrayPixel(0, 0, 0, 0, 0);15const { drawGrayPixel } = require('playwright/lib/server/screencast/screencast');16drawGrayPixel(0, 0, 0, 0, 0);17const { drawGrayPixel } = require('playwright/lib/server/screencast/screencast');18drawGrayPixel(0, 0, 0, 0, 0);19const { drawGrayPixel } = require('playwright
Using AI Code Generation
1const { drawGrayPixel } = require('@playwright/test/lib/server/trace/recorder/recorderApp');2drawGrayPixel({ x: 100, y: 100 });3const { test } = require('@playwright/test');4test('draw gray pixel', async ({ page }) => {5 await page.evaluate(() => {6 const { drawGrayPixel } = require('@playwright/test/lib/server/trace/recorder/recorderApp');7 drawGrayPixel({ x: 100, y: 100 });8 });9});
Using AI Code Generation
1await page.evaluate(async (x, y, color) => {2 await window.__playwright__internal__object(drawGrayPixel)(x, y, color);3 }, x, y, color);4await page.evaluate(async (x, y, color) => {5 await window.__playwright__internal__object(drawGreenPixel)(x, y, color);6 }, x, y, color);7await page.evaluate(async (x, y, color) => {8 await window.__playwright__internal__object(drawRedPixel)(x, y, color);9 }, x, y, color);10await page.evaluate(async (x, y, color) => {11 await window.__playwright__internal__object(drawBluePixel)(x, y, color);12 }, x, y, color);13await page.evaluate(async (x, y, color) => {14 await window.__playwright__internal__object(drawYellowPixel)(x, y, color);15 }, x, y, color);16await page.evaluate(async (x, y, color) => {17 await window.__playwright__internal__object(drawWhitePixel)(x, y, color);18 }, x, y, color);19await page.evaluate(async (x, y, color) => {20 await window.__playwright__internal__object(drawBlackPixel)(x, y, color);21 }, x, y, color);22await page.evaluate(async (x, y, color) => {23 await window.__playwright__internal__object(drawCyanPixel)(x, y, color);24 }, x, y, color);25await page.evaluate(async (x, y, color) => {26 await window.__playwright__internal__object(drawMagentaPixel)(x, y, color);27 }, x, y, color);
Using AI Code Generation
1const { drawGrayPixel } = require('playwright/lib/server/chromium/crPixel');2const browser = await chromium.launch();3const context = await browser.newContext();4const page = await context.newPage();5await page.setViewportSize({ width: 100, height: 100 });6await page.evaluate((width, height, drawGrayPixel) => {7 const canvas = document.createElement('canvas');8 canvas.width = width;9 canvas.height = height;10 document.body.appendChild(canvas);11 const ctx = canvas.getContext('2d');12 const imageData = ctx.createImageData(width, height);13 drawGrayPixel(imageData, 0, 0, 0, 0.5);14 ctx.putImageData(imageData, 0, 0);15}, 100, 100, drawGrayPixel);16await page.screenshot({ path: 'screenshot.png' });17await browser.close();18{19 "dependencies": {20 }21}
Jest + Playwright - Test callbacks of event-based DOM library
firefox browser does not start in playwright
Is it possible to get the selector from a locator object in playwright?
How to run a list of test suites in a single file concurrently in jest?
Running Playwright in Azure Function
firefox browser does not start in playwright
This question is quite close to a "need more focus" question. But let's try to give it some focus:
Does Playwright has access to the cPicker object on the page? Does it has access to the window object?
Yes, you can access both cPicker and the window object inside an evaluate call.
Should I trigger the events from the HTML file itself, and in the callbacks, print in the DOM the result, in some dummy-element, and then infer from that dummy element text that the callbacks fired?
Exactly, or you can assign values to a javascript variable:
const cPicker = new ColorPicker({
onClickOutside(e){
},
onInput(color){
window['color'] = color;
},
onChange(color){
window['result'] = color;
}
})
And then
it('Should call all callbacks with correct arguments', async() => {
await page.goto(`http://localhost:5000/tests/visual/basic.html`, {waitUntil:'load'})
// Wait until the next frame
await page.evaluate(() => new Promise(requestAnimationFrame))
// Act
// Assert
const result = await page.evaluate(() => window['color']);
// Check the value
})
Check out the latest blogs from LambdaTest on this topic:
Native apps are developed specifically for one platform. Hence they are fast and deliver superior performance. They can be downloaded from various app stores and are not accessible through browsers.
One of the essential parts when performing automated UI testing, whether using Selenium or another framework, is identifying the correct web elements the tests will interact with. However, if the web elements are not located correctly, you might get NoSuchElementException in Selenium. This would cause a false negative result because we won’t get to the actual functionality check. Instead, our test will fail simply because it failed to interact with the correct element.
Smartphones have changed the way humans interact with technology. Be it travel, fitness, lifestyle, video games, or even services, it’s all just a few touches away (quite literally so). We only need to look at the growing throngs of smartphone or tablet users vs. desktop users to grasp this reality.
As part of one of my consulting efforts, I worked with a mid-sized company that was looking to move toward a more agile manner of developing software. As with any shift in work style, there is some bewilderment and, for some, considerable anxiety. People are being challenged to leave their comfort zones and embrace a continuously changing, dynamic working environment. And, dare I say it, testing may be the most ‘disturbed’ of the software roles in agile development.
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!