{"_id":"selenium-engine-js","_rev":"7-58adb87fcbeaedd6a7c89643df439e36","name":"selenium-engine-js","dist-tags":{"latest":"3.2.1"},"versions":{"2.0.0":{"name":"selenium-engine-js","version":"2.0.0","description":"Selenium-like methods useful for automating SPAs (Single Page Application) where content is changed dynamically.","type":"module","main":"./src/SeleniumEngine.cjs","exports":{"require":"./src/SeleniumEngine.cjs","import":"./esm/wrapper.mjs"},"scripts":{"release":"np","test":"npx ava"},"repository":{"type":"git","url":"git+https://github.com/LukeSavefrogs/SeleniumEngineJS.git"},"keywords":["javascript","js","selenium","automation","spa"],"author":{"name":"Luca Salvarani"},"license":"MIT","bugs":{"url":"https://github.com/LukeSavefrogs/SeleniumEngineJS/issues"},"homepage":"https://github.com/LukeSavefrogs/SeleniumEngineJS#readme","dependencies":{},"devDependencies":{"np":"^6.5.0","ava":"^4.0.1","puppeteer":"^13.3.1"},"gitHead":"1e15cb3bebd0e4fb1675805d33aa482f232efcbf","_id":"selenium-engine-js@2.0.0","_nodeVersion":"14.17.1","_npmVersion":"6.14.13","dist":{"integrity":"sha512-FUtyepKegwLa0JvxPuVJFNbbKpKYcTSpHGsg9/qzCSrVrOuIpRi7xarT3/S64BEAFEcinG6ZYPefnd5S1fmV0A==","shasum":"cb1b4b7ee248eb88e2f76397a2b5fb61dbb0c3cb","tarball":"https://registry.npmjs.org/selenium-engine-js/-/selenium-engine-js-2.0.0.tgz","fileCount":10,"unpackedSize":15499,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiCFNhCRA9TVsSAnZWagAAgkQQAJKm3Pe8mWxPZ5bw+imf\nRnHhG+YSiTwKv6DqMbbH1Lf2eXPBCJFRMpFmH6YdCrOuzuNkjnNtweQbHbGh\naIfCxvkYHY+4FHhDgJvstLoxoVLVxX0hfGDGsF4oVd5Rfr6ZCkVn0mKnCbd4\nI0dWsC2RRbCUmIhLYhyV6uLKUxM0qHa93sb+2d0W8ZFzadGwszIYg5IrRn27\nGgtdbVG1mZcH4eD8dAIgW6YrYuUoo+T9qf/HDRaXyaUJJtWZbS7I431bYCII\nj8PvjpIjMZfBV3MOUKHIfeD9DCpbAIKhsHqh1DMYukXdmKdRzQI+lSP72xQI\ncp8dFVlKI2djg/jRwh+WG37W1LJ8DopzQVYOb3R6W7yg9KiVrR27f+f6t+lk\nS1uuWTcINbabejq97scEuyfWvgCUlD0sWubSyz6MkAzSdnjPJ6D3e2xkLVrh\n8LK4L2M1mlfZW6iHX07MYuz0/LwAt81/1ns0ULK4cCz3u77Dz/aeIY6oido7\nNQoJeAV/KRKg1ogyU5XtRqPFtGAV8hj8F7Yr8NnqWmHz9lP7eGRH9rv+mbym\nXN8/2oFvAUyBzseWq8xp38ZCFYLjzqGUNom625Rn1udRnasSUyBnLPFrEcxo\nl9I1r/5LeIymQbgvowaxUFBQYPG7TXYMRL+kZvbxawn1RLrVl42YNVzO2UOC\ndhq7\r\n=DNmH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCHcMII6JicwOfWJmvbErreUjCdkA4VHvYpJMXrVHb0XQIgAqhXjnStHhKcyqnqsSehzgnfsafFNDpO+MDpuYhfSFU="}]},"_npmUser":{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"},"directories":{},"maintainers":[{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/selenium-engine-js_2.0.0_1644712801416_0.6253091495144742"},"_hasShrinkwrap":false},"2.0.1":{"name":"selenium-engine-js","version":"2.0.1","description":"Selenium-like methods useful for automating SPAs (Single Page Application) where content is changed dynamically.","type":"module","main":"./src/SeleniumEngine.cjs","exports":{"require":"./src/SeleniumEngine.cjs","import":"./esm/wrapper.mjs"},"scripts":{"release":"np","test":"npx ava"},"repository":{"type":"git","url":"git+https://github.com/LukeSavefrogs/SeleniumEngineJS.git"},"keywords":["javascript","js","selenium","automation","spa"],"author":{"name":"Luca Salvarani"},"license":"MIT","bugs":{"url":"https://github.com/LukeSavefrogs/SeleniumEngineJS/issues"},"homepage":"https://github.com/LukeSavefrogs/SeleniumEngineJS#readme","dependencies":{},"devDependencies":{"np":"^6.5.0","ava":"^4.0.1","puppeteer":"^13.3.1"},"gitHead":"68c77db3f7bf5fa6839774f735871906fedf1410","_id":"selenium-engine-js@2.0.1","_nodeVersion":"14.17.1","_npmVersion":"6.14.13","dist":{"integrity":"sha512-PNlIurxT39mNdtOxBC9g8uLEV4enU/HiDNPuwl+PqU/nwia2F6lhckCNBlNCSWmXlV41VTpxYW3dN5If5tsEDw==","shasum":"d74a71620c3fc03940f051ccb0b37d96fe8f86c9","tarball":"https://registry.npmjs.org/selenium-engine-js/-/selenium-engine-js-2.0.1.tgz","fileCount":6,"unpackedSize":13950,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiCFx4CRA9TVsSAnZWagAAFMgP/RMxKaRWiZTUsmENT5hy\nKw/AYHFbsI8sQLRxOBSbdrdENcjbk4m2sZZrKuHUCS/tcyYKwNc+xveDtiBS\nl7l+wjIQPPC+FEzhEIpBP8v1mqfXereHqKAFuj4suafA7bJcsVfvdEuz8LZd\nRdQzOkF1RIUjl5olVuPp4sFvx+f0FqghiyTPkwW8SKvxFcgioJhcT3Y7d9MI\nRWM13aBY7gR9vBRYeSviOPNE9e2toktFK964TlbEfdFF6ijdJszm9R5Dzy0n\nCn8b7gmhWHOQ+XLSAO9i8xlJn4tP6CAftSZsk5VZd0V4ZHqv3KO+5RO98XWI\nPBcSC1xEk+sRw3enzT98gGoyErsH61aBuAwSJoP6ler88fVyDZCB0iejA/m1\nYm/Z0Eqw/l/Y+Tf7I03eq+u98Vi+JXR1HqrH0uq+E1QyhzhBoeba9RpZmfJq\nji/iUwNDV27YoCkRSBahkJs0aoCA8gKmWHtiZvjfzaayO3KKlsMu78z6JUVg\nZVRFChOdEGykaCFJxc7amijH+JYY9SD7t5RUQmlLVH/0r3c7X3FraHpVQT0G\nwS+T+co+RkP0iPLtKj5PoKqqxw/wp3D4MghzNlLubutZtDOtNR60KCAeAFeA\n8Lmd6DGcAVv7bP00wOjGU1LyuTkG6gJMuW8908Q/O5Jt1gFzonFrJy2fgVDE\nY5AD\r\n=Xi3G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG1YhAQGytQjEiJdirxR/1VePFpKkedHiZlTeNEgRtSHAiEAx9ACfJ/OkWneQuu7vTxrXXlN90Ae1JNXNMgI3VgvGEs="}]},"_npmUser":{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"},"directories":{},"maintainers":[{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/selenium-engine-js_2.0.1_1644715128203_0.18440888995448823"},"_hasShrinkwrap":false},"2.0.2":{"name":"selenium-engine-js","version":"2.0.2","description":"Selenium-like methods useful for automating SPAs (Single Page Application) where content is changed dynamically.","type":"module","main":"./src/SeleniumEngine.cjs","exports":{"require":"./src/SeleniumEngine.cjs","import":"./src/esm/wrapper.mjs"},"scripts":{"release":"np","test":"npx ava"},"repository":{"type":"git","url":"git+https://github.com/LukeSavefrogs/SeleniumEngineJS.git"},"keywords":["javascript","js","selenium","automation","spa"],"author":{"name":"Luca Salvarani"},"license":"MIT","bugs":{"url":"https://github.com/LukeSavefrogs/SeleniumEngineJS/issues"},"homepage":"https://github.com/LukeSavefrogs/SeleniumEngineJS#readme","dependencies":{},"devDependencies":{"np":"^6.5.0","ava":"^4.0.1","puppeteer":"^13.3.1"},"gitHead":"8eebba1d3ff7d69a94d04e4e94231113bac4fd15","_id":"selenium-engine-js@2.0.2","_nodeVersion":"14.17.1","_npmVersion":"6.14.13","dist":{"integrity":"sha512-ye9bV2lQyqqjbkjja0kWYDJDWEFWEI9R1119Ppyla40BkzBLK9tguveME89xJXCjoHKtVPaLJ8bdbjICbdSHJQ==","shasum":"dea868989daf5de043253405b611ea6274822e4c","tarball":"https://registry.npmjs.org/selenium-engine-js/-/selenium-engine-js-2.0.2.tgz","fileCount":6,"unpackedSize":13954,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiCN66CRA9TVsSAnZWagAAbBUP/2IGrrxYlibard3gTl4W\ntFcJVCx7V6W/5NiOiF1gFMt6VGcfXglaZtsuCjOOZEsZZz2l06ONWpNWA8ca\nt6qNrpxT5odHWXs4NxLmlO3/Zku4snvYpozOjQg32hn5hRu16fHFT8KihL3h\nNp0WE+QkrL1ujHGyU/ZGOLJApJdLjeSgWuxTDNfHbI+PCpC4aUkoicgg4RG+\nA11IGNEoeZ/e7SnjL7UuMFG+tIMAxsu5/u4ydsCJOVTj7lCfzv3s3cvw7UxU\n0S8S54BNXb7W8QZSNvFxF9xuV3gl9Mt+pLW/xdXBWfEwmkQ/uiE/tM7buvGc\nesYcRqqLRkv7Gsy1tXO9bZpbzjnMIUs34Bd8zNgCa2h/TgxDfxhpThSZMCNx\nFd+3jNgMPbz19zpYFGG2SS09k8dx7Tc4BbHVk/Ou2UBM4m/IEm0G0reON6TA\n73/5BUBBsiVKx+cnCNNBkUQ7fJkKn75pPnN4peKznmuGIasG5/i1zYU4dbN7\nSfLGk9uq+t/BuyTWMJr/7IoVGkSOMo3fK8RTxoTcbtm0S6RjmojmgK/fNZ8n\nGVsUlfZxi7UPxnZ3GNHXlQuDYPjnKagmrAi/aUP3HWET8/PVA2QU2qEQ3RA6\n26x2LcLRUdxvv7GMLroPCJx6VSeRRKbTcZZ29WqvuKaYfMgjw44DNPFnohE/\nUB8z\r\n=PDq9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgPbGVFdYbbovJg2nr77CYPmPbRN1C8QCyXZgKPjF5ogIhAP5n/JF+quc1STWj8KiPgsFkfaH3KUqc3NxY3YEGP/Y0"}]},"_npmUser":{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"},"directories":{},"maintainers":[{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/selenium-engine-js_2.0.2_1644748474748_0.37487965308292837"},"_hasShrinkwrap":false},"3.0.0":{"name":"selenium-engine-js","version":"3.0.0","description":"Selenium-like methods useful for automating SPAs (Single Page Application) where content is changed dynamically.","type":"commonjs","main":"./src/SeleniumEngine.js","exports":{"require":"./src/SeleniumEngine.js","import":"./src/esm/wrapper.mjs"},"scripts":{"release":"np","test":"npx ava"},"repository":{"type":"git","url":"git+https://github.com/LukeSavefrogs/SeleniumEngineJS.git"},"keywords":["javascript","js","selenium","automation","spa"],"author":{"name":"Luca Salvarani"},"license":"MIT","bugs":{"url":"https://github.com/LukeSavefrogs/SeleniumEngineJS/issues"},"homepage":"https://github.com/LukeSavefrogs/SeleniumEngineJS#readme","dependencies":{},"devDependencies":{"np":"^6.5.0","ava":"^4.0.1","puppeteer":"^13.3.1"},"gitHead":"8b241d075088263d2f4d945b94e0d27268c595e4","_id":"selenium-engine-js@3.0.0","_nodeVersion":"14.17.1","_npmVersion":"6.14.13","dist":{"integrity":"sha512-x9u0nE6UbeSxe6guZk293XSEOrRrNRItrg79nPkW7e1nlpjMOheXG0S5M/Nw0yJgQwG2Rw1ITohG5Dkkita1xg==","shasum":"e2821336f23bf0adecaf12c5af5451f40d87e2ae","tarball":"https://registry.npmjs.org/selenium-engine-js/-/selenium-engine-js-3.0.0.tgz","fileCount":6,"unpackedSize":14611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiCuxeCRA9TVsSAnZWagAAyiYP/2N8ZSPWcRodo+10PlVA\n8GTnHUHdXi8r+pL24bSxdQ6IVdyxtIpv4rkujQc95jUygE7Go8VaC2X/WwKm\ndq0iL7PcLLBAV8ybRnlilnDMQVYO81L3pAxGIfVDdRzIbyZfR2ggMtbw4m3j\nKCLCve/cMTaZkwBPtbYgS+sm9OjWzpNwe+NAib53rF2dxJD4fMVdQJOM100a\n1FNpv0AneI8N2lP9A1H2DD2l/Abd40emBiKwVc6pq+d+RQnBQ6GrtZi9EGDk\nIV68be4PddOIXirKqhPn9bfXdukOf/4tHYc/pb1PNwTpplk8Cbzd9kAPluQ9\n21s7UWsjO+wQJo+JvbZx3ymJzj9cpi2soO8QvZSqlKCTnADc/UmrC/tslw4K\nRKQL/+XeMrlmmCa47BJOWB9u+Ukufyn2UxekMBLf85o4+sUuZaykJk+yUFhu\nioC1xh9MOxJ1L2RcDyCOrdrswdhJrIZ+NNlQfakapzY+oGyn2NWnGpSDd19H\nmNbL2gKFZjhQY93lGp/9SY2M1ifsSwlQ4Up9XSsQiDXGQR6rwoFSbBt39EBZ\nMsi7i3CtTiteFSqG4Tf8zNXAHRCMq7N0ycvszZtP4oBEj2T7Zp/cVeUyYjop\n/LGIOWNqOWuBRN77tpWnIlV8rnCa9/44/hylhkVc06MWdljy98pRCVvUI2R6\nSfZa\r\n=2ciT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHTUsq1wzmi2PcX2rMjjqzshIzI+vKurWNI2KRCGIQhOAiATESphyovD2vnXiGMqQY7kwrz+G3+FOnafKE731gJruw=="}]},"_npmUser":{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"},"directories":{},"maintainers":[{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/selenium-engine-js_3.0.0_1644883038260_0.6726939894413917"},"_hasShrinkwrap":false},"3.1.0":{"name":"selenium-engine-js","version":"3.1.0","description":"Selenium-like methods useful for automating SPAs (Single Page Application) where content is changed dynamically.","type":"commonjs","main":"./src/SeleniumEngine.js","exports":{"require":"./src/SeleniumEngine.js","import":"./src/esm/wrapper.mjs"},"scripts":{"release":"np","test":"npx ava"},"repository":{"type":"git","url":"git+https://github.com/LukeSavefrogs/SeleniumEngineJS.git"},"keywords":["javascript","js","selenium","automation","spa"],"author":{"name":"Luca Salvarani"},"license":"MIT","bugs":{"url":"https://github.com/LukeSavefrogs/SeleniumEngineJS/issues"},"homepage":"https://github.com/LukeSavefrogs/SeleniumEngineJS#readme","dependencies":{},"devDependencies":{"np":"^6.5.0","ava":"^4.0.1","puppeteer":"^13.3.1"},"gitHead":"20cd454977a45c55bdafe9d17c6d8606a2de6312","_id":"selenium-engine-js@3.1.0","_nodeVersion":"14.17.1","_npmVersion":"6.14.13","dist":{"integrity":"sha512-f/pWfvz1t1oTownzAAReGxSgYgZeDbB1MH9xRiZQZArqWrTgxRqfs4WaGrjVeptLimOGBn1RsECpmRK0v3Q2gA==","shasum":"721aa8ad4fcfab31cc2aa5ae876e28c0f2a623bb","tarball":"https://registry.npmjs.org/selenium-engine-js/-/selenium-engine-js-3.1.0.tgz","fileCount":6,"unpackedSize":14699,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiCvnrCRA9TVsSAnZWagAAe7YP/397Up4n4ITdbPuXHDP1\nPclcewVJqmtfoiVLWqo5krQLy/RtqUV/W9y3HWqPrkbSx+4ekehq79rhmBKL\nz36IuRbmykFqUB0OGTTFVztJMpTn4iht3BtMPc0ib9www7tvqM/+51IE5OJ0\nI9/Ub/1u6CYawe7PDIgbH8/DsTkG6obArTlzslSKSG2KOL3odrh4H1Nmk8T5\numSLVPJjaGMeyxHXmj6cw7mCkLR1fxPYYfy615z6Mvc12LimJ9m8EA0EP+G3\nJhTyf3Q+cQXZc9oFsGroJ0/FlyNtIbMQbfn7xGhQmLFLpkWpd5ai3s3RH+YI\nuIofgoe1rXuQH0Yfu101yiF6VZAFjN1MSotXdeMdBkZa/0dskXBU1h0c8AbN\nWH9gZaXFRszqwt2HpDWXtItRh0S3K+q5BHjATWnqde29MQPrp+3ZDgOZdBTx\nMpnc066ZmaBRcNF9dEv+QEKE37fG5t0JF2e5Ly7+pWKpN7moIo5riDKnNfAp\n1emlQdsrxnWcEj3ICkgovtVRtm1V34mRWXHs0N/0YhcVGfP+Ixl5QrGOeH5b\n0vWZu4IFXN08TujuLVBInmNbTS86TGGB5KfidomJBiWED3g86qVAALTSrSG2\n6OpGjoWdt8UBL6c/xrnag0kJBSEt7GgOAhfm1q6ryzu4XWViRAdcDJh5ASjP\nfHT1\r\n=ywRg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDC8+X4u5b/b5GvzYbfX9slwgJKQ+la21TXEGgAkqw/vQIgRGzBAWurZu7z7PR3pjdYi+8PqM4U0ZyBPhJ0sJLf5P0="}]},"_npmUser":{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"},"directories":{},"maintainers":[{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/selenium-engine-js_3.1.0_1644886507652_0.14167342207359201"},"_hasShrinkwrap":false},"3.2.0":{"name":"selenium-engine-js","version":"3.2.0","description":"Selenium-like methods useful for automating SPAs (Single Page Application) where content is changed dynamically.","type":"commonjs","main":"./src/SeleniumEngine.js","exports":{"require":"./src/SeleniumEngine.js","import":"./src/esm/wrapper.mjs"},"scripts":{"release":"np","test":"npx ava"},"repository":{"type":"git","url":"git+https://github.com/LukeSavefrogs/SeleniumEngineJS.git"},"keywords":["javascript","js","selenium","automation","spa"],"author":{"name":"Luca Salvarani"},"license":"MIT","bugs":{"url":"https://github.com/LukeSavefrogs/SeleniumEngineJS/issues"},"homepage":"https://github.com/LukeSavefrogs/SeleniumEngineJS#readme","dependencies":{},"devDependencies":{"np":"^6.5.0","ava":"^4.0.1","puppeteer":"^13.3.1"},"gitHead":"13278f1659b0b49f763c594c7a6488efb452e3bf","_id":"selenium-engine-js@3.2.0","_nodeVersion":"14.17.1","_npmVersion":"6.14.13","dist":{"integrity":"sha512-8Hk4H9FJ6lSZja89KAkYpDTqYdxqc2sffdNhphDvS8h5TQt1YRwVs1D2BXmxDdpGkq1Eh0t4JiixsIi+P5wT0Q==","shasum":"1c25e5a96f5cb6c8dca11bf63493d00b703bd28d","tarball":"https://registry.npmjs.org/selenium-engine-js/-/selenium-engine-js-3.2.0.tgz","fileCount":6,"unpackedSize":14692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiCvuECRA9TVsSAnZWagAAqgkP/j1dV2YBXCywzoHIpm34\nhKAdsNLklVXTERuEKALYTIm4MEH+nWKsiZy3ITCQone+GFaFyU1ecs4OYKKw\n9ZClDecdH5f3Wq+5eKoD3H0pPIfKB4CSQ6LYaiMDxXEC8MazYbWeLmkpiF04\nb6i6vfGkcDKsVSMQwx9OQSVIvuzjPM79QrUlnoawE7dQ7ELSOo/3NhjyLU9f\nWhTtDM+B1/oDChSDd4N/Uo+8ABy7kCMDKmzU7m+yW6BkisurR9L6IUmFp8Eo\nqhLyBNfUM2xsgRlGLrDWVmFTYcB1PLGLOE1Qst3TENi3rQlLWm2bs73DnEya\n7qfSRTNKNKFiScAO3Ni+TDWDYeJOm4pJ7J1z2WVrGpcVbTx0K+VDuVclrN9X\n/kuwN+XneiSsb5iiMDaNP3pYxU3jHm3Sws4yfQctjA27pivGOT0TGGnqMFeh\n8R0PxzXi/XGf6uHf1h2EUcBs2HBANfhPPy6Y5JknnzN8NnzDeWnkbF8bpOV1\nZSQ9+qaSrBF2+kAmhgljJINJj1ENYY3spFpYugtHLi/l7WYV/t+OlJRfPS5c\n777z86F7mi8wbADD98fj91rHJDB1SsIbbWbsjXAzsddMMgb9cq9p7SWcXy1h\n6hdIdacI3Lp2v8SxsBam8y2WdeQlZz6GEwhUaPFciZfLDTyj80ZrThRaGi4e\nidTT\r\n=wgxi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPFrAQxjjmd1Yjnq+Ccl1Hy4Tac7wYws4Q5hzHx6e7iAIhAKO6yPIlLBOv+q9GZNRboi7kde2twDKRgiSljGCeyJap"}]},"_npmUser":{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"},"directories":{},"maintainers":[{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/selenium-engine-js_3.2.0_1644886916214_0.4829387690332154"},"_hasShrinkwrap":false},"3.2.1":{"name":"selenium-engine-js","version":"3.2.1","description":"Selenium-like methods useful for automating SPAs (Single Page Application) where content is changed dynamically.","type":"commonjs","main":"./src/SeleniumEngine.js","exports":{"require":"./src/SeleniumEngine.js","import":"./src/esm/wrapper.mjs"},"scripts":{"release":"np","test":"npx ava"},"repository":{"type":"git","url":"git+https://github.com/LukeSavefrogs/SeleniumEngineJS.git"},"keywords":["javascript","js","selenium","automation","spa"],"author":{"name":"Luca Salvarani"},"license":"MIT","bugs":{"url":"https://github.com/LukeSavefrogs/SeleniumEngineJS/issues"},"homepage":"https://github.com/LukeSavefrogs/SeleniumEngineJS#readme","dependencies":{},"devDependencies":{"np":"^6.5.0","ava":"^4.0.1","puppeteer":"^13.3.1"},"gitHead":"391f710b0ff49c92d8b206cc657ad37a6383848f","_id":"selenium-engine-js@3.2.1","_nodeVersion":"14.17.1","_npmVersion":"6.14.13","dist":{"integrity":"sha512-CZrzsUj0KfOoiYhKzg9r6vdKx2PYCURxM2QANyK1hYbfLo8yrDAJ2M7mWUj0psDcvD8YZAdW2Jvx3oTQ6O7wUg==","shasum":"65034b510b67db812e5c41d569f742ee9bd2b56b","tarball":"https://registry.npmjs.org/selenium-engine-js/-/selenium-engine-js-3.2.1.tgz","fileCount":6,"unpackedSize":14857,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiCv13CRA9TVsSAnZWagAAO9oP/1HRVGVwuic+sjcfKriq\nneuBcqXqbExsS6bOhZMtv0/KRpxrv+XgMEhZ+ZbLH788Pyehg3en6lrOShOY\n49cyIK6XrKiui4Yf+2wXG/cGmdigO9D6Bdx0Fya1qFuIOFvIWGw4a311Mquc\nDqsKaYlRZI4sdcZegVXjbgAwfC1F8FeUect0QTHiz+rO+vk3cYzTywEaIXRV\nbNKzGc9KxyaptCEm2Z/4RJaNNKr498zWhe1MDNy1gXgZVeBiz0E4+YmmUZz/\nTTogl1bDOQnNPMHNzKZCSPoHapz7uOLaOg7V6+PWbDLnvgyqnPfD2N3Sc+Vy\nOueSguBkG0oMY3ntfS29l2QYpquWn8pyPeQxm9WVmsjn4kvABpXn8RRPAoyt\ny+TKXiU8LsUVQa48m+Qw+m8M3l2wiz9h5SuGDgyyTvTEc0RjfkCBtsgY/ipu\nEkRrhuf6eSGcnAUldEO8bQTnW+a/WLR5A0Ig3SpUEWDDn9qi0p1ILAchEcDK\n2bjRaqgRJmgVGJJK66U6CCdqfQ3lTkE68j71ehMhoq7nEmH8pDxhwuvx4IlS\ni6s8znVJaLPx7a5osm5m+ad7lbhGgVFE8ifJzqKUborMx+z6iEqUpiX7E6RO\nOsyiqqQLp+iTxDo9bqZlwiC5Gp/rZvhyrxXYNIquHmmSH9f5jsNromtIZbjq\n4ZGZ\r\n=JnTa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCyse/7INCa5BLBK88fvIf61iUDfSqqAAlHUfnVfYDR+AIhAJk8cLN1YY3kw4nYq0HIQSlT/iOQA+OrGkpqQMVXlfHC"}]},"_npmUser":{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"},"directories":{},"maintainers":[{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/selenium-engine-js_3.2.1_1644887414992_0.43987954841771426"},"_hasShrinkwrap":false}},"time":{"created":"2022-02-13T00:40:01.416Z","2.0.0":"2022-02-13T00:40:01.682Z","modified":"2022-05-17T10:13:19.742Z","2.0.1":"2022-02-13T01:18:48.364Z","2.0.2":"2022-02-13T10:34:34.945Z","3.0.0":"2022-02-14T23:57:18.391Z","3.1.0":"2022-02-15T00:55:07.761Z","3.2.0":"2022-02-15T01:01:56.388Z","3.2.1":"2022-02-15T01:10:15.133Z"},"maintainers":[{"name":"lukesavefrogs","email":"lucasalvarani99@gmail.com"}],"description":"Selenium-like methods useful for automating SPAs (Single Page Application) where content is changed dynamically.","homepage":"https://github.com/LukeSavefrogs/SeleniumEngineJS#readme","keywords":["javascript","js","selenium","automation","spa"],"repository":{"type":"git","url":"git+https://github.com/LukeSavefrogs/SeleniumEngineJS.git"},"author":{"name":"Luca Salvarani"},"bugs":{"url":"https://github.com/LukeSavefrogs/SeleniumEngineJS/issues"},"license":"MIT","readme":"[![GitHub release](https://img.shields.io/github/release/LukeSavefrogs/SeleniumEngineJS.svg)](https://GitHub.com/LukeSavefrogs/SeleniumEngineJS/releases/)\r\n\r\n# SeleniumEngineJS\r\nSelenium-like methods useful for automating SPAs (Single Page Application) where content is changed dynamically.\r\n\r\n\r\n## Introduction \r\nThis little script written in vanilla JS tries to **emulate** some of the **Selenium** most useful features, such as the _Expected Conditions_. It was originally written to be included into _Tampermonkey/Greasemonkey scripts_ to bring the power of selenium into user scripts and be able to automate even **Single Page Applications** (where usually content and elements are loaded dynamically and URLs don't change, making automation really hard).\r\n\r\nThe script itself uses [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) but the real deal is the use of [**async/await**](https://javascript.info/async-await) in your code to chain Promises in a cleaner way so that async code **looks** as if it was syncronous (but IT IS NOT, don't get confused). \r\n\r\nAs of February 2022, async/await keywords are [supported everywhere EXCEPT Internet Explorer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function#Browser_compatibility), which does not even support Promises thus making this script completely useless (but i think almost nobody is still using it :smile:). \r\n\r\nEven **without** async/await you could still chain the operations by using `Promise.then()`, but it is just another way of going down the good old [callback hell](http://callbackhell.com/) :worried:.\r\n\r\n## How to use\r\n- Simply **copy and paste** the [`SeleniumEngine` `const`ant](./src/SeleniumEngine.js) into your code and use :smile:\r\n- In your **HTML file**, by using a **CDN**:\r\n  - [JSDelivr](https://www.jsdelivr.com/package/npm/selenium-engine-js)\r\n\t```html\r\n\t<script type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/npm/selenium-engine-js/src/SeleniumEngine.js\"></script>\r\n\t```\r\n\r\n  - [UnPkg](https://unpkg.com/selenium-engine-js/src/SeleniumEngine.js)\r\n\t```html\r\n\t<script type=\"text/javascript\" src=\"https://unpkg.com/selenium-engine-js/src/SeleniumEngine.js\"></script>\r\n\t```\r\n\r\n- **Include** directly the file (so that updates will be reflected on your code):\r\n    - _Javascript_ (`eval`): \r\n\t```javascript\r\n\tfetch(\"https://raw.githubusercontent.com/LukeSavefrogs/SeleniumEngineJS/main/src/SeleniumEngine.js\").then(data => data.text()).then(body => eval(body))\r\n\t```\r\n\r\n    - _Javascript_ (`import`): \r\n\t```javascript\r\n\t(async () => {\r\n\t\t// ...\r\n\t\tawait import(\"https://raw.githubusercontent.com/LukeSavefrogs/SeleniumEngineJS/main/src/SeleniumEngine.js\")\r\n\t\t// ...\r\n\t})()\r\n\t```\r\n\r\n\t\r\n    -  _NodeJS_ (CJS)\r\n\t```javascript\r\n\tconst SeleniumEngine = require(\"selenium-engine-js\");\r\n\t```\r\n\r\n    -  _NodeJS_ (ESModules):\r\n\t```javascript\r\n\timport SeleniumEngine from \"selenium-engine-js\";\r\n\t```\r\n\r\n\r\n> ### Important\r\n> All the methods MUST be used inside an **`async`** function, as for the examples below (or using `Promise.then()`, which, again, is discouraged since it kinda destroys the whole concept behind this project).\r\n\r\n## Methods\r\n#### `SeleniumEngine.waitUntil(testCondition, timeout_ms, checkInterval_ms)`\r\nUsed internally by [`SeleniumEngine.waitForElementPresent()`](#seleniumenginewaitforelementpresentcssselector-timeout_ms) and [`SeleniumEngine.waitForElementNotPresent()`](#seleniumenginewaitforelementnotpresentcssselector-timeout_ms). **Pauses** the execution of the current function until the provided function `testCondition` is **truthy** (the function is executed every `checkInterval_ms` ms, default is _1000_). \r\n\r\n**Throws** an error if wait time exceeds `timeout_ms` (default is _30000_).\r\n\r\n```javascript\r\n(async () => {\r\n    console.log(\"Operation 1\");\r\n    \r\n\ttry {\r\n\t\tlet test_switch = false;\r\n\t\twindow.setTimeout(() => { test_switch = true}, 4500);\r\n\r\n\r\n    \t// Example 1 - Returns after the variable `test_switch` has become true\r\n\t    let resp = await SeleniumEngine.waitUntil(() => test_switch == true)\r\n\t\tconsole.log(\"Now we can continue with the example. We have waited for %d ms\", resp.time)\r\n\r\n\r\n    \t// Example 2 - Throws an error like `Timeout of 30000ms exceeded (30016 real)`\r\n\t    await SeleniumEngine.waitUntil(() => false)\r\n\t\tconsole.log(\"This won't be executed\")\r\n\r\n\t} catch (err) {\r\n\t\tconsole.log(\"As expected, the second example has returned an exception: %o\", err)\r\n\t}\r\n    \r\n\t\r\n    // Example 3 - Will wait forever, because timeout is disabled and the expected condition is NEVER met\r\n    console.warn(\"The next expression will wait forever, because timeout is disabled\")\r\n\tawait SeleniumEngine.waitUntil(() => false, 0);\r\n\r\n\r\n    console.log(\"Operation 2\");\r\n})()\r\n```\r\n[*See it live*](https://runkit.com/lukesavefrogs/selenium-engine-js-waituntil)\r\n\r\n\r\n#### `SeleniumEngine.waitForElementPresent(cssSelector, timeout_ms)`\r\n**Pauses** the execution of the current function until an **element** matching the provided CSS selector is **found**. \r\n\r\n**Throws** an exception if it isn't found before `timeout_ms` ms\r\n\r\n```javascript\r\n// 1. Here we create an element with ID=test and we append to the body after 5000ms\r\nwindow.setTimeout(() => {\r\n    const test_element = document.createElement(\"span\");\r\n    test_element.id = \"test\";\r\n    \r\n    document.body.appendChild(test_element);\r\n}, 5000);\r\n\r\n\r\n// 2. Here we wait until the element is present in the page\r\n(async () => {\r\n    console.log(\"Operation 1\");\r\n    \r\n    // Pause function for 5 seconds, then continues\r\n    await SeleniumEngine.waitForElementPresent(\"#test\", 8000)\r\n\r\n    console.log(\"Operation 2\");\r\n})()\r\n```\r\n\r\n\r\n#### `SeleniumEngine.waitForElementNotPresent(cssSelector, timeout_ms)`\r\n**Pauses** the execution of the current function until an **element** matching the provided CSS selector is **no longer found**\r\n\r\n**Throws** an exception if it isn't found before `timeout_ms` ms\r\n\r\n```javascript\r\n// 1. Here we remove the element with ID=test after 5000ms\r\n(() => {\r\n    const test_element = document.createElement(\"span\");\r\n    test_element.id = \"test\";\r\n    document.body.appendChild(test_element);\r\n\r\n    // Then after 5 seconds we remove it\r\n    window.setTimeout(() => {\r\n        document.getElementById(\"test\").remove()\r\n    }, 5000);\r\n})()\r\n\r\n\r\n// 2. Here we wait until the element is not present anymore in the page\r\n(async () => {\r\n    console.log(\"Operation 1\");\r\n    \r\n    // Pause function for 5 seconds, then continues\r\n    await SeleniumEngine.waitForElementNotPresent(\"#test\", 8000)\r\n\r\n    console.log(\"Operation 2\");\r\n})()\r\n```\r\n\r\n\r\n#### `SeleniumEngine.sleep(ms)`\r\n**Pauses** the execution of the current function for the number of **milliseconds** passed as parameter.\r\n\r\n```javascript\r\n(async () => {\r\n    console.log(\"Operation 1\");\r\n    \r\n    // Pause function for 2 seconds\r\n    await SeleniumEngine.sleep(2000);\r\n\r\n    console.log(\"Operation 2\");\r\n})()\r\n```\r\n\r\n[*See it live*](https://runkit.com/lukesavefrogs/selenium-engine-js-sleep)","readmeFilename":"README.md"}