Best JavaScript code snippet using playwright-internal
utils_request.test.js
Source: utils_request.test.js
1import express from 'express';2import {3 requestAsBrowser,4 FIREFOX_MOBILE_USER_AGENT,5 FIREFOX_DESKTOP_USER_AGENT,6} from '../build/utils_request';7import { startExpressAppPromise } from './_helper';8const CONTENT = 'CONTENT';9const HOSTNAME = '127.0.0.1';10describe('Apify.utils_request', () => {11 let port;12 let server;13 beforeAll(async () => {14 const app = express();15 app.get('/406', (req, res) => {16 res.setHeader('content-type', 'text/html; charset=utf-8');17 res.status(406);18 res.send(CONTENT);19 });20 app.get('/echo', (req, res) => {21 res.send(JSON.stringify(req.headers));22 });23 app.get('/rawHeaders', (req, res) => {24 res.send(JSON.stringify(req.rawHeaders));25 });26 app.get('/invalidContentType', (req, res) => {27 res.setHeader('content-type', 'application/json');28 res.send(CONTENT);29 });30 app.get('/invalidContentHeader', (req, res) => {31 res.setHeader('Content-Type', 'non-existent-content-type');32 res.send(CONTENT);33 });34 app.get('/invalidBody', async (req, res) => {35 res.setHeader('content-encoding', 'deflate');36 res.status(500);37 res.send(Buffer.from(CONTENT, 'utf8'));38 });39 app.get('/empty', async (req, res) => {40 res.setHeader('Content-Type', 'text/html; charset=utf-8');41 res.send();42 });43 app.get('/invalidHeaderChar', (req) => {44 const headers = {45 'Invalid Header With Space': 'some\value',46 'X-Normal-Header': 'HeaderValue2',47 };48 let msg = 'HTTP/1.1 200 OK\r\n';49 Object.entries(headers).forEach(([key, value]) => {50 msg += `${key}: ${value}\r\n`;51 });52 msg += `\r\n${CONTENT}`;53 req.socket.write(msg, () => {54 req.socket.end();55 // Unfortunately calling end() will not close the socket56 // if client refuses to close it. Hence calling destroy after a short while.57 setTimeout(() => {58 req.socket.destroy();59 }, 100);60 });61 });62 server = await startExpressAppPromise(app, 0);63 port = server.address().port; //eslint-disable-line64 });65 afterAll(() => {66 server.close();67 });68 describe('Apify.requestAsBrowser', () => {69 test(70 'it uses mobile user-agent when mobile property is set to true ',71 async () => {72 const data = {73 url: `http://${HOSTNAME}:${port}/echo`,74 useMobileVersion: true,75 };76 const response = await requestAsBrowser(data);77 expect(response.statusCode).toBe(200);78 expect(JSON.parse(response.body)['user-agent']).toEqual(FIREFOX_MOBILE_USER_AGENT);79 },80 );81 test('uses desktop user-agent by default ', async () => {82 const data = {83 url: `http://${HOSTNAME}:${port}/echo`,84 };85 const response = await requestAsBrowser(data);86 expect(response.statusCode).toBe(200);87 expect(JSON.parse(response.body)['user-agent']).toEqual(FIREFOX_DESKTOP_USER_AGENT);88 });89 test('sets correct hosts', async () => {90 const host = `${HOSTNAME}:${port}`;91 const options = {92 url: `http://${host}/echo`,93 };94 const response = await requestAsBrowser(options);95 expect(response.statusCode).toBe(200);96 expect(JSON.parse(response.body).host).toEqual(host);97 });98 test('uses correct default language', async () => {99 const languageCode = 'en';100 const countryCode = 'US';101 const host = `${HOSTNAME}:${port}`;102 const options = {103 url: `http://${host}/echo`,104 };105 const response = await requestAsBrowser(options);106 expect(response.statusCode).toBe(200);107 expect(JSON.parse(response.body)['accept-language']).toEqual(`${languageCode}-${countryCode},${languageCode};q=0.5`);108 });109 test('does not throw for empty response body', async () => {110 const options = {111 url: `http://${HOSTNAME}:${port}/empty`,112 };113 let error;114 try {115 await requestAsBrowser(options);116 } catch (e) {117 error = e;118 }119 expect(error).toBeFalsy(); //eslint-disable-line120 });121 test('overrides defaults', async () => {122 const host = `${HOSTNAME}:${port}`;123 const options = {124 url: `http://${host}/echo`,125 headers: {126 'User-Agent': 'chrome',127 },128 };129 const response = await requestAsBrowser(options);130 expect(response.statusCode).toBe(200);131 expect(JSON.parse(response.body)['user-agent']).toEqual(options.headers['User-Agent']);132 });133 test('headers has same format as in firefox', async () => {134 const host = `${HOSTNAME}:${port}`;135 const options = {136 url: `http://${host}/rawHeaders`,137 };138 const response = await requestAsBrowser(options);139 const headersArray = JSON.parse(response.body);140 expect(response.statusCode).toBe(200);141 expect(headersArray[0]).toBe('Host');142 expect(headersArray[1]).toEqual(host);143 expect(headersArray[2]).toBe('User-Agent');144 expect(headersArray[3]).toEqual(FIREFOX_DESKTOP_USER_AGENT);145 expect(headersArray[4]).toBe('Accept');146 expect(headersArray[5]).toBe('text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');147 expect(headersArray[6]).toBe('Accept-Language');148 expect(headersArray[7]).toBe('en-US,en;q=0.5');149 expect(headersArray[8]).toBe('Accept-Encoding');150 expect(headersArray[9]).toBe('gzip, deflate, br');151 expect(headersArray[10]).toBe('Connection');152 expect(headersArray[11]).toBe('keep-alive');153 });154 test('custom headers in lowercase override uppercase defaults', async () => {155 const host = `${HOSTNAME}:${port}`;156 const options = {157 url: `http://${host}/rawHeaders`,158 headers: {159 accept: 'foo',160 bar: 'BAZ',161 },162 };163 const response = await requestAsBrowser(options);164 const headersArray = JSON.parse(response.body);165 expect(response.statusCode).toBe(200);166 expect(headersArray[4]).toBe('Accept');167 expect(headersArray[5]).toBe('foo');168 expect(headersArray[12]).toBe('bar');169 expect(headersArray[13]).toBe('BAZ');170 });171 test('correctly handles invalid header characters', async () => {172 const url = `http://${HOSTNAME}:${port}/invalidHeaderChar`;173 const response = await requestAsBrowser({ url });174 expect(response.body).toBe(CONTENT);175 expect(response.headers).toEqual({176 'invalid header with space': 'some\value',177 'x-normal-header': 'HeaderValue2',178 });179 try {180 await requestAsBrowser({181 useInsecureHttpParser: false,182 url,183 });184 } catch (err) {185 if (process.version.startsWith('v10')) {186 expect(err.message).toMatch('Parse Error');187 } else {188 expect(err.message).toMatch('Parse Error: Invalid header value char');189 }190 }191 });192 test('does not get into redirect loops', async () => {193 const url = 'https://www.smartmania.cz'; // uses www to no-www redirect194 try {195 await requestAsBrowser({ url });196 } catch (err) {197 // If it's some other error, it's fine for the purpose of this test.198 // We're only making sure that the max redirect error is not there.199 if (err.name === 'MaxRedirectsError') throw err;200 }201 });202 });...
Bibliotheque et Archives Nationale du Quebec (Pistard).js
Source: Bibliotheque et Archives Nationale du Quebec (Pistard).js
1{2 "translatorID": "1eb5eb03-26ab-4015-bd0d-65487734744a",3 "translatorType": 4,4 "label": "Bibliotheque et Archives Nationale du Quebec (Pistard)",5 "creator": "Adam Crymble",6 "target": "^https?://pistard\\.banq\\.qc\\.ca",7 "minVersion": "1.0.0b4.r5",8 "maxVersion": "",9 "priority": 100,10 "inRepository": true,11 "lastUpdated": "2008-08-06 17:00:00"12}13function detectWeb (doc, url) {14 15 if (doc.title.match("Liste détaillée des fonds")) {16 return "multiple";17 } else if (doc.title.match("Description fonds")) {18 return "book";19 }20}21//Bibliotheque et Archives National du Quebec. Code by Adam Crymble22function associateData (newItem, dataTags, field, zoteroField) {23 if (dataTags[field]) {24 newItem[zoteroField] = dataTags[field];25 }26}27function scrape(doc, url) {28 var namespace = doc.documentElement.namespaceURI;29 var nsResolver = namespace ? function(prefix) {30 if (prefix == 'x') return namespace; else return null;31 } : null;32 33 var dataTags = new Object();34 var fieldTitle;35 var tagsContent= new Array();36 var newItem = new Zotero.Item("book");37 38 var headers = doc.evaluate('//strong', doc, nsResolver, XPathResult.ANY_TYPE, null);39 var xPathCount = doc.evaluate('count (//strong)', doc, nsResolver, XPathResult.ANY_TYPE, null);40 var contents = doc.evaluate('//div[@id="Content"]/div/table', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent;41 42 var headersArray = new Array();43 var oneHeader = '';44 if (xPathCount.numberValue > 1) {45 for (var i = 0; i < xPathCount.numberValue; i++) {46 fieldTitle = headers.iterateNext().textContent;47 headersArray.push(fieldTitle);48 }49 } else {50 oneHeader = (headers.iterateNext().textContent);51 }52 53 var contentsArray = new Array();54 var j = 0;55 56 if (oneHeader.length<1) {57 58 for (var i = headersArray.length-1; i> -1; i--) { 59 60 var fieldIndex = contents.indexOf(headersArray[i]);61 var removeHeader = headersArray[i].length;62 63 contentsArray.push(contents.substr(fieldIndex));64 contents = contents.substr(0, fieldIndex);65 fieldTitle = headersArray[i].replace(/\s+/g, '');66 67 dataTags[fieldTitle] = contentsArray[j].substr(removeHeader).replace(/^\s*|\s+$/g, '');68 j++;69 }70 } 71 Zotero.debug(dataTags);72 73 if (dataTags["Titre,Dates,Quantité"]) {74 if (dataTags["Titre,Dates,Quantité"].match(/\n/)) {75 var splitTitle = dataTags["Titre,Dates,Quantité"].split(/\n/);76 if (splitTitle[0].match(/\w/)) {77 newItem.title = splitTitle[0].replace(/^\s*|\s+$/g, '');78 }79 for (var i = 0; i < splitTitle.length; i++) {80 if (splitTitle[i].match("/ ")) {81 var author = splitTitle[i].replace(/^\s*|\s+$/g, '').substr(2);82 newItem.creators.push({lastName: author, creatorType: "creator"});83 }84 }85 }86 } else {87 newItem.title = doc.title;88 }89 90 91 var k = 0;92 if (dataTags["Termesrattachés"]) {93 94 if (dataTags["Termesrattachés"].match(/\n/)) {95 tagsContent = dataTags["Termesrattachés"].split(/\n/);96 for (var i in tagsContent) {97 if (tagsContent[i].match(/\w/)) {98 newItem.tags[k] = tagsContent[i].replace(/^\s+|\s*$/g, ''); 99 k++;100 }101 }102 } else {103 newItem.tags[0] = dataTags["Termesrattachés"];104 } 105 }106 107 associateData (newItem, dataTags, "Languedesdocuments", "language");108 associateData (newItem, dataTags, "Cote:", "callNumber");109 associateData (newItem, dataTags, "Collation", "pages");110 associateData (newItem, dataTags, "Centre:", "place");111 associateData (newItem, dataTags, "Portéeetcontenu", "abstractNote");112 113 newItem.url = doc.location.href;114 newItem.complete(); 115}116function doWeb(doc, url) {117 var namespace = doc.documentElement.namespaceURI;118 var nsResolver = namespace ? function(prefix) {119 if (prefix == 'x') return namespace; else return null;120 } : null;121 122 var articles = new Array();123 124 if (detectWeb(doc, url) == "multiple") {125 var items = new Object();126 127 var titles = doc.evaluate('//td[2]/a', doc, nsResolver, XPathResult.ANY_TYPE, null);128 129 var next_title; 130 while (next_title = titles.iterateNext()) {131 if (next_title.href.match("description_fonds")) {132 items[next_title.href] = next_title.textContent;133 }134 }135 items = Zotero.selectItems(items);136 for (var i in items) {137 articles.push(i);138 }139 } else {140 articles = [url];141 }142 Zotero.Utilities.processDocuments(articles, scrape, function() {Zotero.done();});143 Zotero.wait();...
National Archives of South Africa.js
1{2 "translatorID": "5b02e8d4-d8fb-4143-af3d-3576d4c1b49c",3 "label": "National Archives of South Africa",4 "creator": "Adam Crymble",5 "target": "^https?://www\\.national\\.archsrch\\.gov\\.za",6 "minVersion": "3.0",7 "maxVersion": "",8 "priority": 100,9 "inRepository": true,10 "translatorType": 4,11 "browserSupport": "gcsb",12 "lastUpdated": "2014-03-12 22:00:51"13}14function detectWeb(doc, url) {15 if (doc.title.match("Results Summary")) {16 return "multiple";17 } else if (doc.title.match("Results Detail")) {18 return "book";19 }20}21//National Archives of South Africa Translator. Code by Adam Crymble22function associateData(newItem, dataTags, field, zoteroField) {23 if (dataTags[field]) {24 newItem[zoteroField] = dataTags[field];25 }26}27function scrape(doc, url) {28 var dataTags = new Object();29 var tagsContent = new Array();30 var fieldTitle;31 var newItem = new Zotero.Item("book");32 var headers = doc.evaluate('//td[2]/pre/b', doc, null, XPathResult.ANY_TYPE, null);33 var xPathCount = doc.evaluate('count (//td[2]/pre/b)', doc, null, XPathResult.ANY_TYPE, null);34 var contents = doc.evaluate('//td[2]/pre', doc, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;35 var headersArray = new Array();36 var oneHeader = '';37 if (xPathCount.numberValue > 1) {38 for (var i = 0; i < xPathCount.numberValue; i++) {39 fieldTitle = headers.iterateNext().textContent;40 headersArray.push(fieldTitle);41 }42 } else {43 oneHeader = (headers.iterateNext().textContent);44 }45 var contentsArray = new Array();46 var j = 0;47 if (oneHeader.length < 1) {48 for (var i = headersArray.length - 1; i > -1; i--) {49 var fieldIndex = contents.indexOf(headersArray[i]);50 var shorten = headersArray[i].length;51 contentsArray.push(contents.substr(fieldIndex));52 contents = contents.substr(0, fieldIndex);53 fieldTitle = headersArray[i].replace(/\s+/g, '');54 dataTags[fieldTitle] = contentsArray[j].substr(shorten).replace(/^\s*|\s+$/g, '');55 j++;56 }57 }58 associateData(newItem, dataTags, "DEPOT", "repository");59 associateData(newItem, dataTags, "REFERENCE", "callNumber");60 associateData(newItem, dataTags, "STARTING", "date");61 associateData(newItem, dataTags, "ENDING", "date");62 associateData(newItem, dataTags, "VOLUME_NO", "volume");63 associateData(newItem, dataTags, "REMARKS", "extra");64 associateData(newItem, dataTags, "SUMMARY", "abstractNote");65 associateData(newItem, dataTags, "SOURCE", "series");66 if (dataTags["DESCRIPTION"]) {67 associateData(newItem, dataTags, "DESCRIPTION", "title");68 newItem.title = ZU.capitalizeTitle(newItem.title, ignorePreference = "true")69 } else {70 newItem.title = "No Title Found";71 }72 newItem.complete();73}74function doWeb(doc, url) {75 var articles = new Array();76 if (detectWeb(doc, url) == "multiple") {77 var items = new Object();78 var titles = doc.evaluate('//td/a', doc, null, XPathResult.ANY_TYPE, null);79 var lastLink;80 var next_title;81 while (next_title = titles.iterateNext()) {82 if (!next_title.textContent.match(/^\d\d\d\d/) && !next_title.textContent.match(/\\/) && next_title.textContent.length > 3 && next_title.textContent.match(/\w/)) {83 Zotero.debug(next_title.textContent);84 items[next_title.href] = next_title.textContent.trim();85 }86 }87 Zotero.selectItems(items, function (items) {88 if (!items) {89 return true;90 }91 for (var i in items) {92 articles.push(i);93 }94 ZU.processDocuments(articles, scrape)95 }); 96 }97 else {98 scrape(doc, url);99 }100} 101/** BEGIN TEST CASES **/102var testCases = []...
csv-json.js
Source: csv-json.js
1function transformForDelimiter(valuesArray, delimiter) {2 if (valuesArray instanceof Array) {3 return valuesArray.map((element) => {4 return element.split(delimiter).join(',')5 })6 }7}8function getHeaderRow(valuesArray, { headers, delimiter = ',' }, counter) {9 // operate here on valuess10 let headersArray = []11 if (valuesArray instanceof Array) {12 if (counter === 1) {13 // this chunks have headers row14 if (headers === true) {15 headersArray = valuesArray[0].split(delimiter)16 }17 else {18 headersArray = headers19 // Todo: - check length of new headers = old headers20 }21 }22 return headersArray23 }24}25function transformForHeader(valuesArray, headersArray, counter) {26 if (counter === 1) {27 // remove header row28 valuesArray.shift()29 }30 return valuesArray.reduce((arr, element) => {31 const splittedValues = element.split(',')32 const rowObj = splittedValues.reduce((obj, value, i) => {33 const keyName = headersArray[i];34 const objProp = {}35 objProp[keyName] = value36 return { ...obj, ...objProp }37 }, {})38 return [...arr, rowObj]39 }, [])40}41function transformForSkipComments(valuesArray, commentChar) {42 if (valuesArray instanceof Array) {43 return valuesArray.filter((element) => {44 const len = element.length45 return !(element[0] === commentChar || element[len - 1] === commentChar)46 })47 }48}49function transformation(values, config, counter) {50 const { delimiter = ',', skipComments = false, headersArray = [] } = config51 let valuesArray = values;52 // check for delimiter53 valuesArray = delimiter === ',' ? valuesArray : transformForDelimiter(valuesArray, delimiter)54 // check for skip Comments55 valuesArray = skipComments === false ? valuesArray : transformForSkipComments(valuesArray, '#')56 if (headersArray.length) {57 // iterated and make object 58 valuesArray = transformForHeader(valuesArray, headersArray, counter)59 }60 return valuesArray61}62// generates lines from a csv stream 63async function* csvLines(chunkStream) {64 try {65 let remainingLine = ''; // chunk may ends in the middle of a line66 for await (const chunk of chunkStream) {67 const linesFromChunk = (remainingLine + chunk).split('\n');68 remainingLine = linesFromChunk.pop();69 yield linesFromChunk;70 }71 yield remainingLine;72 } catch (error) {73 throw error74 }75}76// parser 77async function* csvToJsonParser(source, config) {78 try {79 const { headers = false } = config80 let counter = 0;81 for await (let values of csvLines(source)) {82 ++counter // to check if first record is in chunk83 // check for headers84 const headersArray = headers === false ? [] : getHeaderRow(values, config, counter)85 yield transformation(values, { ...config, headersArray }, counter)86 }87 } catch (error) {88 throw error89 }90}91module.exports = {92 csvToJsonParser...
csv-json.mjs
Source: csv-json.mjs
1function transformForDelimiter(valuesArray, delimiter) {2 if (valuesArray instanceof Array) {3 return valuesArray.map((element) => {4 return element.split(delimiter).join(',')5 })6 }7}8function getHeaderRow(valuesArray, { headers, delimiter = ',' }, counter) {9 // operate here on valuess10 let headersArray = []11 if (valuesArray instanceof Array) {12 if (counter === 1) {13 // this chunks have headers row14 if (headers === true) {15 headersArray = valuesArray[0].split(delimiter)16 }17 else {18 headersArray = headers19 // Todo: - check length of new headers = old headers20 }21 }22 return headersArray23 }24}25function transformForHeader(valuesArray, headersArray, counter) {26 if (counter === 1) {27 // remove header row28 valuesArray.shift()29 }30 return valuesArray.reduce((arr, element) => {31 const splittedValues = element.split(',')32 const rowObj = splittedValues.reduce((obj, value, i) => {33 const keyName = headersArray[i];34 const objProp = {}35 objProp[keyName] = value36 return { ...obj, ...objProp }37 }, {})38 return [...arr, rowObj]39 }, [])40}41function transformForSkipComments(valuesArray, commentChar) {42 if (valuesArray instanceof Array) {43 return valuesArray.filter((element) => {44 const len = element.length45 return !(element[0] === commentChar || element[len - 1] === commentChar)46 })47 }48}49function transformation(values, config, counter) {50 const { delimiter = ',', skipComments = false, headersArray = [] } = config51 let valuesArray = values;52 // check for delimiter53 valuesArray = delimiter === ',' ? valuesArray : transformForDelimiter(valuesArray, delimiter)54 // check for skip Comments55 valuesArray = skipComments === false ? valuesArray : transformForSkipComments(valuesArray, '#')56 if (headersArray.length) {57 // iterated and make object 58 valuesArray = transformForHeader(valuesArray, headersArray, counter)59 }60 return valuesArray61}62// generates lines from a csv stream 63async function* csvLines(chunkStream) {64 try {65 let remainingLine = ''; // chunk may ends in the middle of a line66 for await (const chunk of chunkStream) {67 const linesFromChunk = (remainingLine + chunk).split('\n');68 remainingLine = linesFromChunk.pop();69 yield linesFromChunk;70 }71 yield remainingLine;72 } catch (error) {73 throw error74 }75}76// parser 77export async function* csvToJsonParser(source, config) {78 try {79 const { headers = false } = config80 let counter = 0;81 for await (let values of csvLines(source)) {82 ++counter // to check if first record is in chunk83 // check for headers84 const headersArray = headers === false ? [] : getHeaderRow(values, config, counter)85 yield transformation(values, { ...config, headersArray }, counter)86 }87 } catch (error) {88 throw error89 }...
NWayMap.js
Source: NWayMap.js
1function NWayMap(input, headersArray) {2 this.isNWayMap = true;3 if (input.isNWayMap) {4 this.headersArray = input.headersArray;5 this.dataByHeaders = input.dataByHeaders;6 return this;7 }8 this.headersArray = headersArray;9 this.dataByHeaders = {};10 var objArr;11 if (this.type(input) === "object") {12 objArr = _.values(input);13 } else if (this.type(input) === "array") {14 objArr = input;15 }16 for (var i = 0; i < headersArray.length; i++) {17 var header = headersArray[i];18 this.dataByHeaders[header] = {};19 }20 for (var i = 0; i < objArr.length; i++) {21 this.put(objArr[i]);22 }23 return this;24}25NWayMap.prototype.checkHeader = function(header) {26 if (!_.contains(this.headersArray, header)) {27 throw "Error: Invalid header: " + header;28 }29};30NWayMap.prototype.put = function(value) {31 for (var i = 0; i < this.headersArray.length; i++) {32 var header = this.headersArray[i];33 if (this.get(header, value[header]) !== null) {34 throw "Error: Duplicate entry found in header: " + header + " for value " + JSON.stringify(value);35 }36 }37 for (var i = 0; i < this.headersArray.length; i++) {38 var header = this.headersArray[i];39 if (typeof value[header] !== 'undefined' && value[header] !== null) {40 this.dataByHeaders[header][value[header]] = value;41 }42 }43};44NWayMap.prototype.get = function(header, key) {45 this.checkHeader(header);46 return (typeof this.dataByHeaders[header][key] === 'undefined' || this.dataByHeaders[header][key] === null) ? null : this.dataByHeaders[header][key];47};48NWayMap.prototype.remove = function(header, key) {49 var prevValue = this.get(header, key);50 if (prevValue === null) {51 return null;52 }53 for (var i = 0; i < this.headersArray.length; i++) {54 var thisHeader = this.headersArray[i];55 delete this.dataByHeaders[thisHeader][prevValue[thisHeader]];56 }57 return prevValue;58};59NWayMap.prototype.getKeys = function(header) {60 this.checkHeader(header);61 return Object.keys(this.dataByHeaders[header]);62};63NWayMap.prototype.getValues = function(header) {64 this.checkHeader(header);65 var results = [];66 for (var i = 0; i < Object.keys(this.dataByHeaders[header]).length; i++) {67 results.push(this.dataByHeaders[header][Object.keys(this.dataByHeaders[header])[i]]);68 }69 return results;70};71NWayMap.prototype.type = function(a) {72 var t = typeof a;73 if (t === "number" && isNaN(a)) {74 return "NaN";75 } else if (t === "object") {76 return toString.call(a).replace("[object ", "").replace("]", "").toLowerCase();77 } else {78 return t.toLowerCase();79 }
...
requester.js
Source: requester.js
1class Requester {2 /**3 * @desc Metodo nativo de React.js4 *5 * @doc https://reactjs.org/docs/react-component.html#constructor6 * @return { void }7 */8 constructor() {9 this.headersArray = new Headers();10 // Cabeceras11 this.headersArray.append('Accept', 'application/json');12 this.headersArray.append('Content-Type', 'application/json');13 this.dispatch = false;14 }15 /**16 * metodo para obtener el dispatch y despachar acciones17 * @return { void }18 */19 addDispatch = (dispatch) => {20 this.dispatch = dispatch;21 };22 /**23 * @desc Añade cabeceras a la request24 *25 * @param { Object } headersArray26 *27 * @return { Headers }28 */29 addHeaders(newHeaders = {}) {30 //31 let {headersArray} = this;32 // Recorremos y añadimos las cabeceras.33 Object.keys(headersArray).length > 0 &&34 headersArray.forEach((prop, value) => {35 headersArray.append(prop, value);36 });37 }38 /**39 * @desc40 *41 * @param { String } endpoint42 *43 * @return { Promise }44 */45 get(endpoint, responseType = 'json') {46 return new Promise((resolve, reject) => {47 /**48 * @desc49 */50 try {51 // Cabeceras.52 let headers = this.headersArray;53 // Armamos el requester54 let request = new Request(endpoint, {55 method: 'GET',56 headers,57 cache: 'default',58 });59 let responseHeader = null;60 //61 fetch(request)62 .then((result) => {63 responseHeader = result.headers;64 if (result.status !== 200) {65 reject(result);66 return result;67 }68 return result[responseType]();69 })70 .then((response) => {71 response.headers = responseHeader;72 resolve(response);73 })74 .catch(reject);75 } catch (e) {76 reject(e.stack);77 }78 });79 }80 /**81 * Metodo para hacer request post82 * @param { String } endpoint83 * @param { Object } data84 * @return { Promise }85 */86 async post(endpoint, data) {87 try {88 // Cabeceras.89 let headers = this.headersArray;90 // Instancia del request.91 let request = new Request(endpoint, {92 method: 'POST',93 headers,94 body: JSON.stringify(data),95 cache: 'default',96 });97 // Solicitud98 const response = await fetch(request);99 // Parseamos a json.100 const result = await response.json();101 // Asignamos la cabecera.102 result.headers = response.headers;103 result.statusCode = response.status;104 return result;105 } catch (err) {106 return {107 error: {108 message: 'No se pudo conectar con el servidor',109 body: err,110 },111 };112 }113 }114}...
cf_elf_JSHeaderRequest.js
Source: cf_elf_JSHeaderRequest.js
1// 2. Extract Headers2var headerFieldsCollection = context.getVariable('request.headers.names') + '';3//Remove square brackets4headerFieldsCollection = headerFieldsCollection.substr(1, headerFieldsCollection.length - 2);5//Split string into an array6var headersArray = headerFieldsCollection.split(", ");7// get and create app attributes in case client uses basic auth8var authorization = context.getVariable("authorization");9var elfRequestHeaders = '{';10// Loop through Array and get value of header11for (var i = 0; i < headersArray.length; i++) {12 context.setVariable('headers.' + headersArray[i].toLowerCase(), context.getVariable('request.header.' + headersArray[i]));13 if(headersArray[i].toLowerCase()!=='authorization'){14 if (i!==0)15 elfRequestHeaders = elfRequestHeaders+',';16 elfRequestHeaders = elfRequestHeaders+'"request.header.' +headersArray[i]+'":"'+context.getVariable('request.header.' + headersArray[i])+'"';17 }18 // Below values assigned to have minimal impact to existing code19 context.setVariable(headersArray[i].toLowerCase(), context.getVariable('request.header.' + headersArray[i]));20}21elfRequestHeaders = elfRequestHeaders+"}";22context.setVariable("elfRequestHeaders",elfRequestHeaders);23// Store data required for logging24context.setVariable("elfLog.interactionId", context.getVariable("interactionid"));25context.setVariable("elfLog.workflowId", context.getVariable("workflowid"));26context.setVariable("elfLog.activityId", context.getVariable("activityid"));27context.setVariable("elfLog.requestVerb", context.getVariable("request.verb"));28context.setVariable("elfLog.proxyRequest", context.getVariable("request.content"));29context.setVariable("elfLog.contentType", context.getVariable("request.header.Content-Type"));30context.setVariable("elfLog.acceptType", context.getVariable("request.header.Accept"));31//context.setVariable("requestHeaderHost", context.getVariable("request.header.host"));32context.setVariable("requestHeaderHost", context.getVariable("hostName"));33context.setVariable("serviceTransactionId", context.getVariable("request.header.serviceTransactionId"));34context.setVariable("messageid", context.getVariable("request.header.messageid"));35context.setVariable("elfLog.logPayloadScope", context.getVariable("app.elfLog.logPayloadScope"));36// Variables to store all target requests and responses in a flow. These are stored in the order they are executed. Finally, these are used during ELF/Splunk logging37/*var targetRequestIndex = 0;...
Using AI Code Generation
1const { headersArray } = require('@playwright/test/lib/utils/utils');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 headers = await page.evaluate(headersArray, page._delegate._requestHeaders);8 console.log(headers);9 await browser.close();10})();
Using AI Code Generation
1const { headersArray } = require('playwright/lib/utils/utils');2const headers = headersArray({ 'Content-Type': 'application/json' });3console.log(headers);4const { headersObject } = require('playwright/lib/utils/utils');5const headers = headersObject([['Content-Type', 'application/json']]);6console.log(headers);7const { headersArray } = require('playwright/lib/utils/utils');8const { headersObject } = require('playwright/lib/utils/utils');9const headers = headersObject(headersArray({ 'Content-Type': 'application/json' }));10console.log(headers);
Using AI Code Generation
1const { headersArray } = require('playwright/lib/utils/utils');2const headers = headersArray([3]);4console.log(headers);5const { chromium } = require('playwright-chromium');6const { addHeaders } = require('playwright-headers');7(async () => {8 const browser = await chromium.launch();9 const context = await browser.newContext();10 const page = await context.newPage();11 await addHeaders(context, [12 ]);13})();14### addHeaders(context, headers)15MIT © [Rafael Goulart](
Using AI Code Generation
1const { headersArray } = require('playwright/lib/utils/utils');2const headers = headersArray(['Content-Type', 'application/json']);3console.log(headers);4const { headersObject } = require('playwright/lib/utils/utils');5const headers = headersObject(['Content-Type', 'application/json']);6console.log(headers);7const { headersObject } = require('playwright/lib/utils/utils');8const headers = headersObject({ 'Content-Type': 'application/json' });9console.log(headers);10const { mergeHeaders } = require('playwright/lib/utils/utils');11const headers = mergeHeaders({ 'Content-Type': 'application/json' }, { 'Content-Type': 'application/json' });12console.log(headers);13const { isSafeCloseError } = require('playwright/lib/utils/utils');14const headers = isSafeCloseError({ 'Content-Type': 'application/json' });15console.log(headers);16const { isSafeCloseError } = require('playwright/lib/utils/utils');17const headers = isSafeCloseError({ 'message': 'Target closed.' });18console.log(headers);19const { isSafeCloseError } = require('playwright/lib/utils/utils');20const headers = isSafeCloseError({ 'message': 'Target closed.' });21console.log(headers);22const { isSafeCloseError } = require('playwright/lib/utils/utils');23const headers = isSafeCloseError({ 'message': 'Target closed.' });24console.log(headers);25const { isSafeCloseError } = require('playwright/lib/utils/utils');26const headers = isSafeCloseError({ 'message': 'Target closed.' });27console.log(headers
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!!