Best JavaScript code snippet using playwright-internal
portals.test.js
Source:portals.test.js  
...27	it('should render into a different root node', () => {28		let root = document.createElement('div');29		document.body.appendChild(root);30		function Foo(props) {31			return <div>{createPortal(props.children, root)}</div>;32		}33		render(<Foo>foobar</Foo>, scratch);34		expect(root.innerHTML).to.equal('foobar');35		root.parentNode.removeChild(root);36	});37	it('should insert the portal', () => {38		let setFalse;39		function Foo(props) {40			const [mounted, setMounted] = useState(true);41			setFalse = () => setMounted(() => false);42			return (43				<div>44					<p>Hello</p>45					{mounted && createPortal(props.children, scratch)}46				</div>47			);48		}49		render(<Foo>foobar</Foo>, scratch);50		expect(scratch.innerHTML).to.equal('foobar<div><p>Hello</p></div>');51		setFalse();52		rerender();53		expect(scratch.innerHTML).to.equal('<div><p>Hello</p></div>');54	});55	it('should toggle the portal', () => {56		let toggle;57		function Foo(props) {58			const [mounted, setMounted] = useState(true);59			toggle = () => setMounted(s => !s);60			return (61				<div>62					<p>Hello</p>63					{mounted && createPortal(props.children, scratch)}64				</div>65			);66		}67		render(68			<Foo>69				<div>foobar</div>70			</Foo>,71			scratch72		);73		expect(scratch.innerHTML).to.equal(74			'<div>foobar</div><div><p>Hello</p></div>'75		);76		toggle();77		rerender();78		expect(scratch.innerHTML).to.equal('<div><p>Hello</p></div>');79		toggle();80		rerender();81		expect(scratch.innerHTML).to.equal(82			'<div><p>Hello</p></div><div>foobar</div>'83		);84	});85	it('should notice prop changes on the portal', () => {86		let set;87		function Foo(props) {88			const [additionalProps, setProps] = useState({89				style: { backgroundColor: 'red' }90			});91			set = c => setProps(c);92			return (93				<div>94					<p>Hello</p>95					{createPortal(<p {...additionalProps}>Foo</p>, scratch)}96				</div>97			);98		}99		render(<Foo />, scratch);100		expect(scratch.firstChild.style.backgroundColor).to.equal('red');101		set({});102		rerender();103		expect(scratch.firstChild.style.backgroundColor).to.equal('');104	});105	it('should not unmount the portal component', () => {106		let spy = sinon.spy();107		let set;108		class Child extends Component {109			componentWillUnmount() {110				spy();111			}112			render(props) {113				return props.children;114			}115		}116		function Foo(props) {117			const [additionalProps, setProps] = useState({118				style: { background: 'red' }119			});120			set = c => setProps(c);121			return (122				<div>123					<p>Hello</p>124					{createPortal(<Child {...additionalProps}>Foo</Child>, scratch)}125				</div>126			);127		}128		render(<Foo />, scratch);129		expect(spy).not.to.be.called;130		set({});131		rerender();132		expect(spy).not.to.be.called;133	});134	it('should not render <undefined> for Portal nodes', () => {135		let root = document.createElement('div');136		let dialog = document.createElement('div');137		dialog.id = 'container';138		scratch.appendChild(root);139		scratch.appendChild(dialog);140		function Dialog() {141			return <div>Dialog content</div>;142		}143		function App() {144			return <div>{createPortal(<Dialog />, dialog)}</div>;145		}146		render(<App />, root);147		expect(scratch.firstChild.firstChild.childNodes.length).to.equal(0);148	});149	it('should unmount Portal', () => {150		let root = document.createElement('div');151		let dialog = document.createElement('div');152		dialog.id = 'container';153		scratch.appendChild(root);154		scratch.appendChild(dialog);155		function Dialog() {156			return <div>Dialog content</div>;157		}158		function App() {159			return <div>{createPortal(<Dialog />, dialog)}</div>;160		}161		render(<App />, root);162		expect(dialog.childNodes.length).to.equal(1);163		render(null, root);164		expect(dialog.childNodes.length).to.equal(0);165	});166	it('should leave a working root after the portal', () => {167		let toggle, toggle2;168		function Foo(props) {169			const [mounted, setMounted] = useState(false);170			const [mounted2, setMounted2] = useState(true);171			toggle = () => setMounted(s => !s);172			toggle2 = () => setMounted2(s => !s);173			return (174				<div>175					{mounted && createPortal(props.children, scratch)}176					{mounted2 && <p>Hello</p>}177				</div>178			);179		}180		render(181			<Foo>182				<div>foobar</div>183			</Foo>,184			scratch185		);186		expect(scratch.innerHTML).to.equal('<div><p>Hello</p></div>');187		toggle();188		rerender();189		expect(scratch.innerHTML).to.equal(190			'<div><p>Hello</p></div><div>foobar</div>'191		);192		toggle2();193		rerender();194		expect(scratch.innerHTML).to.equal('<div></div><div>foobar</div>');195		toggle2();196		rerender();197		expect(scratch.innerHTML).to.equal(198			'<div><p>Hello</p></div><div>foobar</div>'199		);200		toggle();201		rerender();202		expect(scratch.innerHTML).to.equal('<div><p>Hello</p></div>');203		toggle2();204		rerender();205		expect(scratch.innerHTML).to.equal('<div></div>');206	});207	it('should work with stacking portals', () => {208		let toggle, toggle2;209		function Foo(props) {210			const [mounted, setMounted] = useState(false);211			const [mounted2, setMounted2] = useState(false);212			toggle = () => setMounted(s => !s);213			toggle2 = () => setMounted2(s => !s);214			return (215				<div>216					<p>Hello</p>217					{mounted && createPortal(props.children, scratch)}218					{mounted2 && createPortal(props.children2, scratch)}219				</div>220			);221		}222		render(223			<Foo children2={<div>foobar2</div>}>224				<div>foobar</div>225			</Foo>,226			scratch227		);228		expect(scratch.innerHTML).to.equal('<div><p>Hello</p></div>');229		toggle();230		rerender();231		expect(scratch.innerHTML).to.equal(232			'<div><p>Hello</p></div><div>foobar</div>'233		);234		toggle2();235		rerender();236		expect(scratch.innerHTML).to.equal(237			'<div><p>Hello</p></div><div>foobar</div><div>foobar2</div>'238		);239		toggle2();240		rerender();241		expect(scratch.innerHTML).to.equal(242			'<div><p>Hello</p></div><div>foobar</div>'243		);244		toggle();245		rerender();246		expect(scratch.innerHTML).to.equal('<div><p>Hello</p></div>');247	});248	it('should work with changing the container', () => {249		let set, ref;250		function Foo(props) {251			const [container, setContainer] = useState(scratch);252			set = setContainer;253			return (254				<div255					ref={r => {256						ref = r;257					}}258				>259					<p>Hello</p>260					{createPortal(props.children, container)}261				</div>262			);263		}264		render(265			<Foo>266				<div>foobar</div>267			</Foo>,268			scratch269		);270		expect(scratch.innerHTML).to.equal(271			'<div>foobar</div><div><p>Hello</p></div>'272		);273		set(() => ref);274		rerender();275		expect(scratch.innerHTML).to.equal(276			'<div><p>Hello</p><div>foobar</div></div>'277		);278	});279	it('should work with replacing placeholder portals', () => {280		let toggle, toggle2;281		function Foo(props) {282			const [mounted, setMounted] = useState(false);283			const [mounted2, setMounted2] = useState(false);284			toggle = () => setMounted(s => !s);285			toggle2 = () => setMounted2(s => !s);286			return (287				<div>288					<p>Hello</p>289					{createPortal(mounted && props.children, scratch)}290					{createPortal(mounted2 && props.children, scratch)}291				</div>292			);293		}294		render(295			<Foo>296				<div>foobar</div>297			</Foo>,298			scratch299		);300		expect(scratch.innerHTML).to.equal('<div><p>Hello</p></div>');301		toggle();302		rerender();303		expect(scratch.innerHTML).to.equal(304			'<div><p>Hello</p></div><div>foobar</div>'305		);306		toggle();307		rerender();308		expect(scratch.innerHTML).to.equal('<div><p>Hello</p></div>');309		toggle2();310		rerender();311		expect(scratch.innerHTML).to.equal(312			'<div><p>Hello</p></div><div>foobar</div>'313		);314		toggle2();315		rerender();316		expect(scratch.innerHTML).to.equal('<div><p>Hello</p></div>');317	});318	it('should work with removing an element from stacked container to new one', () => {319		let toggle, root2;320		function Foo(props) {321			const [root, setRoot] = useState(scratch);322			toggle = () => setRoot(() => root2);323			return (324				<div325					ref={r => {326						root2 = r;327					}}328				>329					<p>Hello</p>330					{createPortal(props.children, scratch)}331					{createPortal(props.children, root)}332				</div>333			);334		}335		render(336			<Foo>337				<div>foobar</div>338			</Foo>,339			scratch340		);341		expect(scratch.innerHTML).to.equal(342			'<div>foobar</div><div>foobar</div><div><p>Hello</p></div>'343		);344		toggle();345		rerender();346		expect(scratch.innerHTML).to.equal(347			'<div>foobar</div><div><p>Hello</p><div>foobar</div></div>'348		);349	});350	it('should support nested portals', () => {351		let toggle, toggle2, inner;352		function Bar() {353			const [mounted, setMounted] = useState(false);354			toggle2 = () => setMounted(s => !s);355			return (356				<div357					ref={r => {358						inner = r;359					}}360				>361					<p>Inner</p>362					{mounted && createPortal(<p>hiFromBar</p>, scratch)}363					{mounted && createPortal(<p>innerPortal</p>, inner)}364				</div>365			);366		}367		function Foo(props) {368			const [mounted, setMounted] = useState(false);369			toggle = () => setMounted(s => !s);370			return (371				<div>372					<p>Hello</p>373					{mounted && createPortal(<Bar />, scratch)}374				</div>375			);376		}377		render(<Foo />, scratch);378		expect(scratch.innerHTML).to.equal('<div><p>Hello</p></div>');379		toggle();380		rerender();381		expect(scratch.innerHTML).to.equal(382			'<div><p>Hello</p></div><div><p>Inner</p></div>'383		);384		toggle2();385		rerender();386		expect(scratch.innerHTML).to.equal(387			'<div><p>Hello</p></div><div><p>Inner</p><p>innerPortal</p></div><p>hiFromBar</p>'388		);389		toggle();390		rerender();391		expect(scratch.innerHTML).to.equal('<div><p>Hello</p></div>');392	});393	it('should support nested portals remounting #2669', () => {394		let setVisible;395		let i = 0;396		function PortalComponent(props) {397			const innerVnode = <div id="inner">{i}</div>;398			innerVnode.___id = 'inner_' + i++;399			const outerVnode = (400				<div id="outer">401					{i}402					{props.show && createPortal(innerVnode, scratch)}403				</div>404			);405			outerVnode.___id = 'outer_' + i++;406			return createPortal(outerVnode, scratch);407		}408		function App() {409			const [visible, _setVisible] = useState(true);410			setVisible = _setVisible;411			return (412				<div id="app">413					test414					<PortalComponent show={visible} />415				</div>416			);417		}418		render(<App />, scratch);419		expect(scratch.innerHTML).to.equal(420			'<div id="inner">0</div><div id="outer">1</div><div id="app">test</div>'421		);422		act(() => {423			setVisible(false);424		});425		rerender();426		expect(scratch.innerHTML).to.equal(427			'<div id="outer">3</div><div id="app">test</div>'428		);429		act(() => {430			setVisible(true);431		});432		rerender();433		expect(scratch.innerHTML).to.equal(434			'<div id="outer">5</div><div id="app">test</div><div id="inner">4</div>'435		);436		act(() => {437			setVisible(false);438		});439		rerender();440		expect(scratch.innerHTML).to.equal(441			'<div id="outer">7</div><div id="app">test</div>'442		);443	});444	it('should not unmount when parent renders', () => {445		let root = document.createElement('div');446		let dialog = document.createElement('div');447		dialog.id = 'container';448		scratch.appendChild(root);449		scratch.appendChild(dialog);450		let spy = sinon.spy();451		class Child extends Component {452			componentDidMount() {453				spy();454			}455			render() {456				return <div id="child">child</div>;457			}458		}459		let spyParent = sinon.spy();460		class App extends Component {461			componentDidMount() {462				spyParent();463			}464			render() {465				return <div>{createPortal(<Child />, dialog)}</div>;466			}467		}468		render(<App />, root);469		let dom = document.getElementById('child');470		expect(spyParent).to.be.calledOnce;471		expect(spy).to.be.calledOnce;472		// Render twice to trigger update scenario473		render(<App />, root);474		render(<App />, root);475		let domNew = document.getElementById('child');476		expect(dom).to.equal(domNew);477		expect(spyParent).to.be.calledOnce;478		expect(spy).to.be.calledOnce;479	});480	it('should switch between non portal and portal node (Modal as lastChild)', () => {481		let toggle;482		const Modal = ({ children, open }) =>483			open ? createPortal(<div>{children}</div>, scratch) : <div>Closed</div>;484		const App = () => {485			const [open, setOpen] = useState(false);486			toggle = setOpen.bind(this, x => !x);487			return (488				<div>489					<button onClick={() => setOpen(!open)}>Show</button>490					{open ? 'Open' : 'Closed'}491					<Modal open={open}>Hello</Modal>492				</div>493			);494		};495		render(<App />, scratch);496		expect(scratch.innerHTML).to.equal(497			'<div><button>Show</button>Closed<div>Closed</div></div>'498		);499		toggle();500		rerender();501		expect(scratch.innerHTML).to.equal(502			'<div><button>Show</button>Open</div><div>Hello</div>'503		);504	});505	it('should switch between non portal and portal node (Modal as firstChild)', () => {506		let toggle;507		const Modal = ({ children, open }) =>508			open ? createPortal(<div>{children}</div>, scratch) : <div>Closed</div>;509		const App = () => {510			const [open, setOpen] = useState(false);511			toggle = setOpen.bind(this, x => !x);512			return (513				<div>514					<Modal open={open}>Hello</Modal>515					<button onClick={() => setOpen(!open)}>Show</button>516					{open ? 'Open' : 'Closed'}517				</div>518			);519		};520		render(<App />, scratch);521		expect(scratch.innerHTML).to.equal(522			'<div><div>Closed</div><button>Show</button>Closed</div>'523		);524		toggle();525		rerender();526		expect(scratch.innerHTML).to.equal(527			'<div><button>Show</button>Open</div><div>Hello</div>'528		);529		toggle();530		rerender();531		expect(scratch.innerHTML).to.equal(532			'<div><div>Closed</div><button>Show</button>Closed</div>'533		);534	});535	it('should order effects well', () => {536		const calls = [];537		const Modal = ({ children }) => {538			useEffect(() => {539				calls.push('Modal');540			}, []);541			return createPortal(<div className="modal">{children}</div>, scratch);542		};543		const ModalButton = ({ i }) => {544			useEffect(() => {545				calls.push(`Button ${i}`);546			}, []);547			return <button>Action</button>;548		};549		const App = () => {550			useEffect(() => {551				calls.push('App');552			}, []);553			return (554				<Modal>555					<ModalButton i="1" />556					<ModalButton i="2" />557				</Modal>558			);559		};560		act(() => {561			render(<App />, scratch);562		});563		expect(calls).to.deep.equal(['Button 1', 'Button 2', 'Modal', 'App']);564	});565	it('should include containerInfo', () => {566		let root = document.createElement('div');567		document.body.appendChild(root);568		const A = () => <span>A</span>;569		let portal;570		function Foo(props) {571			portal = createPortal(props.children, root);572			return <div>{portal}</div>;573		}574		render(575			<Foo>576				<A />577			</Foo>,578			scratch579		);580		expect(portal.containerInfo).to.equal(root);581		root.parentNode.removeChild(root);582	});583	it('should order complex effects well', () => {584		const calls = [];585		const Parent = ({ children, isPortal }) => {586			useEffect(() => {587				calls.push(`${isPortal ? 'Portal ' : ''}Parent`);588			}, [isPortal]);589			return <div>{children}</div>;590		};591		const Child = ({ index, isPortal }) => {592			useEffect(() => {593				calls.push(`${isPortal ? 'Portal ' : ''}Child ${index}`);594			}, [index, isPortal]);595			return <div>{index}</div>;596		};597		const Portal = () => {598			const content = [1, 2, 3].map(index => (599				<Child key={index} index={index} isPortal />600			));601			useEffect(() => {602				calls.push('Portal');603			}, []);604			return createPortal(<Parent isPortal>{content}</Parent>, scratch2);605		};606		const App = () => {607			const content = [1, 2, 3].map(index => (608				<Child key={index} index={index} />609			));610			return (611				<React.Fragment>612					<Parent>{content}</Parent>613					<Portal />614				</React.Fragment>615			);616		};617		act(() => {618			render(<App />, scratch);...GranuleResultsDataLinksButton.test.js
Source:GranuleResultsDataLinksButton.test.js  
1import React from 'react'2import ReactDOM from 'react-dom'3import Enzyme, { shallow } from 'enzyme'4import Adapter from 'enzyme-adapter-react-16'5import { Dropdown } from 'react-bootstrap'6import * as addToast from '../../../util/addToast'7import { GranuleResultsDataLinksButton, CustomDataLinksToggle } from '../GranuleResultsDataLinksButton'8import Button from '../../Button/Button'9import CopyableText from '../../CopyableText/CopyableText'10Enzyme.configure({ adapter: new Adapter() })11function setup(overrideProps) {12  const props = {13    collectionId: 'TEST_ID',14    directDistributionInformation: {},15    dataLinks: [16      {17        rel: 'http://linkrel/data#',18        title: 'linktitle',19        href: 'http://linkhref'20      }21    ],22    s3Links: [],23    onMetricsDataAccess: jest.fn(),24    ...overrideProps25  }26  const enzymeWrapper = shallow(<GranuleResultsDataLinksButton {...props} />)27  return {28    enzymeWrapper,29    props30  }31}32beforeEach(() => {33  jest.clearAllMocks()34  Object.assign(navigator, {35    clipboard: {}36  })37})38describe('GranuleResultsDataLinksButton component', () => {39  test('renders itself correctly', () => {40    const { enzymeWrapper } = setup()41    expect(enzymeWrapper.type()).toBe(Button)42  })43  describe('with no granule links', () => {44    test('renders a disabled download button', () => {45      const { enzymeWrapper } = setup({46        dataLinks: []47      })48      expect(enzymeWrapper.find(Button).props().disabled).toBe(true)49      expect(enzymeWrapper.type()).toBe(Button)50    })51    test('prevents default when clicked', () => {52      const preventDefaultMock = jest.fn()53      const { enzymeWrapper } = setup({54        dataLinks: []55      })56      enzymeWrapper.find(Button).simulate('click', { preventDefault: preventDefaultMock })57      expect(preventDefaultMock).toHaveBeenCalledTimes(1)58    })59  })60  describe('with a single granule link', () => {61    test('calls callback with the correct data on click', () => {62      const { enzymeWrapper, props } = setup()63      enzymeWrapper.simulate('click')64      expect(props.onMetricsDataAccess).toHaveBeenCalledTimes(1)65      expect(props.onMetricsDataAccess).toHaveBeenCalledWith({66        collections: [67          { collectionId: 'TEST_ID' }68        ],69        type: 'single_granule_download'70      })71    })72    test('renders the correct element', () => {73      const { enzymeWrapper } = setup()74      expect(enzymeWrapper.type()).toBe(Button)75    })76  })77  describe('with multiple granule links', () => {78    test('renders the correct element', () => {79      // Mocks createPortal method of ReactDOM (https://stackoverflow.com/a/60953708/8116576)80      ReactDOM.createPortal = jest.fn((dropdown) => dropdown)81      const { enzymeWrapper } = setup({82        dataLinks: [83          {84            rel: 'http://linkrel/data#',85            title: 'linktitle',86            href: 'http://linkhref'87          }, {88            rel: 'http://linkrel2/data#',89            title: 'linktitle2',90            href: 'http://linkhref2'91          }92        ]93      })94      expect(enzymeWrapper.type()).toBe(Dropdown)95    })96    describe('when the dropdown is clicked', () => {97      test('stops event propagation', () => {98        const stopPropagationMock = jest.fn()99        // Mocks createPortal method of ReactDOM (https://stackoverflow.com/a/60953708/8116576)100        ReactDOM.createPortal = jest.fn((dropdown) => dropdown)101        const { enzymeWrapper } = setup({102          dataLinks: [103            {104              rel: 'http://linkrel/data#',105              title: 'linktitle',106              href: 'http://linkhref'107            }, {108              rel: 'http://linkrel2/data#',109              title: 'linktitle2',110              href: 'http://linkhref2'111            }112          ]113        })114        enzymeWrapper.simulate('click', { stopPropagation: stopPropagationMock })115        expect(stopPropagationMock).toHaveBeenCalledTimes(1)116      })117    })118    describe('when a link is clicked', () => {119      test('stops propagation of events', () => {120        const stopPropagationMock = jest.fn()121        // Mocks createPortal method of ReactDOM (https://stackoverflow.com/a/60953708/8116576)122        ReactDOM.createPortal = jest.fn((dropdown) => dropdown)123        const { enzymeWrapper } = setup({124          dataLinks: [125            {126              rel: 'http://linkrel/data#',127              title: 'linktitle',128              href: 'http://linkhref'129            }, {130              rel: 'http://linkrel2/data#',131              title: 'linktitle2',132              href: 'http://linkhref2'133            }134          ]135        })136        const dataLinks = enzymeWrapper.find('.granule-results-data-links-button__dropdown-item')137        dataLinks.at(0).simulate('click', { stopPropagation: stopPropagationMock })138        expect(stopPropagationMock).toHaveBeenCalledTimes(1)139      })140      test('calls the metrics event', () => {141        // Mocks createPortal method of ReactDOM (https://stackoverflow.com/a/60953708/8116576)142        ReactDOM.createPortal = jest.fn((dropdown) => dropdown)143        const { enzymeWrapper, props } = setup({144          dataLinks: [145            {146              rel: 'http://linkrel/data#',147              title: 'linktitle',148              href: 'http://linkhref'149            }, {150              rel: 'http://linkrel2/data#',151              title: 'linktitle2',152              href: 'http://linkhref2'153            }154          ]155        })156        const dataLinks = enzymeWrapper.find('.granule-results-data-links-button__dropdown-item')157        dataLinks.at(0).simulate('click', { stopPropagation: () => {} })158        expect(props.onMetricsDataAccess).toHaveBeenCalledTimes(1)159        expect(props.onMetricsDataAccess).toHaveBeenCalledWith({160          collections: [{161            collectionId: 'TEST_ID'162          }],163          type: 'single_granule_download'164        })165      })166      test('displays a success toast', () => {167        // Mocks createPortal method of ReactDOM (https://stackoverflow.com/a/60953708/8116576)168        ReactDOM.createPortal = jest.fn((dropdown) => dropdown)169        const addToastMock = jest.spyOn(addToast, 'addToast')170        const { enzymeWrapper } = setup({171          dataLinks: [172            {173              rel: 'http://linkrel/data#',174              title: 'linktitle',175              href: 'http://linkhref'176            }, {177              rel: 'http://linkrel2/data#',178              title: 'linktitle2',179              href: 'http://linkhref2'180            }181          ]182        })183        const dataLinks = enzymeWrapper.find('.granule-results-data-links-button__dropdown-item')184        dataLinks.at(0).simulate('click', { stopPropagation: () => {} })185        expect(addToastMock.mock.calls.length).toBe(1)186        expect(addToastMock.mock.calls[0][0]).toEqual('Initiated download of file: linkhref')187        expect(addToastMock.mock.calls[0][1].appearance).toEqual('success')188        expect(addToastMock.mock.calls[0][1].autoDismiss).toEqual(true)189      })190    })191  })192  describe('when s3 links are provided', () => {193    test('renders the correct element', () => {194      // Mocks createPortal method of ReactDOM (https://stackoverflow.com/a/60953708/8116576)195      ReactDOM.createPortal = jest.fn((dropdown) => dropdown)196      const { enzymeWrapper } = setup({197        s3Links: [198          {199            rel: 'http://linkrel/s3#',200            title: 'linktitle',201            href: 's3://linkhref'202          }, {203            rel: 'http://linkrel2/s3#',204            title: 'linktitle2',205            href: 's3://linkhref2'206          }207        ]208      })209      expect(enzymeWrapper.type()).toBe(Dropdown)210    })211    test('renders s3 links as buttons', () => {212      // Mocks createPortal method of ReactDOM (https://stackoverflow.com/a/60953708/8116576)213      ReactDOM.createPortal = jest.fn((dropdown) => dropdown)214      const { enzymeWrapper } = setup({215        dataLinks: [],216        directDistributionInformation: {217          region: 'aws-region'218        },219        s3Links: [220          {221            rel: 'http://linkrel/s3#',222            title: 'linktitle',223            href: 's3://linkhref'224          }, {225            rel: 'http://linkrel2/s3#',226            title: 'linktitle2',227            href: 's3://linkhref2'228          }229        ]230      })231      expect(enzymeWrapper.find(Dropdown.Item).at(0).type()).toBe(Dropdown.Item)232      expect(enzymeWrapper.find(Dropdown.Item).at(0).props().label).toBe('Copy AWS S3 path to clipboard')233      expect(enzymeWrapper.find(Dropdown.Item).at(0).props().text).toEqual('linkhref')234    })235    describe('when clicking an s3 link', () => {236      test('calls the metrics event', async () => {237        // Mocks createPortal method of ReactDOM (https://stackoverflow.com/a/60953708/8116576)238        ReactDOM.createPortal = jest.fn((dropdown) => dropdown)239        const { enzymeWrapper, props } = setup({240          dataLinks: [],241          directDistributionInformation: {242            region: 'aws-region'243          },244          s3Links: [245            {246              rel: 'http://linkrel/s3#',247              title: 'linktitle',248              href: 's3://linkhref'249            }, {250              rel: 'http://linkrel2/s3#',251              title: 'linktitle2',252              href: 's3://linkhref2'253            }254          ]255        })256        enzymeWrapper.find(Dropdown.Item).at(0).props().onClick()257        expect(props.onMetricsDataAccess).toHaveBeenCalledTimes(1)258        expect(props.onMetricsDataAccess).toHaveBeenCalledWith({259          collections: [{260            collectionId: 'TEST_ID'261          }],262          type: 'single_granule_s3_access'263        })264      })265    })266    describe('when direct distribution information is provided', () => {267      test('displays the region as a button', () => {268        ReactDOM.createPortal = jest.fn((dropdown) => dropdown)269        const { enzymeWrapper } = setup({270          dataLinks: [],271          directDistributionInformation: {272            region: 'aws-region'273          },274          s3Links: [275            {276              rel: 'http://linkrel/s3#',277              title: 'linktitle',278              href: 's3://linkhref'279            }, {280              rel: 'http://linkrel2/s3#',281              title: 'linktitle2',282              href: 's3://linkhref2'283            }284          ]285        })286        const distributionInformation = enzymeWrapper.find('.tab-content').children()287        expect(distributionInformation.find(CopyableText).at(0).props().text).toBe('aws-region')288      })289      test('displays the s3 bucket and object prefix as a button', () => {290        ReactDOM.createPortal = jest.fn((dropdown) => dropdown)291        const { enzymeWrapper } = setup({292          dataLinks: [],293          directDistributionInformation: {294            region: 'aws-region',295            s3BucketAndObjectPrefixNames: ['TestBucketOrObjectPrefix'],296            s3CredentialsApiEndpoint: 'https://DAACCredentialEndpoint.org',297            s3CredentialsApiDocumentationUrl: 'https://DAACCredentialDocumentation.org'298          },299          s3Links: [300            {301              rel: 'http://linkrel/s3#',302              title: 'linktitle',303              href: 's3://linkhref'304            }, {305              rel: 'http://linkrel2/s3#',306              title: 'linktitle2',307              href: 's3://linkhref2'308            }309          ]310        })311        const distributionInformation = enzymeWrapper.find('.tab-content').children()312        expect(distributionInformation.find(CopyableText).at(1).props().text).toBe('TestBucketOrObjectPrefix')313      })314      describe('when multiple bucket object prefixes are provided', () => {315        test('displays the s3 bucket and object prefixes as buttons', () => {316          ReactDOM.createPortal = jest.fn((dropdown) => dropdown)317          const { enzymeWrapper } = setup({318            dataLinks: [],319            directDistributionInformation: {320              region: 'aws-region',321              s3BucketAndObjectPrefixNames: [322                'TestBucketOrObjectPrefix',323                'TestBucketOrObjectPrefixTwo'324              ],325              s3CredentialsApiEndpoint: 'https://DAACCredentialEndpoint.org',326              s3CredentialsApiDocumentationUrl: 'https://DAACCredentialDocumentation.org'327            },328            s3Links: [329              {330                rel: 'http://linkrel/s3#',331                title: 'linktitle',332                href: 's3://linkhref'333              }, {334                rel: 'http://linkrel2/s3#',335                title: 'linktitle2',336                href: 's3://linkhref2'337              }338            ]339          })340          const distributionInformation = enzymeWrapper.find('.tab-content').children()341          expect(distributionInformation.find(CopyableText).at(1).props().text).toBe('TestBucketOrObjectPrefix')342          expect(distributionInformation.find(CopyableText).at(2).props().text).toBe('TestBucketOrObjectPrefixTwo')343        })344      })345    })346  })347})348describe('CustomDataLinksToggle component', () => {349  test('calls expected event methods on download click', () => {350    const mockClickEvent = {351      stopPropagation: jest.fn(),352      preventDefault: jest.fn()353    }354    const mockClickCallback = jest.fn()355    shallow(<CustomDataLinksToggle onClick={mockClickCallback} />)356      .simulate('click', mockClickEvent)357    expect(mockClickEvent.stopPropagation).toHaveBeenCalled()358    expect(mockClickEvent.preventDefault).toHaveBeenCalled()359    expect(mockClickCallback).toHaveBeenCalled()360  })...Portal.jsx
Source:Portal.jsx  
...5import * as AiIcons from "react-icons/ai";6import * as BsIcons from "react-icons/bs";7import * as FiIcons from "react-icons/fi";8export const Portal = ({ notification, nodisplay }) => {9  return ReactDom.createPortal(10    <>11      <div className="overlay" onClick={nodisplay}></div>12      <div className="modal">13        <AiIcons.AiFillCloseCircle14          className="close__icon"15          onClick={nodisplay}16        />17        <p className="modal__paragraph">{notification}</p>18      </div>19    </>,20    document.getElementById("portal-root")21  );22};23export const Spinner = () => {24  return ReactDom.createPortal(25    <div className="modal">26      <div className="modal__spinner full__height"></div>27    </div>,28    document.getElementById("portal-root")29  );30};31export const Onboard = ({ nodisplay }) => {32  return ReactDom.createPortal(33    <>34      <div className="overlay" onClick={nodisplay}></div>35      <div className="modal">36        <p>37          Whatsapp needs permisson to access your contacts, camera and38          microphone.39        </p>40        <div className="modal__onboarding">41          <button onClick={nodisplay}>DENY </button>42          <button onClick={nodisplay}>ALLOW </button>43        </div>44      </div>45    </>,46    document.getElementById("portal-root")47  );48};49export const ProfilePreview = ({ pic, nodisplay }) => {50  return ReactDom.createPortal(51    <>52      <div className="overlay" onClick={nodisplay}></div>53      <div className="modal__pic">54        <div className="gray__header"></div>55        <img src={pic} alt="" />56        <div className="gray__header"></div>57      </div>58    </>,59    document.getElementById("portal-root")60  );61};62export const PortalPic = ({ pic, nodisplay }) => {63  console.log(pic);64  return ReactDom.createPortal(65    <>66      <div className="overlay" onClick={nodisplay}></div>67      <div className="modal__pic">68        <img src={pic} alt="" />69        <div className="modal__pic__icons">70          <IoIcons.IoMdChatboxes className="modal__pic__icon1" />71          <AiIcons.AiFillPhone className="modal__pic__icon1" />72          <BsIcons.BsCameraVideoFill className="modal__pic__icon1" />73          <FiIcons.FiAlertCircle className="modal__pic__icon1" />74        </div>75      </div>76    </>,77    document.getElementById("portal-root")78  );79};80export const SideOptions = ({ nodisplay }) => {81  return ReactDom.createPortal(82    <>83      <div className="overlay" onClick={nodisplay}></div>84      <div className="modal__sideOption">85        <ul className="list__item__sidebar">86          <li className="list__item"> New Group</li>87          <li className="list__item"> New Broadcast</li>88          <li className="list__item"> Message a number</li>89          <li className="list__item"> Whatsapp web</li>90          <li className="list__item"> Starred messages</li>91          <li className="list__item"> Settings</li>92        </ul>93      </div>94    </>,95    document.getElementById("portal-root")96  );97};98export const SideOptions2 = ({ nodisplay }) => {99  return ReactDom.createPortal(100    <>101      <div className="overlay" onClick={nodisplay}></div>102      <div className="modal__sideOption__chat">103        <ul className="list__item__chat">104          <li className="list__item"> View Contact</li>105          <li className="list__item">Media, links and docs</li>106          <li className="list__item"> Search</li>107          <li className="list__item"> Wallpaper</li>108          <li className="list__item"> Go to First Message</li>109          <li className="list__item"> Clear chat</li>110        </ul>111      </div>112    </>,113    document.getElementById("portal-root")114  );115};116// export const StatusView = ({content, nodisplay}) => {117//     const checkType = content.split('.')118//     const checkTypeExtension = ""119//     return ReactDom.createPortal(120//         <>121//         <div className="overlay" onClick={nodisplay}></div>122//         <div className="modal__status">123//             {124//             }125//         </div>126//         </>,127//         document.getElementById("portal-root")128//     )...no-react-dom-create-portal.js
Source:no-react-dom-create-portal.js  
...23		{24			code: `25				 import ReactDOM from 'react-dom';26 27				 ReactDOM.createPortal(element, container);28			 `,29			errors,30		},31		{32			code: `33				 import SneakyDOM from 'react-dom';34 35				 SneakyDOM.createPortal(element, container);36			 `,37			errors,38		},39		{40			code: `41				 import * as ReactDOM from 'react-dom';42 43				 ReactDOM.createPortal(element, container);44			 `,45			errors,46		},47		{48			code: `49				 import * as SneakyDOM from 'react-dom';50 51				 SneakyDOM.createPortal(element, container);52			 `,53			errors,54		},55		{56			code: `57				 import {createPortal} from 'react-dom';58 59				 createPortal(element, container);60			 `,61			errors,62		},63		{64			code: `65				 import {createPortal, render} from 'react-dom';66 67				 createPortal(element, container);68				 render(element, container);69			 `,70			errors,71		},72		{73			code: `74				 import {createPortal as sneakyRender} from 'react-dom';75 76				 sneakyRender(element, container);77			 `,78			errors,79		},80		{81			code: `82				 const ReactDOM = require('react-dom');83 84				 ReactDOM.createPortal(element, container);85			 `,86			errors,87		},88		{89			code: `90				 const SneakyDOM = require('react-dom');91 92				 SneakyDOM.createPortal(element, container);93			 `,94			errors,95		},96		{97			code: `98				 const {createPortal} = require('react-dom');99 100				 createPortal(element, container);101			 `,102			errors,103		},104		{105			code: `106				 const {createPortal: sneakyRender} = require('react-dom');107 108				 sneakyRender(element, container);109			 `,110			errors,111		},112		{113			code: `114				 import ReactDOM from 'react-dom';115 116				 export default function outer() {117					 function inner() {118						 if (true) {119							 // Show that we don't get confused by scopes.120							 ReactDOM.createPortal(element, container);121						 }122					 }123				 }124			 `,125			errors,126		},127	],128	valid: [129		{130			code: `131				 import {createPortal} from 'frontend-js-react-web';132 133				 createPortal(element, container);134			 `,135		},136		{137			code: `138				 // No sane person would ever do this, but let's prove that we139				 // can avoid false positives.140				 const ReactDOM = {141					 createPortal(...args) {},142				 };143 144				 ReactDOM.createPortal();145			 `,146		},147		{148			code: `149				 // Again, not something sane, but show that we consider scope150				 // to avoid false positives.151				 import {createPortal} from 'react-dom';152 153				 function scope() {154					 const createPortal = () => {};155 156					 createPortal();157				 }158			 `,159		},160		{161			code: `162				 // Illustrating a limitation: catching this would be too much163				 // work...164				 import ReactDOM from 'react-dom';165 166				 const SneakyDOM = ReactDOM;167 168				 SneakyDOM.createPortal(element, container);169			 `,170		},171		{172			code: `173				 // Regression test.174				 let declaration;175			 `,176		},177	],...render-enlarged-image.spec.js
Source:render-enlarged-image.spec.js  
1import React from 'react';2import ReactDOM from 'react-dom';3import { expect } from 'chai';4import { shallow } from 'enzyme';5import sinon from 'sinon';6import RenderEnlargedImage from '../src/RenderEnlargedImage';7describe('RenderEnlargedImage', () => {8    let shallowWrapper = getShallowWrapper();9    function getShallowWrapper(props) {10        return shallow(<RenderEnlargedImage {...props} />);11    }12    beforeEach(() => {13        shallowWrapper = getShallowWrapper();14    });15    describe('Component is Not Mounted', () => {16        it('renders null', () => {17            shallowWrapper.setState({isMounted: false});18            expect(shallowWrapper.find('EnlargedImage').length).to.equal(0);19        });20    });21    describe('Component is Mounted', () => {22        it('sets isMounted state', () => {23            expect(shallowWrapper.state('isMounted')).to.be.true;24        });25        it('sets instance portalElement property', () => {26            sinon.stub(ReactDOM, 'createPortal');27            sinon.stub(document, 'getElementById').callsFake(id => id);28            shallowWrapper.setProps({ portalId: 'foo' });29            const instance = shallowWrapper.instance();30            instance.componentDidMount();31            expect(instance.portalElement).to.equal('foo');32            ReactDOM.createPortal.restore();33            document.getElementById.restore();34        });35        describe('Mouse Input', () => {36            it('renders internally if portalId prop is not implemented', () => {37                expect(shallowWrapper.find('EnlargedImage').length).to.equal(1);38            });39            it('renders to portal if protalId prop is implemented', () => {40                sinon.stub(ReactDOM, 'createPortal');41                shallowWrapper.setProps({ portalId: 'foo' });42                expect(ReactDOM.createPortal.called).to.be.true;43                ReactDOM.createPortal.restore();44            });45        });46        describe('Touch Input', () => {47            it('renders internally, ignoring portalId implementation by default', () => {48                shallowWrapper.setProps({49                    portalId: 'foo',50                    isTouchDetected: true51                });52                expect(shallowWrapper.find('EnlargedImage').length).to.equal(1);53            });54            it('renders to portal when isPortalEnabledForTouch is set', () => {55                sinon.stub(ReactDOM, 'createPortal');56                shallowWrapper.setProps({57                    isTouchDetected: true,58                    isPortalEnabledForTouch: true,59                    portalId: 'foo'60                });61                expect(ReactDOM.createPortal.called).to.be.true;62                ReactDOM.createPortal.restore();63            })64        });65    });...ErrorModal.js
Source:ErrorModal.js  
...3132const ErrorModal = (props) => {33    return (34        <>35            {/* {ReactDOM.createPortal( */}36            {createPortal(37                <Backdrop onConfirm={props.onConfirm}/>, 38                document.getElementById('backdrop-root')39            )}40            {/* {ReactDOM.createPortal( */}41            {createPortal(42                <ModalOverlay 43                    onConfirm={props.onConfirm}44                    title={props.title}45                    message={props.message}46                />, 47                document.getElementById('overlay-root')48            )}49        </>50    )51}52
...index.js
Source:index.js  
1import React, { Component } from 'react';2import CreatePortal from '../CreatePortal';3import { Icon } from 'antd-mobile';4const Styles = {5  modal: {6    position: 'relative',7    top: '0',8    left: '0',9    zIndex: '999'10  },11  body: {12    backgroundColor: '#fff',13    position: 'fixed',14    height: '100%',15    width: '100%',16    top: '0',17    left: '0',18    display: 'flex',19    alignItems: 'center',20    justifyContent: 'center',21  },22  close: {23    position: 'absolute',24    top: '10px',25    right: '10px'26  }27};28export default class Modal extends Component {29  constructor(props) {30    super(props);31    this.state = {32      showModal: false33    };34  }35  componentWillReceiveProps(nextProps){36    this.setState({37      showModal: nextProps.show38    });39  }40  handleClose = ()=>{41    const { onClose } = this.props;42    onClose && onClose();43  };44  render() {45    const { show, styleBody, styleClose } = this.props;46    const { showModal } = this.state;47    const _styleBody = {48      ...Styles.body,49      ...styleBody50    };51    const _styleClose = {52      ...Styles.close,53      ...styleClose54    };55    return (56      <>57        {showModal ? <CreatePortal style={Styles.modal}>58          <div style={_styleBody}>59            {this.props.children}60            <Icon type='cross' size='lg' style={_styleClose} onClick={this.handleClose} />61          </div>62        </CreatePortal> : null}63      </>64    )65  }...AppToast.js
Source:AppToast.js  
1import CreatePortal from "../CreatePortal/CreatePortal";2import classes from "./AppToast.module.css";34const AppToast = ({ show, message, heading, toastClass }) => {5  return (6    show && (7      <CreatePortal selector="#toast-root">8        <div className={classes.toast}>9          {heading && (10            <div className={classes.header}>11              <strong className="me-auto">{heading}</strong>12            </div>13          )}14          {message && (15            <div className={`${classes.body} ${toastClass}`}>16              <i className="bi bi-envelope-fill mr-2"></i>17              {message}18            </div>19          )}20        </div>21      </CreatePortal>22    )23  );24};25
...Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.screenshot({ path: `example.png` });7  await browser.close();8})();Using AI Code Generation
1const playwright = require('playwright');2(async () => {3  const browser = await playwright.chromium.launch({ headless: false });4  const context = await browser.newContext();5  const page = await context.newPage();6  const page2 = await context.newPage();7  await page.screenshot({ path: `page1.png` });8  await page2.screenshot({ path: `page2.png` });9  await page2.bringToFront();10  await page2.screenshot({ path: `page2.png` });11  await page.bringToFront();12  await page.screenshot({ path: `page1.png` });13  await browser.close();14})();15const playwright = require('playwright');16(async () => {17  const browser = await playwright.chromium.launch({ headless: false });18  const context = await browser.newContext();19  const page = await context.newPage();20  const page2 = await context.newPage();21  await page.screenshot({ path: `page1.png` });22  await page2.screenshot({ path: `page2.png` });23  await page2.bringToFront();24  await page2.screenshot({ path: `page2.png` });25  await page.bringToFront();26  await page.screenshot({ path: `page1.png` });27  await browser.close();28})();29const playwright = require('playwright');30(async () => {31  const browser = await playwright.chromium.launch({ headUsing AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  const portal = await page._createPortal();7  const page2 = await portal.newPage();8  await page2.screenshot({ path: 'screenshot.png' });9  await browser.close();10})();11const { chromium } = require('playwright');12(async () => {13  const browser = await chromium.launch();14  const context = await browser.newContext();15  const page = await context.newPage();16  const portal = await page._createPortal();17  const page2 = await portal.newPage();18  await page2.screenshot({ path: 'screenshot.png' });19  await browser.close();20})();21const { chromium } = require('playwright');22(async () => {23  const browser = await chromium.launch();24  const context = await browser.newContext();25  const page = await context.newPage();26  const portal = await page._createPortal();27  const page2 = await portal.newPage();28  await page2.screenshot({ path: 'screenshot.png' });29  await browser.close();30})();31const { chromium } = require('playwright');32(async () => {33  const browser = await chromium.launch();34  const context = await browser.newContext();35  const page = await context.newPage();36  const portal = await page._createPortal();37  const page2 = await portal.newPage();38  await page2.screenshot({ path: 'screenshot.png' });39  await browser.close();40})();41const { chromium } = require('playwright');42(async () => {43  const browser = await chromium.launch();44  const context = await browser.newContext();45  const page = await context.newPage();Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  const portal = await page._createPortal();7  const page2 = await portal.newPage();8  await page2.screenshot({ path: 'portal.png' });9  await browser.close();10})();11The _createPortal() methodUsing AI Code Generation
1const playwright = require('playwright');2(async () => {3  const browser = await playwright.chromium.launch({ headless: false });4  const context = await browser.newContext();5  const page = await context.newPage();6  const target = await browser.newPage();7  await page.route('**/*', route => route.fulfill({ body: 'Success' }));8  await page.setContent(`<a href="${target.url()}">Click me</a>`);9  await page.click('a');10  await target.waitForRequest(request => request.url() === page.url());11  await target.close();12  await browser.close();13})();14const playwright = require('playwright');15(async () => {16  const browser = await playwright.chromium.launch({ headless: false });17  const context = await browser.newContext();18  const page = await context.newPage();19  const target = await browser.newPage();20  await page.route('**/*', route => route.fulfill({ body: 'Success' }));21  await page.setContent(`<a href="${target.url()}">Click me</a>`);22  await page.click('a');23  await target.waitForRequest(request => request.url() === page.url());24  await target.close();25  await browser.close();26})();27const playwright = require('playwright');28(async () => {29  const browser = await playwright.chromium.launch({ headless: false });30  const context = await browser.newContext();31  const page = await context.newPage();32  const target = await browser.newPage();33  await page.route('**/*', route => route.fulfill({ body: 'Success' }));34  await page.setContent(`<a href="${target.url()}">Click me</a>`);35  await page.click('a');36  await target.waitForRequest(request => request.url() === page.url());37  await target.close();38  await browser.close();39})();40const playwright = require('playwright');41(async () => {42  const browser = await playwright.chromium.launch({ headless: false });43  const context = await browser.newContext();44  const page = await context.newPage();45  const target = await browser.newPage();46  await page.route('**/*', route => route.fulfill({ body: 'SuccessUsing AI Code Generation
1const playwright = require("playwright");2(async () => {3  const browser = await playwright.chromium.launch();4  const page = await browser.newPage();5  const context = await browser.newContext();6  const newPage = await context.newPage();7  const newPage2 = await context.newPage();8  await newPage.setContent(`9`);10  await newPage2.setContent(`11`);12  await page.setContent(`13`);14  await page.evaluate(async () => {15    const { createPortal } = require("playwright");16    const { newPage, newPage2 } = window;17    const portal = await createPortal(newPage, newPage2);18    portal.addEventListener("message", (event) => {19      console.log("Message from portal: " + event.data);20    });21    portal.postMessage("Hello");22  });23  await page.waitForTimeout(1000);24  await browser.close();25})();Using AI Code Generation
1const playwright = require('playwright');2(async () => {3    const browser = await playwright.chromium.launch();4    const context = await browser.newContext({ viewport: null });5    const page = await context.newPage();6    await page.goto('htUsing AI Code Generation
1import { test } from '@playwright/test'2test('test', async ({ page }) => {3  const handle = await page.evaluateHandle(() => {4    const div = document.createElement('div')5    document.body.appendChild(div)6  })7  await page.setViewportSize({ width: 1000, height: 1000 })8  await page.screenshot({ path: 'screenshot.png', clip: await handle.boundingBox() })9  await handle.dispose()10})11import { test } from '@playwright/test'12test('test', async ({ page }) => {13  const handle = await page.evaluateHandle(() => {14    const div = document.createElement('div')15    document.body.appendChild(div)16  })17  await page.setViewportSize({ width: 1000, height: 1000 })18  await page.screenshot({ path: 'screenshot.png', clip: await handle.boundingBox() })19  await handle.dispose()20})Using AI Code Generation
1const playwright = require('playwright');2(async () => {3  const browser = await playwright.chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.click('text="Sign in"');7  await page.close();8  await context.close();9  await browser.close();10})();11const playwright = require('playwright');12(async () => {13  const browser = await playwright.chromium.launch();14  const context = await browser.newContext();15  const page = await context.newPage();16  await page.click('text="Sign in"');17  await page.close();18  await context.close();19  await browser.close();20})();21const playwright = require('playwright');22(async () => {23  const browser = await playwright.chromium.launch();24  const context = await browser.newContext();25  const page = await context.newPage();26  await page.click('text="Sign in"');27  await page.close();28  await context.close();29  await browser.close();30})();31const playwright = require('playwright');32(async () => {33  const browser = await playwright.chromium.launch();34  const context = await browser.newContext();35  const page = await context.newPage();36  await page.click('text="Sign in"');37  await page.close();38  await context.close();39  await browser.close();40})();Using AI Code Generation
1const portal = await context.newBrowserContext();2const page = await portal.newPage();3const element = await page.$('#my_element');4await context.newPortal(element);5const portal = await context.newBrowserContext();6const page = await portal.newPage();7const element = await page.$('#my_element');8await element.newPortal();9const portal = await context.newBrowserContext();10const page = await portal.newPage();11const element = await page.$('#my_element');12await context.newPortal(element);13const portal = await context.newBrowserContext();14const page = await portal.newPage();15const element = await page.$('#my_element');16await element.newPortal();17const portal = await context.newBrowserContext();18const page = await portal.newPage();19const element = await page.$('#my_element');20await context.newPortal(element);21const portal = await context.newBrowserContext();22const page = await portal.newPage();23const element = await page.$('#my_element');24await element.newPortal();25const portal = await context.newBrowserContext();26const page = await portal.newPage();27const element = await page.$('#my_element');28await context.newPortal(element);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!!
