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({ head
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: '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() method
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 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: 'Success
Using 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('ht
Using 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!!