Best JavaScript code snippet using playwright-internal
android-shell-app.js
Source: android-shell-app.js
...15} = ExponentTools;16async function sedInPlaceAsync(...args) {17 const isDarwin = /^darwin/.test(process.platform);18 if (isDarwin) {19 await spawnAsync(`sed`, ['-i', `''`, ...args]);20 } else {21 await spawnAsync(`sed`, ['-i', ...args]);22 }23}24exports.createAndroidShellAppAsync = async function createAndroidShellAppAsync(25 args26) {27 let {28 url,29 sdkVersion,30 androidPackage,31 privateConfigFile,32 keystore,33 alias,34 keystorePassword,35 keyPassword,36 outputFile,37 } = args;38 let manifest = await getManifestAsync(url, {39 'Exponent-SDK-Version': sdkVersion,40 'Exponent-Platform': 'android',41 });42 if (!privateConfigFile) {43 crayon.yellow.warn('Warning: No config file specified.');44 }45 let fullManifestUrl = `${url.replace('exp://', 'https://')}/index.exp`;46 let javaPackage;47 let versionCode = 1;48 if (!manifest.android) {49 javaPackage = androidPackage;50 } else {51 javaPackage = manifest.android.package || androidPackage;52 if (manifest.android.versionCode) {53 versionCode = manifest.android.versionCode;54 }55 }56 if (!javaPackage) {57 throw new Error(58 'Must specify androidPackage option (either from manifest or on command line).'59 );60 }61 let name = manifest.name;62 let iconUrl = manifest.android && manifest.android.iconUrl63 ? manifest.android.iconUrl64 : manifest.iconUrl;65 let scheme = manifest.scheme;66 let bundleUrl = manifest.bundleUrl;67 let notificationIconUrl = manifest.notification68 ? manifest.notification.iconUrl69 : null;70 let version = manifest.version ? manifest.version : '0.0.0';71 let shellPath = '../android-shell-app/';72 await spawnAsync(`/bin/rm`, ['-rf', shellPath]);73 await spawnAsync(`/bin/mkdir`, [shellPath]);74 await spawnAsync(75 `../../tools-public/generate-dynamic-macros-android.sh`,76 [],77 {78 stdio: 'inherit',79 cwd: path.join(__dirname, '..', 'android', 'app'),80 }81 ); // populate android template files now since we take out the prebuild step later on82 await spawnAsync(`/bin/cp`, [83 '-r',84 '../android/expoview',85 `${shellPath}/expoview`,86 ]);87 await spawnAsync(`/bin/cp`, [88 '-r',89 '../android/ReactCommon',90 `${shellPath}/ReactCommon`,91 ]);92 await spawnAsync(`/bin/cp`, [93 '-r',94 '../android/ReactAndroid',95 `${shellPath}/ReactAndroid`,96 ]);97 await spawnAsync(`/bin/cp`, ['../android/android.iml', `${shellPath}/`]);98 await spawnAsync(`/bin/cp`, ['-r', '../android/app', `${shellPath}/app`]);99 await spawnAsync(`/bin/cp`, ['../android/build.gradle', `${shellPath}/`]);100 await spawnAsync(`/bin/cp`, [101 '-r',102 '../android/gradle',103 `${shellPath}/gradle`,104 ]);105 await spawnAsync(`/bin/cp`, [106 '../android/gradle.properties',107 `${shellPath}/`,108 ]);109 await spawnAsync(`/bin/cp`, ['../android/gradlew', `${shellPath}/`]);110 await spawnAsync(`/bin/cp`, ['../android/local.properties', `${shellPath}/`]);111 await spawnAsync(`/bin/cp`, ['../android/settings.gradle', `${shellPath}/`]);112 // Clean build directories113 await spawnAsync(`/bin/rm`, ['-rf', `${shellPath}app/build/`]);114 // Package115 shell.sed(116 '-i',117 `applicationId 'host.exp.exponent'`,118 `applicationId '${javaPackage}'`,119 `${shellPath}app/build.gradle`120 );121 await sedInPlaceAsync(122 '-e',123 `s/android:name="host.exp.exponent"/android:name="${javaPackage}"/g`,124 `${shellPath}app/src/main/AndroidManifest.xml`125 );126 // Versions127 let buildGradleFile = await fs.promise.readFile(128 `${shellPath}app/build.gradle`,129 'utf8'130 );131 let androidVersion = buildGradleFile.match(/versionName '(\S+)'/)[1];132 shell.sed(133 '-i',134 'VERSION_NAME = null',135 `VERSION_NAME = "${androidVersion}"`,136 `${shellPath}expoview/src/main/java/host/exp/exponent/Constants.java`137 );138 await sedInPlaceAsync(139 '-e',140 `/BEGIN\ VERSIONS/,/END\ VERSIONS/d`,141 `${shellPath}app/build.gradle`142 );143 shell.sed(144 '-i',145 '// ADD VERSIONS HERE',146 `versionCode ${versionCode}147 versionName '${version}'`,148 `${shellPath}app/build.gradle`149 );150 // Remove Exponent build script151 shell.sed(152 '-i',153 `preBuild.dependsOn generateDynamicMacros`,154 ``,155 `${shellPath}expoview/build.gradle`156 );157 // change javaMaxHeapSize158 shell.sed(159 '-i',160 `javaMaxHeapSize "8g"`,161 `javaMaxHeapSize "6g"`,162 `${shellPath}app/build.gradle`163 );164 // Push notifications165 shell.sed(166 '-i',167 '"package_name": "host.exp.exponent"',168 `"package_name": "${javaPackage}"`,169 `${shellPath}app/google-services.json`170 ); // TODO: actually use the correct file171 // TODO: probably don't need this in both places172 await sedInPlaceAsync(173 '-e',174 `s/host.exp.exponent.permission.C2D_MESSAGE/${javaPackage}.permission.C2D_MESSAGE/g`,175 `${shellPath}app/src/main/AndroidManifest.xml`176 );177 await sedInPlaceAsync(178 '-e',179 `s/host.exp.exponent.permission.C2D_MESSAGE/${javaPackage}.permission.C2D_MESSAGE/g`,180 `${shellPath}expoview/src/main/AndroidManifest.xml`181 );182 // Set INITIAL_URL and SHELL_APP_SCHEME183 shell.sed(184 '-i',185 'INITIAL_URL = null',186 `INITIAL_URL = "${url}"`,187 `${shellPath}expoview/src/main/java/host/exp/exponent/Constants.java`188 );189 if (scheme) {190 shell.sed(191 '-i',192 'SHELL_APP_SCHEME = null',193 `SHELL_APP_SCHEME = "${scheme}"`,194 `${shellPath}expoview/src/main/java/host/exp/exponent/Constants.java`195 );196 }197 // App name198 shell.sed(199 '-i',200 '"app_name">Expo',201 `"app_name">${name}`,202 `${shellPath}app/src/main/res/values/strings.xml`203 );204 // Remove exp:// scheme205 await sedInPlaceAsync(206 '-e',207 `/DELETE\ AFTER/,/DELETE\ BEFORE/d`,208 `${shellPath}app/src/main/AndroidManifest.xml`209 );210 // Add shell app scheme211 if (scheme) {212 shell.sed(213 '-i',214 '<!-- ADD SHELL SCHEME HERE -->',215 `<intent-filter>216 <data android:scheme="${scheme}"/>217 <action android:name="android.intent.action.VIEW"/>218 <category android:name="android.intent.category.DEFAULT"/>219 <category android:name="android.intent.category.BROWSABLE"/>220 </intent-filter>`,221 `${shellPath}app/src/main/AndroidManifest.xml`222 );223 }224 // OAuth redirect scheme225 shell.sed(226 '-i',227 '<data android:scheme="host.exp.exponent" android:path="oauthredirect"/>',228 `<data android:scheme="${javaPackage}" android:path="oauthredirect"/>`,229 `${shellPath}app/src/main/AndroidManifest.xml`230 );231 // Embed manifest and bundle232 await fs.promise.writeFile(233 `${shellPath}app/src/main/assets/shell-app-manifest.json`,234 JSON.stringify(manifest)235 );236 await saveUrlToPathAsync(237 bundleUrl,238 `${shellPath}app/src/main/assets/shell-app.bundle`239 );240 shell.sed(241 '-i',242 '// ADD EMBEDDED RESPONSES HERE',243 `244 embeddedResponses.add(new EmbeddedResponse("${fullManifestUrl}", "assets://shell-app-manifest.json", "application/json"));245 embeddedResponses.add(new EmbeddedResponse("${bundleUrl}", "assets://shell-app.bundle", "application/javascript"));`,246 `${shellPath}expoview/src/main/java/host/exp/exponent/Constants.java`247 );248 // Icon249 if (iconUrl) {250 await spawnAsync(`find`, [251 `${shellPath}app/src/main/res`,252 '-iname',253 'ic_launcher.png',254 '-delete',255 ]);256 await saveUrlToPathAsync(257 iconUrl,258 `${shellPath}app/src/main/res/mipmap-hdpi/ic_launcher.png`259 );260 await spawnAsync(`find`, [261 `${shellPath}expoview/src/main/res`,262 '-iname',263 'ic_launcher.png',264 '-delete',265 ]);266 await saveUrlToPathAsync(267 iconUrl,268 `${shellPath}expoview/src/main/res/mipmap-hdpi/ic_launcher.png`269 );270 }271 if (notificationIconUrl) {272 await spawnAsync(`find`, [273 `${shellPath}app/src/main/res`,274 '-iname',275 'shell_notification_icon.png',276 '-delete',277 ]);278 await saveUrlToPathAsync(279 notificationIconUrl,280 `${shellPath}app/src/main/res/drawable-hdpi/shell_notification_icon.png`281 );282 await spawnAsync(`find`, [283 `${shellPath}expoview/src/main/res`,284 '-iname',285 'shell_notification_icon.png',286 '-delete',287 ]);288 await saveUrlToPathAsync(289 notificationIconUrl,290 `${shellPath}expoview/src/main/res/drawable-hdpi/shell_notification_icon.png`291 );292 }293 let certificateHash = '';294 let googleAndroidApiKey = '';295 if (privateConfigFile) {296 let configJsonFile = new JsonFile(privateConfigFile);297 let branch = await configJsonFile.getAsync('branch', null);298 let fabric = await configJsonFile.getAsync('fabric', null);299 let googleMaps = await configJsonFile.getAsync('googleMaps', null);300 let googleSignIn = await configJsonFile.getAsync('googleSignIn', null);301 // Branch302 if (branch) {303 shell.sed(304 '-i',305 '<!-- ADD BRANCH CONFIG HERE -->',306 `<meta-data307 android:name="io.branch.sdk.BranchKey"308 android:value="${branch.apiKey}"/>`,309 `${shellPath}app/src/main/AndroidManifest.xml`310 );311 }312 // Fabric313 if (fabric) {314 await fs.promise.unlink(`${shellPath}app/fabric.properties`);315 await fs.promise.writeFile(316 `${shellPath}app/fabric.properties`,317 `apiSecret=${fabric.buildSecret}\n`318 );319 await sedInPlaceAsync(320 '-e',321 `/BEGIN\ FABRIC\ CONFIG/,/END\ FABRIC\ CONFIG/d`,322 `${shellPath}app/src/main/AndroidManifest.xml`323 );324 shell.sed(325 '-i',326 '<!-- ADD FABRIC CONFIG HERE -->',327 `<meta-data328 android:name="io.fabric.ApiKey"329 android:value="${fabric.apiKey}"/>`,330 `${shellPath}app/src/main/AndroidManifest.xml`331 );332 }333 // Google Maps334 if (googleMaps) {335 await sedInPlaceAsync(336 '-e',337 `/BEGIN\ GOOGLE\ MAPS\ CONFIG/,/END\ GOOGLE\ MAPS\ CONFIG/d`,338 `${shellPath}app/src/main/AndroidManifest.xml`339 );340 shell.sed(341 '-i',342 '<!-- ADD GOOGLE MAPS CONFIG HERE -->',343 `<meta-data344 android:name="com.google.android.geo.API_KEY"345 android:value="${googleMaps.apiKey}"/>`,346 `${shellPath}app/src/main/AndroidManifest.xml`347 );348 }349 // Google Login350 if (googleSignIn) {351 certificateHash = googleSignIn.certificateHash;352 googleAndroidApiKey = googleSignIn.apiKey;353 }354 }355 // Google sign in356 shell.sed(357 '-i',358 /"current_key": "(.*?)"/,359 `"current_key": "${googleAndroidApiKey}"`,360 `${shellPath}app/google-services.json`361 );362 shell.sed(363 '-i',364 /"certificate_hash": "(.*?)"/,365 `"certificate_hash": "${certificateHash}"`,366 `${shellPath}app/google-services.json`367 );368 if (keystore && alias && keystorePassword && keyPassword) {369 await spawnAsync(`/bin/rm`, [`shell-unaligned.apk`]);370 await spawnAsync(`/bin/rm`, [`shell.apk`]);371 await spawnAsyncThrowError(`./gradlew`, [`assembleProdRelease`], {372 stdio: 'inherit',373 cwd: shellPath,374 });375 await spawnAsync(`/bin/cp`, [376 `${shellPath}app/build/outputs/apk/app-prod-release-unsigned.apk`,377 `shell-unaligned.apk`,378 ]);379 await spawnAsync(`jarsigner`, [380 '-verbose',381 '-sigalg',382 'SHA1withRSA',383 '-digestalg',384 'SHA1',385 '-storepass',386 keystorePassword,387 '-keypass',388 keyPassword,389 '-keystore',390 keystore,391 'shell-unaligned.apk',392 alias,393 ]);394 await spawnAsync(`zipalign`, [395 '-v',396 '4',397 'shell-unaligned.apk',398 'shell.apk',399 ]);400 await spawnAsync(`/bin/rm`, ['shell-unaligned.apk']);401 await spawnAsync(`jarsigner`, [402 '-verify',403 '-verbose',404 '-certs',405 '-keystore',406 keystore,407 'shell.apk',408 ]);409 await spawnAsyncThrowError(`/bin/cp`, [410 'shell.apk',411 outputFile || '/tmp/shell-signed.apk',412 ]);413 } else {414 await spawnAsync(`/bin/cp`, ['../android/debug.keystore', `${shellPath}/`]);415 await spawnAsync(`/bin/rm`, ['shell-debug.apk']);416 await spawnAsyncThrowError(`./gradlew`, ['assembleDevRemoteKernelDebug'], {417 stdio: 'inherit',418 cwd: shellPath,419 });420 await spawnAsyncThrowError(`/bin/cp`, [421 `${shellPath}app/build/outputs/apk/app-devRemoteKernel-debug.apk`,422 `/tmp/shell-debug.apk`,423 ]);424 }...
cli.mjs
Source: cli.mjs
2describe('CLI', function () {3 describe('Basic commands', function () {4 this.timeout(8000);5 it('Gets help', async function () {6 const {stdout, stderr} = await spawnAsync('./bin/pop.js', ['--help']);7 expect(stderr).to.equal('');8 expect(stdout).to.contain('Usage: pop [options]');9 });10 it('Ignores empty command', async function () {11 const {stdout, stderr} = await spawnAsync('./bin/pop.js', ['--']);12 expect(stderr).to.equal('user is required!\n');13 expect(stdout).to.contain('Usage: pop [options]');14 });15 it('Times out', async function () {16 this.timeout(40000);17 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [18 '--config',19 'pop.config.json',20 '--method',21 'LIST',22 '--timeout',23 '10'24 ]);25 expect(stderr).to.contain('Error: timeout');26 expect(stdout).to.equal('');27 });28 });29 describe('POP commands', function () {30 this.timeout(60000);31 it('Override config to run without TLS', async function () {32 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [33 '--config',34 'pop.config.json',35 '--no-tls',36 '--method',37 'QUIT'38 ]);39 expect(stderr).to.equal('');40 expect(stdout).to.equal("'Bye'\n");41 });42 it('Runs QUIT', async function () {43 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [44 '--config',45 'pop.config.json',46 '--method',47 'QUIT'48 ]);49 expect(stderr).to.equal('');50 expect(stdout).to.equal("'Bye'\n");51 });52 // Todo: For RETR, TOP, and LIST, we should really seed the account with an53 // email to ensure one exists (could add `emailjs` as a dependency)54 it('Runs RETR', async function () {55 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [56 '--config',57 'pop.config.json',58 '--method',59 'RETR',60 '1'61 ]);62 expect(stderr).to.equal('');63 expect(stdout).to.contain('Received:');64 });65 it('Runs TOP', async function () {66 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [67 '--config',68 'pop.config.json',69 '--method',70 'TOP',71 '1',72 '1'73 ]);74 expect(stderr).to.equal('');75 expect(stdout).to.contain('Received:');76 });77 it('Runs LIST', async function () {78 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [79 '--config',80 'pop.config.json',81 '--method',82 'LIST'83 ]);84 expect(stderr).to.equal('');85 expect(stdout).to.match(/'\d+ messages:'/u).and.match(/'\d+ \d+(\\r\\n\d+ \d+)*'/u);86 });87 it('Runs UIDL', async function () {88 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [89 '--config',90 'pop.config.json',91 '--method',92 'UIDL'93 // '1'94 ]);95 expect(stderr).to.equal('');96 expect(stdout).to.contain("[ [ '1',");97 });98 it('Runs NOOP', async function () {99 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [100 '--config',101 'pop.config.json',102 '--method',103 'NOOP'104 // '1'105 ]);106 expect(stderr).to.equal('');107 expect(stdout).to.equal("[ '', null ]\n");108 });109 it('Runs STAT', async function () {110 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [111 '--config',112 'pop.config.json',113 '--method',114 'STAT'115 ]);116 expect(stderr).to.equal('');117 expect(stdout).to.match(/\[ '\d+ \d+', null \]\n/u);118 });119 it('Runs RSET', async function () {120 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [121 '--config',122 'pop.config.json',123 '--method',124 'RSET'125 // '1'126 ]);127 expect(stderr).to.equal('');128 expect(stdout).to.contain("[ '', null ]\n");129 });130 it('Runs DELE', async function () {131 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [132 '--config',133 'pop.config.json',134 '--method',135 'DELE',136 '1'137 ]);138 expect(stderr).to.equal('');139 expect(stdout).to.contain("[ 'Marked to be deleted.', null ]\n");140 });141 // Todo: Test APOP142 });143 describe('CLI Errors', function () {144 it('Errs with bad user/pass', async function () {145 this.timeout(10000);146 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [147 '--user',148 'brett@example.name',149 '--password',150 '123456',151 '--host',152 'example.name',153 '--method',154 'NOOP'155 // '1'156 ]);157 expect(stderr).to.contain('getaddrinfo ENOTFOUND');158 expect(stdout).to.equal('');159 });160 it('Errs upon invalid alias', async function () {161 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [162 '-x'163 ]);164 expect(stderr).to.equal('Invalid alias x\n');165 expect(stdout).to.equal('');166 });167 it('Errs upon invalid argument', async function () {168 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [169 'xyz'170 ]);171 expect(stderr).to.equal('Invalid argument xyz\n');172 expect(stdout).to.equal('');173 });174 it('Errs upon missing method', async function () {175 let {stdout, stderr} = await spawnAsync('./bin/pop.js', [176 '--config',177 'pop.config.json'178 ]);179 expect(stderr).to.equal('method is required!\n');180 expect(stdout).to.contain('Usage: pop [options]');181 ({stdout, stderr} = await spawnAsync('./bin/pop.js', [182 '--config',183 'pop.config.json',184 '-u',185 'brett@example.name'186 ]));187 expect(stderr).to.equal('method is required!\n');188 expect(stdout).to.contain('Usage: pop [options]');189 });190 it('Errs on bad RETR', async function () {191 this.timeout(60000);192 const {stdout, stderr} = await spawnAsync('./bin/pop.js', [193 '--config',194 'pop.config.json',195 '--method',196 'RETR',197 '0'198 ]);199 expect(stderr).to.contain("There's no message 0");200 expect(stdout).to.equal('');201 });202 });...
benchmark.js
Source: benchmark.js
...85 });86 });87}88async function cleanUp() {89 return spawnAsync(hexoBin, ['clean'], { cwd: testDir });90}91async function gitClone(repo, dir, depth = 1) {92 return spawnAsync('git', ['clone', repo, dir, `--depth=${depth}`]);93}94async function init() {95 if (await exists(testDir)) {96 log.info(`"${testDir}" already exists. Skipping benchmark environment setup.`);97 } else {98 log.info('Setting up a dummy hexo site with 500 posts');99 await gitClone('https://github.com/hexojs/hexo-theme-unit-test.git', testDir);100 await gitClone('https://github.com/hexojs/hexo-theme-landscape', resolve(testDir, 'themes', 'landscape'));101 await gitClone('https://github.com/SukkaLab/hexo-many-posts.git', resolve(testDir, 'source', '_posts', 'hexo-many-posts'));102 }103 log.info('Installing dependencies');104 // Always re-install dependencies105 if (await exists(resolve(testDir, 'node_modules'))) await rmdir(resolve(testDir, 'node_modules'));106 await spawnAsync(npmScript, ['install', '--silent'], { cwd: testDir });107 log.info('Replacing hexo');108 await rmdir(resolve(testDir, 'node_modules', 'hexo'));109 if (isWin32) {110 await spawnAsync('cmd', [111 '/s', '/c', 'mklink', '/D',112 resolve(testDir, 'node_modules', 'hexo'),113 resolve(__dirname, '..')114 ]);115 await rmdir(resolve(testDir, 'node_modules', 'hexo-cli'));116 await spawnAsync('cmd', [117 '/s', '/c', 'mklink', '/D',118 resolve(testDir, 'node_modules', 'hexo-cli'),119 resolve(__dirname, '..', 'node_modules', 'hexo-cli')120 ]);121 } else {122 await spawnAsync('ln', [123 '-sf',124 resolve(__dirname, '..'),125 resolve(testDir, 'node_modules', 'hexo')126 ]);127 }128}129async function profiling() {130 // Clean up 0x dir before profiling131 if (await exists(zeroEksDir)) await rmdir(zeroEksDir);132 const zeroEksOpts = {133 argv: [hexoBin, 'g', '--cwd', testDir],134 workingDir: '.', // A workaround for https://github.com/davidmarkclements/0x/issues/228135 outputDir: zeroEksDir,136 title: 'Hexo Flamegraph'...
montage.js
Source: montage.js
...23const convert = args => {24 if (DEBUG) {25 console.debug(`magick convert ${args.join(" ")}`);26 }27 return spawnAsync("magick", ["convert", ...args]);28};29const composite = args => {30 const allArgs = ["composite", "-colorspace", "RGB", ...args];31 if (DEBUG) {32 console.debug(`magick ${allArgs.join(" ")}`);33 }34 return spawnAsync("magick", allArgs);35};36const processScreenshot = async (37 { src, dest, tmp },38 { profileDir, phoneWidth, title, width, height, screenshot }39) => {40 const tmpDevice = `${tmp}/device.png`;41 const tmpBackground = `${tmp}/background.png`;42 const tmpScreenshot = `${tmp}/screenshot.png`;43 const tmpScreenshotComposite = `${tmp}/screenshot-composite.png`;44 const [_, rotate, label] = path45 .basename(src, ".png")46 .match(/^\d+\s*(rotLeft|rotRight)?[ -]*(.+)$/);47 // background48 await convert([49 "-size",50 `${width}x${height}`,51 `canvas:${backgroundColor}`,52 "-font",53 fontPath,54 "-weight",55 fontWeight,56 "-pointsize",57 fontSize,58 "-fill",59 fontColor,60 "-gravity",61 "North",62 "-annotate",63 `+0+${title.marginTop}`,64 label,65 tmpBackground66 ]);67 // phone image68 await convert([69 profileDir + "/device.png",70 "-resize",71 `${phoneWidth}x`,72 tmpDevice73 ]);74 // screenshot resize75 await convert([76 src,77 "-resize",78 screenshot.width,79 "-gravity",80 "North",81 tmpScreenshot82 ]);83 // phone with screenshot84 // compose dst-over with inversion of background & front because final size is the src size85 await composite(86 [87 !!rotate && "-rotate",88 !!rotate && "-30",89 "-compose",90 "dst-over",91 "-background",92 "transparent",93 "-gravity",94 "center",95 tmpScreenshot,96 tmpDevice,97 tmpScreenshotComposite98 ].filter(arg => arg)99 );100 if (rotate) {101 const geometryLeft =102 rotate == "rotLeft"103 ? `+${screenshot.rotation.marginLeft}`104 : screenshot.rotation.marginLeft - width;105 composite([106 "-gravity",107 "West",108 tmpScreenshotComposite,109 "-geometry",110 `${geometryLeft}+${screenshot.rotation.marginTop}`,111 tmpBackground,112 dest113 ]);114 } else {115 composite([116 "-gravity",117 "center",118 tmpScreenshotComposite,119 "-geometry",120 `+0+${screenshot.marginTop}`,121 tmpBackground,122 dest123 ]);124 }125};126const processProfile = dir => {127 const profileName = path.basename(dir);128 console.log("Profile " + profileName + " in " + dir);129 const profileDir = "./profiles/" + profileName;130 const config = require(profileDir + "/config.json");131 const destDir = `./screenshots/${profileName}`;132 rmkDir(destDir);133 return spawnAsync("find", [dir, "-name", "*.png", "-depth", "1"])134 .then(findResult)135 .then(imgs => {136 const transf = imgs.map((src, index) => {137 const dest = `${destDir}/${profileName} ${index + 1}.png`;138 const tmp = `./tmp/${profileName}-${index}`;139 rmkDir(tmp);140 return processScreenshot({ src, dest, tmp }, { profileDir, ...config })141 .then(() => {142 console.log("Wrote " + dest);143 })144 .catch(error => {145 console.error("Error during processing " + src, error);146 });147 });148 return Promise.all(transf);149 });150};151spawnAsync("find", ["sources", "-type", "d", "-depth", "1"])152 .then(findResult)153 .then(profiles => {154 profiles.forEach(profile => {155 processProfile(profile);156 });157 })158 .catch(error => {159 console.error(error);...
spawn.js
Source: spawn.js
...82 process.exit(1)83 }84 const fullCommand = process.argv.slice(2).join(' ')85 const [command, ...args] = fullCommand.split(' ')86 spawnAsync(command, args)87 .then( result => {88 //if (result.code === 0)89 console.log( result /*.stdout*/ ) // print the attribute stdout of resolve object90 //else91 // console.error( `command ${result.fullcmd} failed with exit code: ${result.code}` )92 93 })94 .catch( data => console.log( `command failed. See: ${data}` ))95}96if (require.main === module) 97 main()...
update-sdks.js
Source: update-sdks.js
...9 '@applitools/eyes-images',10 '@applitools/visual-grid-client',11]12async function upgradeSDKs() {13 await spawnAsync('yarn', ['upgrade', ...SDKS_TO_UPGRADE, '--json'])14}15async function upgradeEyesSeleniumSdk() {16 const EYES_SELENIUM_SDK_NAME = '@applitools/eyes-selenium'17 const PLUGIN_MANIFEST_PATH = './src/background/plugin-manifest.json'18 const latestVersion = await getLatestSdkVersion(EYES_SELENIUM_SDK_NAME)19 const pkg = JSON.parse((await fs.readFile(PLUGIN_MANIFEST_PATH)).toString())20 pkg.dependencies[EYES_SELENIUM_SDK_NAME] = latestVersion21 await fs.writeFile(PLUGIN_MANIFEST_PATH, JSON.stringify(pkg, undefined, 2))22}23async function getLatestSdkVersion(sdk) {24 const info = JSON.parse(await spawnAsync('yarn', ['info', sdk, '--json']))25 return info.data['dist-tags'].latest26}27async function writeChangelog() {28 const [pkg, changelog] = await Promise.all([29 JSON.parse((await fs.readFile('./package.json')).toString()),30 (await fs.readFile('./CHANGELOG.md')).toString(),31 ])32 await fs.writeFile(33 './CHANGELOG.md',34 changelog.replace(35 '# Changelog',36 `# Changelog\n\n## v${pkg.version}\n- Updated underlying Applitools SDKs`37 )38 )39}40async function stageFiles(files) {41 await spawnAsync('git', ['add', ...files])42}43async function versionAndTag() {44 await spawnAsync('yarn', ['version', '--patch'])45}46async function amendCommit() {47 await spawnAsync('git', ['commit', '--amend', '--no-edit'])48}49async function pushCommit() {50 await spawnAsync('git', ['push', 'origin', 'master', '--tags'])51}52;(async () => {53 if (isCwdCorrect()) {54 console.log('upgrading SDKs')55 await Promise.all([upgradeEyesSeleniumSdk(), upgradeSDKs()])56 console.log('preparing commit')57 await stageFiles(['yarn.lock', 'src/background/plugin-manifest.json'])58 console.log('commiting and creating tags')59 await versionAndTag()60 console.log('writing changelog')61 await writeChangelog()62 await stageFiles(['CHANGELOG.md'])63 await amendCommit()64 console.log('pushing...')...
saofile.js
Source: saofile.js
...7 .sort((a, b) => a.match(/\d+/)[0] - b.match(/\d+/)[0])8const d = (days.length == 0) ?9 1 :10 parseInt(days[days.length-1].match(/\d+/)[0]) + 111function spawnAsync(cmd, ...args) {12 return new Promise((resolve, reject) => {13 const child = spawn(cmd, args, {14 stdio: 'inherit'15 })16 child.on('error', reject)17 child.on('exit', code => {18 if (code === 0) {19 resolve()20 }21 reject(new Error(`Child died with: ${code}`))22 })23 })24}25module.exports = {26 actions: [27 {28 type: 'add',29 files: '**'30 },31 {32 type: 'move',33 patterns: {34 'template.js': `day${d}.js`,35 'test/day.tests': `test/day${d}.tests`,36 'lines.pegjs': `day${d}.pegjs`,37 'input.txt': `day${d}.txt`38 }39 }40 ],41 async completed() {42 await spawnAsync('curl',43 '-b', '.cookies',44 '-o', `inputs/day${d}.txt`,45 `https://adventofcode.com/2020/day/${d}/input`)46 await spawnAsync('code', `day${d}.js`)47 await spawnAsync('code', `day${d}.pegjs`)48 await spawnAsync('code', `inputs/day${d}.txt`)49 await spawnAsync('code', `test/day${d}.tests`)50 await spawnAsync('npm', 'test')51 }...
saofile.cjs
Source: saofile.cjs
...5 .sort((a, b) => a.match(/\d+/)[0] - b.match(/\d+/)[0]);6const d = (days.length === 0)7 ? 18 : parseInt(days[days.length - 1].match(/\d+/)[0], 10) + 1;9function spawnAsync(cmd, ...args) {10 return new Promise((resolve, reject) => {11 const child = spawn(cmd, args, {12 stdio: "inherit",13 });14 child.on("error", reject);15 child.on("exit", code => {16 if (code === 0) {17 resolve();18 }19 reject(new Error(`Child died with: ${code}`));20 });21 });22}23module.exports = {24 actions: [25 {26 type: "add",27 files: "**",28 },29 {30 type: "move",31 patterns: {32 "template.ts": `day${d}.ts`,33 "test/day.tests": `test/day${d}.tests`,34 "lines.peggy": `day${d}.peggy`,35 "input.txt": `day${d}.txt`,36 },37 },38 ],39 async completed() {40 await spawnAsync("curl",41 "-b",42 ".cookies",43 "-o",44 `inputs/day${d}.txt`,45 `https://adventofcode.com/2021/day/${d}/input`);46 await spawnAsync("code", `day${d}.ts`);47 await spawnAsync("code", `day${d}.peggy`);48 await spawnAsync("code", `inputs/day${d}.txt`);49 await spawnAsync("code", `test/day${d}.tests`);50 await spawnAsync("npm", "test");51 },...
Using AI Code Generation
1const { spawnAsync } = require('@playwright/test/lib/utils/process');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 const { stdout, stderr } = await spawnAsync('ls', ['-la'], {8 env: {9 },10 });11 console.log(stdout);12 console.error(stderr);13 await browser.close();14})();
Using AI Code Generation
1const { spawnAsync } = require('playwright-core/lib/utils/childProcess');2const path = require('path');3const { chromium } = require('playwright-core');4(async () => {5 const browser = await chromium.launch();6 const context = await browser.newContext();7 const page = await context.newPage();8 const { process, kill } = await spawnAsync(9 path.join(__dirname, 'server.js'),10 {11 env: { ...process.env, ...{ PORT: '8080' } },12 }13 );14 process.stdout.on('data', (data) => console.log(data.toString()));15 process.stderr.on('data', (data) => console.log(data.toString()));16 process.on('exit', (code) => {17 console.log(`child process exited with code ${code}`);18 });19 await page.waitForSelector('#hello');20 console.log(await page.innerText('#hello'));21 await browser.close();22 kill();23})();24const http = require('http');25const PORT = process.env.PORT || 8080;26const server = http.createServer((req, res) => {27 res.writeHead(200);28 res.end('<h1 id="hello">Hello World</h1>');29});30server.listen(PORT, () => {31 console.log(`Server listening on port ${PORT}!`);32});
Using AI Code Generation
1const { spawnAsync } = require('playwright/lib/utils/spawn');2const { firefox } = require('playwright');3(async () => {4 const firefoxProcess = await spawnAsync({5 executablePath: firefox.executablePath(),6 });7 firefoxProcess.stdout.on('data', (data) => {8 console.log(`stdout: ${data}`);9 });10 firefoxProcess.stderr.on('data', (data) => {11 console.error(`stderr: ${data}`);12 });13 firefoxProcess.on('close', (code) => {14 console.log(`child process exited with code ${code}`);15 });16})();
Using AI Code Generation
1const { spawnAsync } = require('playwright/lib/server/processLauncher');2spawnAsync('node', ['--version'], {3 cwd: process.cwd(),4 attemptToGracefullyClose: () => Promise.resolve(),5}).then(result => {6 console.log(result);7});
Using AI Code Generation
1const { spawnAsync } = require('playwright/lib/utils/child_process');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch();5 const page = await browser.newPage();6 const title = await page.title();7 console.log('Page title: ' + title);8 await browser.close();9})();
Using AI Code Generation
1const { spawnAsync } = require('playwright-core/lib/utils/child_process');2const { spawn } = require('child_process');3async function main() {4 const { process } = await spawnAsync('node', ['test2.js'], {5 });6 process.stdout.on('data', (data) => {7 console.log(`stdout: ${data}`);8 });9 process.stderr.on('data', (data) => {10 console.error(`stderr: ${data}`);11 });12 process.on('close', (code) => {13 console.log(`child process exited with code ${code}`);14 });15}16main();17const { spawn } = require('child_process');18const { spawnAsync } = require('playwright-core/lib/utils/child_process');19async function main() {20 const { process } = await spawnAsync('node', ['test3.js'], {21 });22 process.stdout.on('data', (data) => {23 console.log(`stdout: ${data}`);24 });25 process.stderr.on('data', (data) => {26 console.error(`stderr: ${data}`);27 });28 process.on('close', (code) => {29 console.log(`child process exited with code ${code}`);30 });31}32main();33const { spawn } = require('child_process');34const { spawnAsync } = require('playwright-core/lib/utils/child_process');35async function main() {36 const { process } = await spawnAsync('node', ['test4.js'], {37 });38 process.stdout.on('data', (data) => {39 console.log(`stdout: ${data}`);40 });41 process.stderr.on('data', (data) => {42 console.error(`stderr: ${data}`);43 });44 process.on('close', (code) => {45 console.log(`child process exited with code ${code}`);46 });47}48main();49const { spawn } = require('child_process');50const { spawnAsync } = require('playwright-core/lib/utils/child_process');51async function main() {52 const { process } = await spawnAsync('node', ['test5.js'], {53 });54 process.stdout.on('data', (data) => {55 console.log(`stdout:
Using AI Code Generation
1const { spawnAsync } = require('playwright-core/lib/utils/child_process');2(async() => {3 const { code, stdout, stderr } = await spawnAsync('ls', ['-l']);4 console.log('code', code);5 console.log('stdout', stdout);6 console.log('stderr', stderr);7})();8const { spawnAsync } = require('playwright-core/lib/utils/child_process');9(async() => {10 const { code, stdout, stderr } = await spawnAsync('ls', ['-l']);11 console.log('code', code);12 console.log('stdout', stdout);13 console.log('stderr', stderr);14})();15const { spawnAsync } = require('playwright-core/lib/utils/child_process');16(async() => {17 const { code, stdout, stderr } = await spawnAsync('ls', ['-l']);18 console.log('code', code);19 console.log('stdout', stdout);20 console.log('stderr', stderr);21})();22const { spawnAsync } = require('playwright-core/lib/utils/child_process');23(async() => {24 const { code, stdout, stderr } = await spawnAsync('ls', ['-l']);25 console.log('code', code);26 console.log('stdout', stdout);27 console.log('stderr', stderr);28})();29const { spawnAsync } = require('playwright-core/lib/utils/child_process');30(async() => {31 const { code, stdout, stderr } = await spawnAsync('ls', ['-l']);32 console.log('code', code);33 console.log('stdout', stdout);34 console.log('stderr', stderr);35})();36const { spawnAsync } = require('playwright-core/lib/utils/child_process');37(async() => {38 const {
Using AI Code Generation
1const { spawnAsync } = require('playwright/lib/utils/child_process');2const { spawn } = require('child_process');3spawnAsync('node', ['--version'])4 .then((process) => {5 process.stdout.on('data', (data) => {6 console.log(`stdout: ${data}`);7 });8 process.stderr.on('data', (data) => {9 console.error(`stderr: ${data}`);10 });11 process.on('close', (code) => {12 console.log(`child process exited with code ${code}`);13 });14 });15const child = spawn('node', ['--version']);16child.stdout.on('data', (data) => {17 console.log(`stdout: ${data}`);18});19child.stderr.on('data', (data) => {20 console.error(`stderr: ${data}`);21});22child.on('close', (code) => {23 console.log(`child process exited with code ${code}`);24});25const { spawnAsync } = require('playwright/lib/utils/child_process');26const { spawn } = require('child_process');27spawnAsync('node', ['--version'])28 .then((process) => {29 process.stdout.on('data', (data) => {30 console.log(`stdout: ${data}`);31 });32 process.stderr.on('data', (data) => {33 console.error(`stderr: ${data}`);34 });35 process.on('close', (code) => {36 console.log(`child process exited with code ${code}`);37 });38 });39const child = spawn('node', ['--version']);40child.stdout.on('data', (data) => {41 console.log(`stdout: ${data}`);42});43child.stderr.on('data', (data)
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!!