Best JavaScript code snippet using playwright-internal
goalAttachment.js
Source:goalAttachment.js  
1var atts = new Array(); // global array of attachments, one for each unique PAEMPGOAL record2var multipleAtts = new Array();3var fromRefreshForm = false;4var fromFirstRefresh = false;5var calledGetAttachment = false;6var attachFrame;7var func1 = null;8var actionGlobal = null;9function evalOpenView(funcToCall)10{11	if(func1 != null) {12		var tempStore = func1;13		func1 = null;14		eval(tempStore);15		}16}17function refreshForm(prodline,company, employee, seqNbr)18{19	if(actionGlobal == "D") {20		evalOpenView(func1);21		actionGlobal = null;22	}23	fromRefreshForm = true;24	var goalform = right.document.forms["goalform"];25	getAttachment(prodline, company, employee, seqNbr, "jsreturn2");26}27function getAttachment(prodline, company, employee, seqNbr, frameStr)28{29	frameStr = (frameStr) ? frameStr : "jsreturn2";30	var attachObj = new GETATTACHObject(prodline,"PAEMPGOAL");31	attachObj.index = "PGOSET1";32	attachObj.rectype = "C"; // comment attachment33	attachObj.key = "K1=" + escape(company) + "&K2=" + escape(employee) + "&K3=" + escape(seqNbr);34	attachObj.out = "JS";35	attachObj.opm = "T";36	attachObj.data = "TRUE";37	attachObj.stat = "TRUE";38	attachObj.header = "TRUE";39	//attachObj.encode = "TEXT";40	attachObj.debug = false;41	if(fromFirstRefresh){42		attachObj.func = "refreshFirstAttachment";43		fromFirstRefresh = false;44	}45	else {46		attachObj.func = "refreshAttachment";47	}48	GETATTACH(attachObj,frameStr);49}50function writeAttachment(cmtObj, prodline, company, employee, seqNbr, action, frameStr)51{52	frameStr = (frameStr) ? frameStr : "jsreturn";53	var attachObj = new WRITEATTACHObject(prodline,"PAEMPGOAL");54	attachObj.index = "PGOSET1";55	attachObj.rectype = "C"; // comment attachment56	attachObj.key = "K1=" + escape(company) + "&K2=" + escape(employee) + "&K3=" + escape(seqNbr);57	attachObj.out = "JS";58	attachObj.opm = (action == "D") ? "D" : "M";59	attachObj.usertype = cmtObj.getUserType();60	if (action != "A" && cmtObj.getRecKey() != null && cmtObj.getSeqKey() != null)61	{62		// modify this record63		attachObj.reckey = escape(cmtObj.getRecKey(),1);64		attachObj.seqkey = escape(cmtObj.getSeqKey(),1);65	}66	if (action != "D")67	{68		attachObj.title = escape(cmtObj.getTitle(),1);69		attachObj.body = escape(cmtObj.getText(),1);70	}71	attachObj.data	= "TRUE";72	//attachObj.encode = "TEXT";73	attachObj.debug = false;74	actionGlobal = action;75	//Might be uneeded to do a refresh Attachment on a write76	if(attachObj.usertype == "C") {77		attachObj.func = (action == "D") ? "refreshForm" : "refreshAttachment";78	}79	else {80		fromFirstRefresh = true;81		attachObj.func = (action == "D") ? "refreshForm" : "refreshFirstAttachment";82	}83	WRITEATTACH(attachObj,frameStr);84}85function zeroPad(nbr, lgth)86{87	nbr = nbr.toString();88	for (var i=nbr.length; i<Number(lgth); i++)89		nbr = "0" + nbr;90	return nbr;91}92function highlightFieldInError(fldNm) {93	try {94		var formData = self.right.document.forms["goalform"];95		fldNm = fldNm.toString().toUpperCase();96		if (fldNm.indexOf("PGO-OBJECTIVE") >= 0)97		{98			fldObj = formData.elements["objective"];99			setRequiredField(fldObj);100			fldObj.focus();101			fldObj.select();102		} 103		else if (fldNm.indexOf("PGO-PRIORITY") >= 0)104		{105			fldObj = formData.elements["priority"];106			setRequiredField(fldObj);107			fldObj.focus();108			fldObj.select();109		} 110		else if (fldNm.indexOf("PGO-START-DATE") >= 0)111		{112			fldObj = formData.elements["startDate"];113			setRequiredField(fldObj);114			fldObj.focus();115			fldObj.select();116		} 117		else if (fldNm.indexOf("PGO-END-DATE") >= 0)118		{119			fldObj = formData.elements["endDate"];120			setRequiredField(fldObj);121			fldObj.focus();122			fldObj.select();123		}124		else if (fldNm.indexOf("PGO-PCT-COMPLETED") >= 0)125		{126			fldObj = formData.elements["pctComplete"];127			setRequiredField(fldObj);128			fldObj.focus();129			fldObj.select();130		}131		else if (fldNm.indexOf("PGO-COMPLETE-DATE") >= 0)132		{133			fldObj = formData.elements["completeDate"];134			setRequiredField(fldObj);135			fldObj.focus();136			fldObj.select();137		}138	} catch(e) {}139}140function updateDetailedDesc(prodline, company, employee, seqNbr, funcIncoming, userType)141{142	if (self.lawheader.abort == true) {143		highlightFieldInError(self.lawheader.gfldnbr);144		isUpdating = false;145		//stay on current edit screen146		return;147	}148	(seqNbr == 0) ? seqNbr = self.lawheader.currentSeqNbr: '';149	(funcIncoming) ? func1 = funcIncoming : '';150	var goalform = right.document.forms["goalform"];151	var co = zeroPad(company,4);152	var ee = zeroPad(employee,9);153	var seq = zeroPad(seqNbr,4);154	var parentKey = "K1=" + co + "&K2=" + ee + "&K3=" + seq;155	var attachText;156	var oCmt = new cmtAttach();157	if(userType == "P") {158		attachText = goalform.detailedDesc.value;159		oCmt.setTitle("GoalView Detailed Description"); // <-- use the short 30 character detailedDesc here160		oCmt.setUserType("P");161	}162	else {163		attachText = goalform.compComments.value;164		oCmt.setTitle("GoalView Completion Comments"); // <-- use the short 30 character detailedDesc here165		oCmt.setUserType("C");166	}167	if (attachText.indexOf("%0D%0A") == -1 && attachText.indexOf("%0A") != -1) {168		attachText = attachText.replace(/%0A/g,"%0D%0A");169	}170	// is this an add or a modification?171	// already exists, and attempting change172	if (atts[0] && (userType == "C"))173	{174		// change175		atts[0].setText(unescape(attachText));176		viewFlag = true;177		if(unescape(attachText) == ''){178			writeAttachment(atts[0], prodline, co, ee, seq, "D", "jsreturn");179			atts[0] = null;180		}181		else {182			writeAttachment(atts[0], prodline, co, ee, seq, "M", "jsreturn");183		}184	}185	else if (atts[1] && (userType == "P")) {186		// change187		atts[1].setText(unescape(attachText));188		viewFlag = true;189		if(unescape(attachText) == ''){190			writeAttachment(atts[1], prodline, co, ee, seq, "D", "jsreturn");191			atts[1] = null;192		}193		else {194			writeAttachment(atts[1], prodline, co, ee, seq, "M", "jsreturn");195		}196	}197	else198	{199		// add200		oCmt.setText(unescape(attachText));201		viewflag = true;202		writeAttachment(oCmt, prodline, co, ee, seq, "A", "jsreturn");203	}204}205function refreshFirstAttachment()206{207	fromFirstRefresh = false;208	attachFrame = self.jsreturn2;209	var goalform = right.document.forms["goalform"];210	var attachTextP = goalform.detailedDesc.value;211	if (attachFrame.CmtRec && attachFrame.CmtRec.length)212	{213		var lookingForP = "P";214		for(t=0;t<attachFrame.CmtRec.length;t++) {215			if(attachFrame.CmtRec[t].UserType == "P" && lookingForP == "P") {216				//attachTextP = doTextAttach(attachFrame.CommentData[t].join(""));217				addToArr(1,t,attachTextP, attachFrame);218				lookingForP = "";219			}220		}221	}222	// set the attachment text in the textarea223	goalform.detailedDesc.value = unescape(unescape(attachTextP));224	if(fromRefreshForm == true) {225		setTimeout(function(){document.getElementById("right").style.visibility = "visible";}, 100);226		//removeWaitAlert();227		fromRefreshForm = false;228	}229	evalOpenView(func1);230}231function refreshAttachment()232{233	// initial loading of attachments234	attachFrame = self.jsreturn2;235	var goalform = right.document.forms["goalform"];236	var attachTextP = goalform.detailedDesc.value;237	var attachTextC = goalform.compComments.value;238	// Initially set to null to prevent carryover from diff records239	atts[0] = null;240	atts[1] = null;241	if (attachFrame.CmtRec && attachFrame.CmtRec.length)242	{243		var lookingForC = "C";244		var lookingForP = "P";245		for(t=0;t<attachFrame.CmtRec.length;t++) {246			if(attachFrame.CmtRec[t].UserType == "C" && lookingForC == "C") {247				attachTextC = doTextAttach(attachFrame.CommentData[t].join(""));248				addToArr(0,t,attachTextC, attachFrame);249				lookingForC = "";250			}251			if(attachFrame.CmtRec[t].UserType == "P" && lookingForP == "P") {252				attachTextP = doTextAttach(attachFrame.CommentData[t].join(""));253				addToArr(1,t,attachTextP, attachFrame);254				lookingForP = "";255			}256		}257	}258	// set the attachment text in the textarea259	goalform.detailedDesc.value = unescape(unescape(attachTextP));260	goalform.compComments.value = unescape(unescape(attachTextC));261	if(fromRefreshForm == true) {262		setTimeout(function(){document.getElementById("right").style.visibility = "visible";}, 100);263		//removeWaitAlert();264		fromRefreshForm = false;265	}266	evalOpenView(func1);267}268function cmtAttach()269{270	this.title = null;271	this.text = null;272	this.modifiedDate = null;273	this.modifiedTime = null;274	this.userType = null;275	this.recKey = null;276	this.seqKey = null;277	this.parentKey = null;278}279cmtAttach.prototype.getTitle = function()280{281	return this.title;282}283cmtAttach.prototype.setTitle = function(t)284{285	this.title = t;286}287cmtAttach.prototype.getText = function()288{289	return this.text;290}291cmtAttach.prototype.setText = function(t)292{293	this.text = t;294}295cmtAttach.prototype.getModifiedDate = function()296{297	return this.modifiedDate;298}299cmtAttach.prototype.setModifiedDate = function(d)300{301	this.modifiedDate = d;302}303cmtAttach.prototype.getModifiedTime = function()304{305	return this.modifiedTime;306}307cmtAttach.prototype.setModifiedTime = function(t)308{309	this.modifiedTime = t;310}311cmtAttach.prototype.getUserType = function()312{313	return this.userType;314}315cmtAttach.prototype.setUserType = function(u)316{317	this.userType = u;318}319cmtAttach.prototype.getRecKey = function()320{321	return this.recKey;322}323cmtAttach.prototype.setRecKey = function(r)324{325	this.recKey = r;326}327cmtAttach.prototype.getSeqKey = function()328{329	return this.seqKey;330}331cmtAttach.prototype.setSeqKey = function(s)332{333	this.seqKey = s;334}335cmtAttach.prototype.getParentKey = function()336{337	return this.parentKey;338}339cmtAttach.prototype.setParentKey = function(p)340{341	this.parentKey = p;342}343// Extract a parameter value from a string.344function getVarFromString(varName, str, delim)345{346	var url = str;347	var ptr = url.indexOf(varName + "=");348	var ptr2;349	var val1 = "";350	var delim = (delim) ? delim : "&";351	if (ptr != -1)352	{353		var val1 = url.substring(ptr + varName.length + 1,url.length);354		var ptr2;355		if ((ptr2 = val1.indexOf(delim)) != -1)356		{357			if (ptr2 == -1)358				ptr2 = val1.length;359			val1 = val1.substring(0,ptr2);360		}361	}362	return val1;363}364function doTextAttach(textObj) {365	var attachText366				attachText = textObj;367				if (attachText.indexOf("%0D%0A") == -1 && attachText.indexOf("%0A") != -1) {368					attachText = attachText.replace(/%0A/g,"%0D%0A");369				}370	return attachText;371}372function addToArr(arrIndex, attachIndex, text, attachFrame) {373			var oCmt = new cmtAttach();374			oCmt.setTitle(attachFrame.CmtRec[attachIndex].Title);375			oCmt.setText(text);376			oCmt.setModifiedDate(attachFrame.CmtAttrib[attachIndex].ModifyDate);377			oCmt.setModifiedTime(attachFrame.CmtAttrib[attachIndex].ModifyTime);378			oCmt.setUserType(attachFrame.CmtRec[attachIndex].UserType);379			oCmt.setRecKey(attachFrame.CmtRec[attachIndex].RecKey);380			oCmt.setSeqKey(attachFrame.CmtRec[attachIndex].SeqKey);381			oCmt.setParentKey(attachFrame.CmtParentKey[attachIndex]);382			atts[arrIndex] = oCmt;...frame.spec.js
Source:frame.spec.js  
...20  const {beforeAll, beforeEach, afterAll, afterEach} = testRunner;21  describe('Frame.executionContext', function() {22    it('should work', async({page, server}) => {23      await page.goto(server.EMPTY_PAGE);24      await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);25      expect(page.frames().length).toBe(2);26      const [frame1, frame2] = page.frames();27      const context1 = await frame1.executionContext();28      const context2 = await frame2.executionContext();29      expect(context1).toBeTruthy();30      expect(context2).toBeTruthy();31      expect(context1 !== context2).toBeTruthy();32      expect(context1.frame()).toBe(frame1);33      expect(context2.frame()).toBe(frame2);34      await Promise.all([35        context1.evaluate(() => window.a = 1),36        context2.evaluate(() => window.a = 2)37      ]);38      const [a1, a2] = await Promise.all([39        context1.evaluate(() => window.a),40        context2.evaluate(() => window.a)41      ]);42      expect(a1).toBe(1);43      expect(a2).toBe(2);44    });45  });46  describe('Frame.evaluateHandle', function() {47    it('should work', async({page, server}) => {48      await page.goto(server.EMPTY_PAGE);49      const mainFrame = page.mainFrame();50      const windowHandle = await mainFrame.evaluateHandle(() => window);51      expect(windowHandle).toBeTruthy();52    });53  });54  describe('Frame.evaluate', function() {55    it_fails_ffox('should throw for detached frames', async({page, server}) => {56      const frame1 = await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);57      await utils.detachFrame(page, 'frame1');58      let error = null;59      await frame1.evaluate(() => 7 * 8).catch(e => error = e);60      expect(error.message).toContain('Execution Context is not available in detached frame');61    });62  });63  describe('Frame Management', function() {64    it('should handle nested frames', async({page, server}) => {65      await page.goto(server.PREFIX + '/frames/nested-frames.html');66      expect(utils.dumpFrames(page.mainFrame())).toEqual([67        'http://localhost:<PORT>/frames/nested-frames.html',68        '    http://localhost:<PORT>/frames/two-frames.html (2frames)',69        '        http://localhost:<PORT>/frames/frame.html (uno)',70        '        http://localhost:<PORT>/frames/frame.html (dos)',71        '    http://localhost:<PORT>/frames/frame.html (aframe)'72      ]);73    });74    it('should send events when frames are manipulated dynamically', async({page, server}) => {75      await page.goto(server.EMPTY_PAGE);76      // validate frameattached events77      const attachedFrames = [];78      page.on('frameattached', frame => attachedFrames.push(frame));79      await utils.attachFrame(page, 'frame1', './assets/frame.html');80      expect(attachedFrames.length).toBe(1);81      expect(attachedFrames[0].url()).toContain('/assets/frame.html');82      // validate framenavigated events83      const navigatedFrames = [];84      page.on('framenavigated', frame => navigatedFrames.push(frame));85      await utils.navigateFrame(page, 'frame1', './empty.html');86      expect(navigatedFrames.length).toBe(1);87      expect(navigatedFrames[0].url()).toBe(server.EMPTY_PAGE);88      // validate framedetached events89      const detachedFrames = [];90      page.on('framedetached', frame => detachedFrames.push(frame));91      await utils.detachFrame(page, 'frame1');92      expect(detachedFrames.length).toBe(1);93      expect(detachedFrames[0].isDetached()).toBe(true);94    });95    it('should send "framenavigated" when navigating on anchor URLs', async({page, server}) => {96      await page.goto(server.EMPTY_PAGE);97      await Promise.all([98        page.goto(server.EMPTY_PAGE + '#foo'),99        utils.waitEvent(page, 'framenavigated')100      ]);101      expect(page.url()).toBe(server.EMPTY_PAGE + '#foo');102    });103    it('should persist mainFrame on cross-process navigation', async({page, server}) => {104      await page.goto(server.EMPTY_PAGE);105      const mainFrame = page.mainFrame();106      await page.goto(server.CROSS_PROCESS_PREFIX + '/empty.html');107      expect(page.mainFrame() === mainFrame).toBeTruthy();108    });109    it('should not send attach/detach events for main frame', async({page, server}) => {110      let hasEvents = false;111      page.on('frameattached', frame => hasEvents = true);112      page.on('framedetached', frame => hasEvents = true);113      await page.goto(server.EMPTY_PAGE);114      expect(hasEvents).toBe(false);115    });116    it('should detach child frames on navigation', async({page, server}) => {117      let attachedFrames = [];118      let detachedFrames = [];119      let navigatedFrames = [];120      page.on('frameattached', frame => attachedFrames.push(frame));121      page.on('framedetached', frame => detachedFrames.push(frame));122      page.on('framenavigated', frame => navigatedFrames.push(frame));123      await page.goto(server.PREFIX + '/frames/nested-frames.html');124      expect(attachedFrames.length).toBe(4);125      expect(detachedFrames.length).toBe(0);126      expect(navigatedFrames.length).toBe(5);127      attachedFrames = [];128      detachedFrames = [];129      navigatedFrames = [];130      await page.goto(server.EMPTY_PAGE);131      expect(attachedFrames.length).toBe(0);132      expect(detachedFrames.length).toBe(4);133      expect(navigatedFrames.length).toBe(1);134    });135    it('should support framesets', async({page, server}) => {136      let attachedFrames = [];137      let detachedFrames = [];138      let navigatedFrames = [];139      page.on('frameattached', frame => attachedFrames.push(frame));140      page.on('framedetached', frame => detachedFrames.push(frame));141      page.on('framenavigated', frame => navigatedFrames.push(frame));142      await page.goto(server.PREFIX + '/frames/frameset.html');143      expect(attachedFrames.length).toBe(4);144      expect(detachedFrames.length).toBe(0);145      expect(navigatedFrames.length).toBe(5);146      attachedFrames = [];147      detachedFrames = [];148      navigatedFrames = [];149      await page.goto(server.EMPTY_PAGE);150      expect(attachedFrames.length).toBe(0);151      expect(detachedFrames.length).toBe(4);152      expect(navigatedFrames.length).toBe(1);153    });154    it('should report frame from-inside shadow DOM', async({page, server}) => {155      await page.goto(server.PREFIX + '/shadow.html');156      await page.evaluate(async url => {157        const frame = document.createElement('iframe');158        frame.src = url;159        document.body.shadowRoot.appendChild(frame);160        await new Promise(x => frame.onload = x);161      }, server.EMPTY_PAGE);162      expect(page.frames().length).toBe(2);163      expect(page.frames()[1].url()).toBe(server.EMPTY_PAGE);164    });165    it('should report frame.name()', async({page, server}) => {166      await utils.attachFrame(page, 'theFrameId', server.EMPTY_PAGE);167      await page.evaluate(url => {168        const frame = document.createElement('iframe');169        frame.name = 'theFrameName';170        frame.src = url;171        document.body.appendChild(frame);172        return new Promise(x => frame.onload = x);173      }, server.EMPTY_PAGE);174      expect(page.frames()[0].name()).toBe('');175      expect(page.frames()[1].name()).toBe('theFrameId');176      expect(page.frames()[2].name()).toBe('theFrameName');177    });178    it('should report frame.parent()', async({page, server}) => {179      await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);180      await utils.attachFrame(page, 'frame2', server.EMPTY_PAGE);181      expect(page.frames()[0].parentFrame()).toBe(null);182      expect(page.frames()[1].parentFrame()).toBe(page.mainFrame());183      expect(page.frames()[2].parentFrame()).toBe(page.mainFrame());184    });185    it('should report different frame instance when frame re-attaches', async({page, server}) => {186      const frame1 = await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);187      await page.evaluate(() => {188        window.frame = document.querySelector('#frame1');189        window.frame.remove();190      });191      expect(frame1.isDetached()).toBe(true);192      const [frame2] = await Promise.all([193        utils.waitEvent(page, 'frameattached'),194        page.evaluate(() => document.body.appendChild(window.frame)),195      ]);196      expect(frame2.isDetached()).toBe(false);197      expect(frame1).not.toBe(frame2);198    });199  });200};frame.js
Source:frame.js  
...18})19test.serial('Frame.executionContext should work', async t => {20  const { page, server } = t.context21  await page.goto(server.EMPTY_PAGE)22  await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE)23  t.is(page.frames().length, 2)24  const [frame1, frame2] = page.frames()25  const context1 = await frame1.executionContext()26  const context2 = await frame2.executionContext()27  t.truthy(context1)28  t.truthy(context2)29  t.truthy(context1 !== context2)30  t.is(context1.frame(), frame1)31  t.is(context2.frame(), frame2)32  await Promise.all([33    context1.evaluate(() => (window.a = 1)),34    context2.evaluate(() => (window.a = 2))35  ])36  const [a1, a2] = await Promise.all([37    context1.evaluate(() => window.a),38    context2.evaluate(() => window.a)39  ])40  t.is(a1, 1)41  t.is(a2, 2)42})43test.serial('Frame.evaluateHandle should work', async t => {44  const { page, server } = t.context45  await page.goto(server.EMPTY_PAGE)46  const mainFrame = page.mainFrame()47  const windowHandle = await mainFrame.evaluateHandle(() => window)48  t.truthy(windowHandle)49})50test.serial('Frame.evaluate should throw for detached frames', async t => {51  const { page, server } = t.context52  const frame1 = await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE)53  await utils.detachFrame(page, 'frame1')54  let error = null55  await frame1.evaluate(() => 7 * 8).catch(e => (error = e))56  t.true(57    error.message.includes(58      'Execution Context is not available in detached frame'59    )60  )61})62test.serial('Frame Management should handle nested frames', async t => {63  const { page, server } = t.context64  await page.goto(server.PREFIX + '/frames/nested-frames.html')65  t.deepEqual(utils.dumpFrames(page.mainFrame()), [66    'http://localhost:<PORT>/frames/nested-frames.html',67    '    http://localhost:<PORT>/frames/two-frames.html (2frames)',68    '        http://localhost:<PORT>/frames/frame.html (uno)',69    '        http://localhost:<PORT>/frames/frame.html (dos)',70    '    http://localhost:<PORT>/frames/frame.html (aframe)'71  ])72})73test.serial(74  'Frame Management should send events when frames are manipulated dynamically',75  async t => {76    const { page, server } = t.context77    await page.goto(server.EMPTY_PAGE)78    // validate frameattached events79    const attachedFrames = []80    page.on('frameattached', frame => attachedFrames.push(frame))81    await utils.attachFrame(page, 'frame1', './assets/frame.html')82    t.is(attachedFrames.length, 1)83    t.true(attachedFrames[0].url().includes('/assets/frame.html'))84    // validate framenavigated events85    const navigatedFrames = []86    page.on('framenavigated', frame => navigatedFrames.push(frame))87    await utils.navigateFrame(page, 'frame1', './empty.html')88    t.is(navigatedFrames.length, 1)89    t.is(navigatedFrames[0].url(), server.EMPTY_PAGE)90    // validate framedetached events91    const detachedFrames = []92    page.on('framedetached', frame => detachedFrames.push(frame))93    await utils.detachFrame(page, 'frame1')94    t.is(detachedFrames.length, 1)95    t.true(detachedFrames[0].isDetached())96  }97)98test.serial(99  'Frame Management should send "framenavigated" when navigating on anchor URLs',100  async t => {101    const { page, server } = t.context102    await page.goto(server.EMPTY_PAGE)103    await Promise.all([104      page.goto(server.EMPTY_PAGE + '#foo'),105      utils.waitEvent(page, 'framenavigated')106    ])107    t.is(page.url(), server.EMPTY_PAGE + '#foo')108  }109)110test.serial(111  'Frame Management should persist mainFrame on cross-process navigation',112  async t => {113    const { page, server } = t.context114    await page.goto(server.EMPTY_PAGE)115    const mainFrame = page.mainFrame()116    await page.goto(server.CROSS_PROCESS_PREFIX + '/empty.html')117    t.truthy(page.mainFrame() === mainFrame)118  }119)120test.serial(121  'Frame Management should not send attach/detach events for main frame',122  async t => {123    const { page, server } = t.context124    let hasEvents = false125    page.on('frameattached', frame => (hasEvents = true))126    page.on('framedetached', frame => (hasEvents = true))127    await page.goto(server.EMPTY_PAGE)128    t.false(hasEvents)129  }130)131test.serial(132  'Frame Management should detach child frames on navigation',133  async t => {134    const { page, server } = t.context135    let attachedFrames = []136    let detachedFrames = []137    let navigatedFrames = []138    page.on('frameattached', frame => attachedFrames.push(frame))139    page.on('framedetached', frame => detachedFrames.push(frame))140    page.on('framenavigated', frame => navigatedFrames.push(frame))141    await page.goto(server.PREFIX + '/frames/nested-frames.html')142    t.is(attachedFrames.length, 4)143    t.is(detachedFrames.length, 0)144    t.is(navigatedFrames.length, 5)145    attachedFrames = []146    detachedFrames = []147    navigatedFrames = []148    await page.goto(server.EMPTY_PAGE)149    t.is(attachedFrames.length, 0)150    t.is(detachedFrames.length, 4)151    t.is(navigatedFrames.length, 1)152  }153)154test.serial('Frame Management should support framesets', async t => {155  const { page, server } = t.context156  let attachedFrames = []157  let detachedFrames = []158  let navigatedFrames = []159  page.on('frameattached', frame => attachedFrames.push(frame))160  page.on('framedetached', frame => detachedFrames.push(frame))161  page.on('framenavigated', frame => navigatedFrames.push(frame))162  await page.goto(server.PREFIX + '/frames/frameset.html')163  t.is(attachedFrames.length, 4)164  t.is(detachedFrames.length, 0)165  t.is(navigatedFrames.length, 5)166  attachedFrames = []167  detachedFrames = []168  navigatedFrames = []169  await page.goto(server.EMPTY_PAGE)170  t.is(attachedFrames.length, 0)171  t.is(detachedFrames.length, 4)172  t.is(navigatedFrames.length, 1)173})174test.serial(175  'Frame Management should report frame from-inside shadow DOM',176  async t => {177    const { page, server } = t.context178    await page.goto(server.PREFIX + '/shadow.html')179    await page.evaluate(async url => {180      const frame = document.createElement('iframe')181      frame.src = url182      document.body.shadowRoot.appendChild(frame)183      await new Promise(x => (frame.onload = x))184    }, server.EMPTY_PAGE)185    t.is(page.frames().length, 2)186    t.is(page.frames()[1].url(), server.EMPTY_PAGE)187  }188)189test.serial('Frame Management should report frame.name()', async t => {190  const { page, server } = t.context191  await utils.attachFrame(page, 'theFrameId', server.EMPTY_PAGE)192  await page.evaluate(url => {193    const frame = document.createElement('iframe')194    frame.name = 'theFrameName'195    frame.src = url196    document.body.appendChild(frame)197    return new Promise(x => (frame.onload = x))198  }, server.EMPTY_PAGE)199  t.is(page.frames()[0].name(), '')200  t.is(page.frames()[1].name(), 'theFrameId')201  t.is(page.frames()[2].name(), 'theFrameName')202})203test.serial('Frame Management should report frame.parent()', async t => {204  const { page, server } = t.context205  await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE)206  await utils.attachFrame(page, 'frame2', server.EMPTY_PAGE)207  t.falsy(page.frames()[0].parentFrame())208  t.is(page.frames()[1].parentFrame(), page.mainFrame())209  t.is(page.frames()[2].parentFrame(), page.mainFrame())210})211test.serial(212  'Frame Management should report different frame instance when frame re-attaches',213  async t => {214    const { page, server } = t.context215    const frame1 = await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE)216    await page.evaluate(() => {217      window.frame = document.querySelector('#frame1')218      window.frame.remove()219    })220    t.true(frame1.isDetached())221    const [frame2] = await Promise.all([222      utils.waitEvent(page, 'frameattached'),223      page.evaluate(() => document.body.appendChild(window.frame))224    ])225    t.false(frame2.isDetached())226    t.true(frame1 != frame2)227  }...link.js
Source:link.js  
1'use strict';2var EventEmitter = require('events').EventEmitter,3    Promise = require('bluebird'),4    util = require('util'),5    StateMachine = require('stately.js'),6    debug = require('debug')('amqp10:link'),7    u = require('./utilities'),8    pu = require('./policies/policy_utilities'),9    frames = require('./frames'),10    errors = require('./errors');11var stateMachine = function(link) {12  var detachHandler = function(frame) {13    if (this.getMachineState() === 'ATTACHED') {14      this.ATTACHED.sendDetach({ closed: frame.closed });15    }16    link._detached(frame);17    return this.DETACHED;18  };19  var states = {20    'DETACHED': {21      sendAttach: 'ATTACHING',22      reattach: 'REATTACHING'23    },24    'ATTACHING': { attachReceived: 'ATTACHED' },25    'REATTACHING': { attachReceived: 'ATTACHED' },26    'ATTACHED': {27      sendDetach: function(options) {28        link._sendDetach(options);29        return this.DETACHING;30      },31    },32    'DETACHING': { detached: 'DETACHED' }33  };34  Object.keys(states).forEach(function(s) {35    states[s].forceDetach = 'DETACHED';36    states[s].detachReceived = detachHandler;37  });38  return states;39};40/**41 * @class42 * @extends EventEmitter43 * @fires Link#errorReceived44 * @fires Link#attached45 * @fires Link#detached46 */47function Link(session, handle, linkPolicy) {48  this.policy = linkPolicy;49  pu.fixDeprecatedLinkOptions(this.policy);50  this.session = session;51  this.handle = handle;52  this.remote = { handle: undefined };53  this.deliveryCount = 0;54  this._onAttach = [];55  if (this.policy && this.policy.reattach) {56    this._timeouts = u.generateTimeouts(this.policy.reattach);57  }58  var self = this;59  this.sm = new StateMachine(stateMachine(this));60  this.sm.bind(function(event, oldState, newState) {61    debug('stateChange(' + self.id + '):', oldState, '=>', newState, ', reason:', event);62  });63}64util.inherits(Link, EventEmitter);65/**66 * Error received event67 *68 * @event Link#errorReceived69 * @param {object} error the received error70 */71Link.ErrorReceived = 'errorReceived';72/**73 * Attached event74 *75 * @event Link#attached76 */77Link.Attached = 'attached';78/**79 * Detached event80 *81 * @event Link#detached82 */83Link.Detached = 'detached';84// public api85/**86 * Detach the link from the session87 *88 * @inner @memberof Link89 * @param {object} [options] detach frame options90 * @return {Promise}91 */92Link.prototype.detach = function(options) {93  var self = this;94  this._timeouts = undefined; // Disable any re-attachment policy.95  var detachPromise = new Promise(function(resolve, reject) {96    var onError = function(err) { reject(err); };97    self.once(Link.ErrorReceived, onError);98    self.once(Link.Detached, function(info) {99      self.removeListener(Link.ErrorReceived, onError);100      if (!!info.error) return reject(info.error);101      if (!info.closed) {102        if (!options || options.closed) {103          return reject('link not closed');104        }105      }106      resolve();107    });108  });109  this.sm.sendDetach(options);110  return detachPromise;111};112// private api113Link.prototype.state = function() {114  return this.sm.getMachineState().toLowerCase();115};116Object.defineProperty(Link.prototype, 'id', {117  get: function() { return this.name + ':' + this.handle; }118});119Link.prototype.attach = function() {120  this.sm.sendAttach();121  var attachFrame = new frames.AttachFrame(this.policy.attach);122  attachFrame.channel = this.session.channel;123  this.name = attachFrame.name;124  this.role = attachFrame.role;125  this.linkCredit = 0;126  this.available = 0;127  this.drain = false;128  this.session.connection.sendFrame(attachFrame);129};130///131/// Force link state to detached without sending detach message - usually due to forcible disconnect or unmap from above.132/// Important bit is that this should not trigger auto-reattach behavior as that'll happen with reconnect.133///134Link.prototype.forceDetach = function() {135  var state = this.state();136  if (state !== 'attached' && state !== 'attaching' && state !== 'reattaching') {137    return;138  }139  debug('forceDetach(' + this.id + '): current state:', state);140  if (!!this._reattachTimer) clearTimeout(this._reattachTimer);141  this.sm.forceDetach();142  this.emit(Link.Detached, {143    closed: true,144    error: new errors.ProtocolError('amqp:link:detach-forced', 'detach-forced')145  });146};147Link.prototype._resolveAttachPromises = function(err, link) {148  for (var i = 0; i < this._onAttach.length; ++i) {149    var attachPromise = this._onAttach[i];150    attachPromise(err, link);151  }152  this._onAttach = [];153};154Link.prototype._attachReceived = function(attachFrame) {155  this.sm.attachReceived();156  // process params.157  this.remote.handle = attachFrame.handle;158  this.remote.attach = attachFrame;159  this.session._linksByRemoteHandle[this.remote.handle] = this;160  debug(this.name + ': attached CH=[' + this.session.channel + '=>' + attachFrame.channel + '], Handle=[' + this.handle + '=>' + attachFrame.handle + ']');161  this.emit(Link.Attached, this);162  this._resolveAttachPromises(null, this);163  this._checkCredit({ initial: true });164};165// default implementation does nothing166Link.prototype._checkCredit = function() {};167Link.prototype.flow = function(options) {168  options = options || {};169  var flowOptions = u.defaults(options, {170    channel: this.session.channel,171    handle: this.handle,172    linkCredit: this.linkCredit,173    nextIncomingId: this.session._sessionParams.nextIncomingId,174    incomingWindow: this.session._sessionParams.incomingWindow,175    nextOutgoingId: this.session._sessionParams.nextOutgoingId,176    outgoingWindow: this.session._sessionParams.outgoingWindow,177    available: this.available,178    deliveryCount: this.deliveryCount,179    drain: false180  });181  this.session.connection.sendFrame(new frames.FlowFrame(flowOptions));182};183Link.prototype._sendDetach = function(options) {184  options = options || {};185  var detachoptions = u.defaults(options, {186    handle: this.handle,187    channel: this.session.channel,188    closed: true,189    error: null190  });191  this.session.connection.sendFrame(new frames.DetachFrame(detachoptions));192};193Link.prototype._detached = function(frame) {194  if (frame && frame.error) {195    this.emit(Link.ErrorReceived, errors.wrapProtocolError(frame.error));196  }197  this.remote.detach = frame;198  if (this.remote.handle !== undefined) {199    delete this.session._linksByRemoteHandle[this.remote.handle];200    this.remote.handle = undefined;201  }202  this.emit(Link.Detached, { closed: frame.closed, error: errors.wrapProtocolError(frame.error) });203  this._resolveAttachPromises(frame.error ? frame.error : 'link closed');204  this.sm.detached();205  // now check for whether we should reattach206  var self = this;207  if (self.shouldReattach()) {208    process.nextTick(function() { self._attemptReattach(); });209  }210};211Link.prototype.shouldReattach = function() {212  if (this.session && !this.session.mapped) return false;213  if (!this.session || !this._timeouts) return false;214  if (!this._timeouts.length && !this.policy.reattach.forever) return false;215  return true;216};217Link.prototype._attemptReattach = function() {218  var self = this;219  if (!self._timeouts.length) {220    self._timeouts = u.generateTimeouts(self.policy.reattach);221  }222  self.sm.reattach();223  self._reattachTimer = setTimeout(function() {224    if (self.shouldReattach()) {225      debug('attempting to reattach: ' + self.id);226      self.attach();227    } else {228      process.nextTick(function() { self._attemptReattach(); });229    }230  }, self._timeouts.shift());231};...rte.util.js
Source:rte.util.js  
1jQuery(document).ready(function () {2	var comment = document.getElementById("respond");3	var replyrow = document.getElementById("replyrow");4	if (comment && typeof (comment) != "undefined")5	{6		window.RTECONTAINER = comment;7		window.RTECHECKERTIMER = setInterval(RTE_CheckParent, 100);8	}9	else if (replyrow && typeof (replyrow) != "undefined")10	{11		window.RTECONTAINER = replyrow;12		window.RTECHECKERTIMER = setInterval(RTE_CheckParent, 100);13	}	14});15function RTE_CheckParent()16{17	/*for 3.0-3.2*/18	var ed_reply_qtags = document.getElementById("ed_reply_qtags");19	if (ed_reply_qtags && typeof (ed_reply_qtags) != "undefined")20		ed_reply_qtags.style.display="none";21	var post_status_info = document.getElementById("post-status-info");22	if (post_status_info && typeof (post_status_info) != "undefined")23		post_status_info.style.display = "none";24	var editor_toolbar = document.getElementById("editor-toolbar");25	if (editor_toolbar && typeof (editor_toolbar) != "undefined")26		editor_toolbar.style.display = "none";27	var quicktags = document.getElementById("quicktags");28	if (quicktags && typeof (quicktags) != "undefined")29		quicktags.style.display = "none";30	var content_parent = document.getElementById("content_parent");31	if (content_parent && typeof (content_parent) != "undefined")32		content_parent.style.display = "none";33	var editorcontainer = document.getElementById("editorcontainer");34	if (editorcontainer && typeof (editorcontainer) != "undefined")35		editorcontainer.style.border = "none";36	/*check reply row*/37	var replyrow = document.getElementById("replyrow");38	if (replyrow && !document.getElementById("content"))39	{40		var prow = replyrow.parentNode;41		var trs = prow.getElementsByTagName("tr");42		var ci = -1;43		for (var i = 0; i < trs.length; i++)44		{45			if (!trs[i].id)46				continue;47			if (trs[i].id == replyrow.id)48			{49				ci = i;50				break;51			}52		}53		if (ci == -1)54			return;55		if (!window.WP_REPLYROWINDEX) {56			window.WP_REPLYROWINDEX = ci;57			window.WP_RTEEDITOR.DetachFrame();58			window.WP_RTEEDITOR.AttachFrame();59			window.WP_RTEEDITOR.SetText("");60			return;61		}62		if (ci != window.WP_REPLYROWINDEX)63		{64			window.WP_REPLYROWINDEX = ci;65			window.WP_RTEEDITOR.DetachFrame();66			window.WP_RTEEDITOR.AttachFrame();67			window.WP_RTEEDITOR.SetText("");68		}69		return;70	}71	/*end for 3.0-3.2*/72	if (!window.WP_RTEEDITOR)73		return;74	if (!window.RTECONTAINER)75		return;76	if (!window.RTEPARENT)77	{78		window.RTEPARENT = window.RTECONTAINER.parentNode;79		return;80	}81	var curparent = window.RTECONTAINER.parentNode;82	//document.title = [curparent, window.RTEPARENT];83	if (window.RTEPARENT == curparent)84		return;85	window.RTEPARENT = curparent;86	window.WP_RTEEDITOR.DetachFrame();87	//rteeditor._config.skin_div_parent.insertBefore(div, rteeditor._config.skin_div_holder);88	//rteeditor._config.skin_div_parent.removeChild(rteeditor._config.skin_div_holder);89	//rteeditor._config.skin_div_holder = div;90	window.WP_RTEEDITOR.AttachFrame();91	window.WP_RTEEDITOR.SetText("");...TaskExecutor.js
Source:TaskExecutor.js  
1// @flow2import * as React from 'react';3type ExecutorMessage = {4  command: string,5  payload: any,6};7export type CommandHandler = (payload: any) => void | Promise<void>;8type Props = {|9  code: string,10  handlers: {11    [command: string]: CommandHandler,12  },13|};14type Instance = React.ElementRef<'iframe'>;15const fetchExecutorDoc = fetch('/executor').then((response) => response.text());16/**17 * A TaskExecutor encapsulates a single hidden, sandboxed iframe containing the `/executor` document.18 * TaskExecutors are managed by an executor.19 *20 * The component sets up communication facilities for communication between the iframe and the IDE.21 */22const TaskExecutor = React.forwardRef<Props, Instance>(23  ({ code, handlers }: Props, ref: Ref<Instance>) => {24    // load the executorDoc in the beginning25    const [executorDoc, setExecutorDoc] = React.useState<string | null>(null);26    React.useEffect(() => {27      fetchExecutorDoc.then(setExecutorDoc);28    }, []);29    // the frame, stored for local use30    const [frame, setFrame] = React.useState<React.ElementRef<'iframe'> | null>(null);31    // uses useCallback because otherwise each render resets the ref.32    // (the ref could be registered with a new callback, so the callback needs to be stable)33    const attachFrame = React.useCallback(34      (f) => {35        // set the ref for this component36        if (typeof ref === 'function') ref(f);37        else ref.current = f;38        // set the frame state variable39        setFrame(f);40      },41      [ref],42    );43    // register message listener44    React.useEffect(() => {45      if (frame === null) return undefined;46      function receiveMessage({ data, origin, source }: MessageEvent) {47        if (origin !== 'null' || source !== frame.contentWindow) return;48        const { command, payload } =49          // if the source is what we expected, we assume the data is valid50          // $FlowExpectError51          (data: ExecutorMessage);52        handlers[command]?.(payload);53      }54      window.addEventListener('message', receiveMessage, false);55      return () => {56        window.removeEventListener('message', receiveMessage);57      };58    }, [frame, handlers]);59    // send execute command to iframe60    React.useEffect(() => {61      if (frame === null) return;62      frame.onload = () => {63        const sender = null;64        const command = 'init';65        const payload = code;66        frame.contentWindow.postMessage({ sender, command, payload }, '*');67      };68    }, [frame, code]);69    // only render the iframe after loading the executorDoc70    if (executorDoc === null) return null;71    return (72      // eslint-disable-next-line jsx-a11y/iframe-has-title73      <iframe74        ref={attachFrame}75        sandbox="allow-scripts"76        // src="/executor"77        srcDoc={executorDoc}78        style={{ display: 'none' }}79      />80    );81  },82);...utils.js
Source:utils.js  
...20   * @param {string} url21   */22  attachFrame: async function(page, frameId, url) {23    await page.evaluate(attachFrame, frameId, url);24    function attachFrame(frameId, url) {25      const frame = document.createElement('iframe');26      frame.src = url;27      frame.id = frameId;28      document.body.appendChild(frame);29      return new Promise(x => frame.onload = x);30    }31  },32  /**33   * @param {!Page} page34   * @param {string} frameId35   */36  detachFrame: async function(page, frameId) {37    await page.evaluate(detachFrame, frameId);38    function detachFrame(frameId) {...frame-utils.js
Source:frame-utils.js  
...21   * @return {!Promise}22   */23  attachFrame: async function(page, frameId, url) {24    await page.evaluate(attachFrame, frameId, url);25    function attachFrame(frameId, url) {26      const frame = document.createElement('iframe');27      frame.src = url;28      frame.id = frameId;29      document.body.appendChild(frame);30      return new Promise(x => frame.onload = x);31    }32  },33  /**34   * @param {!Page} page35   * @param {string} frameId36   * @return {!Promise}37   */38  detachFrame: async function(page, frameId) {39    await page.evaluate(detachFrame, frameId);...Using AI Code Generation
1const { attachFrame } = require('playwright/lib/server/chromium/crPage');2const { chromium } = require('playwright');3(async () => {4  const browser = await chromium.launch();5  const page = await browser.newPage();6  const frame = await page.frames()[0];7  await attachFrame(page, frame._id, frame._url);8  await page.evaluate((id) => {9    const frame = document.getElementById(id);10    frame.remove();11  }, frame._id);12  await browser.close();13})();14import { chromium } from 'playwright';15const { chromium } = require('playwright');16import { chromium } from 'playwright';17const { chromium } = require('playwright');18import { chromium } from 'playwright';19(async () => {20  const browser = await chromium.launch();21  const page = await browser.newPage();22  await page.screenshot({ path: 'example.png' });23  await browser.close();24})();25import { chromium } from 'playwright';26(async () => {27  const browser = await chromium.launch();28  const page = await browser.newPage();Using AI Code Generation
1const { attachFrame } = require('playwright/lib/server/chromium/crPage');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  console.log(frame.url());8  await browser.close();9})();Using AI Code Generation
1const { attachFrame } = require('playwright/lib/server/chromium/crPage');2const path = require('path');3(async () => {4  const browser = await chromium.launch();5  const page = await browser.newPage();6  const frame = await attachFrame(page, null, path.join(__dirname, 'frame.html'));7  await frame.waitForSelector('h1');8  await browser.close();9})();10The attachFrame method takes three parameters: the page object, the name of the frame (null in this case) and the path to the fileUsing AI Code Generation
1const { attachFrame } = require('@playwright/test/lib/frame');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  await frame.click('text=About');8  await page.close();9  await context.close();10  await browser.close();11})();12const { attachFrame } = require('@playwright/test/lib/frame');13const { chromium } = require('playwright');14(async () => {15  const browser = await chromium.launch();16  const context = await browser.newContext();17  const page = await context.newPage();18  await frame.click('text=About');19  await page.close();20  await context.close();21  await browser.close();22})();23const { attachFrame } = require('@playwright/test/lib/frame');24const { chromium } = require('playwright');25(async () => {26  const browser = await chromium.launch();27  const context = await browser.newContext();28  const page = await context.newPage();29  await frame.click('text=About');30  await page.close();31  await context.close();32  await browser.close();33})();34const { attachFrame } = require('@playwright/test/lib/frame');35const { chromium } = require('playwright');36(async () => {37  const browser = await chromium.launch();38  const context = await browser.newContext();39  const page = await context.newPage();40  await frame.click('text=About');41  await page.close();42  await context.close();Using AI Code Generation
1const { chromium } = require('playwright-chromium');2const { attachFrame } = require('playwright-core/lib/server/chromium/crPage');3(async () => {4  const browser = await chromium.launch();5  const context = await browser.newContext();6  const page = await context.newPage();7  const frames = await page.frames();8  const frame = frames[1];9  const element = await frame.$('#hplogo');10  await attachFrame(page, frame, element);11  await browser.close();12})();Using AI Code Generation
1const { attachFrame } = require('playwright-core/lib/server/chromium/crPage');2const { createTestServer } = require('playwright-core/lib/utils/testserver/');3const { chromium } = require('playwright-core');4(async () => {5  const server = await createTestServer();6  server.setRoute('/empty.html', (req, res) => {7    res.end();8  });9  server.setRoute('/frame.html', (req, res) => {10    res.end(`11      <iframe src="${server.PREFIX}/empty.html"></iframe>12    `);13  });14  const browser = await chromium.launch();15  const context = await browser.newContext();16  const page = await context.newPage();17  await page.goto(server.EMPTY_PAGE);18  await page.setContent(`<iframe src="${server.PREFIX}/frame.html"></iframe>`);19  const frame = page.frames()[1];20  const childFrame = frame.childFrames()[0];21  await attachFrame(page, 'frameId', server.EMPTY_PAGE);22  await page.evaluate(frameId => {23    window.frames[frameId].location.href = '/empty.html';24  }, 'frameId');25  await childFrame.waitForNavigation();26  await browser.close();27  await server.stop();28})();29module.exports = {30  use: {31  }32};33{34  "scripts": {35  },36  "dependencies": {37  }38}Using AI Code Generation
1const { attachFrame } = require('playwright/lib/server/chromium/crPage');2const { chromium } = require('playwright');3const { createServer } = require('http-server');4(async () => {5  const server = createServer({ root: '.' });6  server.listen(8080);7  const browser = await chromium.launch({ headless: false });8  const page = await browser.newPage();9  await frame.waitForSelector('text=Playwright');10  await frame.click('text=Playwright');11  await browser.close();12  server.close();13})();14<button onclick="window.alert('Hello')">Click me</button>Using AI Code Generation
1const { chromium, webkit, firefox } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  const frame = page.mainFrame().childFrames()[0];7  await page.evaluate(() => {8    window.attachFrame = (frame) => {9      document.body.appendChild(frame);10    };11  });12  await page.evaluate(frame => window.attachFrame(frame), frame);13  await page.screenshot({ path: 'test.png' });14  await browser.close();15})();16const { test, expect } = require('@playwright/test');17test('test', async ({ page }) => {18  await page.goto('test.html');19  const frame = page.mainFrame().childFrames()[0];20  await page.evaluate(() => {21    window.attachFrame = (frame) => {22      document.body.appendChild(frame);23    };24  });25  await page.evaluate(frame => window.attachFrame(frame), frame);26  await page.screenshot({ path: 'test.png' });27});Using AI Code Generation
1const { attachFrame } = require('playwright-core/lib/server/dom.js');2const frame = await attachFrame(page, 'frameId', 'frameName', 'frameUrl');3const { detachFrame } = require('playwright-core/lib/server/dom.js');4await detachFrame(page, frame);5const { attachWorker } = require('playwright-core/lib/server/dom.js');6const worker = await attachWorker(page, 'workerId', 'workerUrl');7const { detachWorker } = require('playwright-core/lib/server/dom.js');8await detachWorker(page, worker);9const { setFileChooserIntercepted } = require('playwright-core/lib/server/dom.js');10await setFileChooserIntercepted(page, true);11const { setFileChooserFiles } = require('playwright-core/lib/server/dom.js');12await setFileChooserFiles(page, ['path/to/file1', 'path/to/file2']);13const { setFileChooserFiles } = require('playwright-core/lib/server/dom.js');14await setFileChooserFiles(page, ['path/to/file1', 'path/to/file2']);15const { setFileChooserFiles } = require('playwright-core/lib/server/dom.js');16await setFileChooserFiles(page, ['path/to/file1', 'path/to/file2']);17const { setFileChooserFiles } = require('playwright-core/lib/server/dom.js');18await setFileChooserFiles(page, ['path/to/file1', 'path/to/file2']);19const { setFileChooserFiles } = require('playwright-core/lib/server/dom.js');20await setFileChooserFiles(page, ['path/to/file1', 'path/to/file2']);21const { setFileChooserFiles } = require('playwright-core/lib/server/dom.js');22await setFileChooserFiles(page, ['path/to/file1', 'path/to/file2']);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!!
