@testim/testim-cli 4.103.0-beta.0 → 4.104.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +2 -2
- package/cli.js.map +2 -2
- package/npm-shrinkwrap.json +11515 -2
- package/package.json +1 -1
package/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#! /usr/bin/env node
|
|
2
2
|
"use strict";var OT=Object.create;var zn=Object.defineProperty;var LT=Object.getOwnPropertyDescriptor;var DT=Object.getOwnPropertyNames;var MT=Object.getPrototypeOf,NT=Object.prototype.hasOwnProperty;var w=(s,e)=>()=>(s&&(e=s(s=0)),e);var G=(s,e)=>{for(var t in e)zn(s,t,{get:e[t],enumerable:!0})},Xp=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of DT(e))!NT.call(s,n)&&n!==t&&zn(s,n,{get:()=>e[n],enumerable:!(r=LT(e,n))||r.enumerable});return s};var S=(s,e,t)=>(t=s!=null?OT(MT(s)):{},Xp(e||!s||!s.__esModule?zn(t,"default",{value:s,enumerable:!0}):t,s)),be=s=>Xp(zn({},"__esModule",{value:!0}),s);var je={};G(je,{log:()=>N,measure:()=>FT});function N(...s){if(!Zp)return;let e=Date.now();console.log(`${e-UT} ${e-Qp} `,...s),Qp=e}function FT(s,e){if(!Zp)return;let t=Date.now();try{s()}finally{console.log(e||s.name,"took",Date.now()-t)}}var Zp,UT,Qp,$e=w(()=>{"use strict";Zp=process.env.MEASURE_TESTIM_CLI_PERFORMANCE,UT=Date.now(),Qp=Date.now()});var Kt,Mr=w(()=>{"use strict";Kt="element-6066-11e4-a52e-4f735466cecf"});function se(s=16){let e="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890",t="";for(let r=0;r<s;r++){let n=Math.floor(Math.random()*e.length);t+=e[n]}return t}function qe(s,e,t,r,n){let o="";return n=n?encodeURIComponent(n):"master",e&&t&&(o=`${s}/#/project/${e}/branch/${n}/test/${t}`,r&&(o+=`?result-id=${r}`)),o}function Ga(s,e){return`Basic ${Buffer.from(`${s}:${e}`).toString("base64")}`}function _e(s){let e=/^(https?:\/\/)/i,t=new RegExp("^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$","i");return e.test(s)||t.test(s)}var Ha=w(()=>{"use strict"});var za,ed,td,to=w(()=>{za={ngrok:"4.3.3","v8-to-istanbul":"9.1.0","istanbul-lib-coverage":"3.2.0","@bcoe/v8-coverage":"0.2.3","convert-source-map":"1.7.0",multer:"1.4.5-lts.1"},ed={"@applitools/eyes-sdk-core":"13.11.32","@applitools/spec-driver-webdriverio":"1.4.29","@segment/analytics-node":"1.3.0","@types/unzip-stream":"0.3.2",ajv:"6.12.6","body-parser":"1.20.1",chalk:"4.1.2","chrome-launcher":"0.15.0",commander:"10.0.0",compression:"1.7.4","coralogix-logger":"1.1.28",cors:"2.8.5","data-uri-to-buffer":"2.0.2",dayjs:"1.11.8",express:"4.19.2",fkill:"7.2.1","form-data":"3.0.0","https-proxy-agent":"7.0.2","istanbul-lib-report":"3.0.0","istanbul-reports":"3.1.5",jimp:"0.22.10",jsonwebtoken:"9.0.0",linkedom:"0.18.0",lodash:"4.17.21","memory-fs":"0.5.0",ms:"2.1.2",npm:"10.5.0","object-hash":"3.0.0",ora:"5.4.1","p-limit":"4.0.0","p-retry":"4.6.2",pako:"1.0.11",portfinder:"1.0.28","promise-queue":"2.2.5",prompts:"2.4.2","proxy-agent":"6.3.1","rox-node":"4.9.18",semver:"7.6.0","serialize-error":"7.0.1","socket.io-client":"4.6.2","source-map-support":"0.5.19",superagent:"9.0.1","superagent-proxy":"3.0.0","test-exclude":"6.0.0","ua-parser-js":"0.7.33","unzip-stream":"0.3.1","validate-npm-package-name":"3.0.0",webdriverio:"7.24.0",winston:"3.11.0","winston-transport":"4.6.0",ws:"8.17.1",xml2js:"0.6.2",yaml:"2.2.2"},td={node:">= 18.0.0"}});var ks,rd,sd,nd,od,ro,_s,id,fe,ad,cd,so,Oe,Ka,ld,no,ud,xR,pd,CR,dd,md,Nr,fd,gd,hd,yd,bd,Td,Ja,Ya,Xa,Qa,wd,Os,vd,Sd,Ed,Za,ue=w(()=>{"use strict";ks=process.env.SERVICES_HOST||"https://services.testim.io",rd="https://testimstatic.blob.core.windows.net",sd="https://tstresultfiles.azureedge.net";process.env.GATEWAY_URL&&(process.env.CORALOGIX_URL=`${process.env.GATEWAY_URL}/testim/coralogix/api/v1/logs`,process.env.SERVICES_HOST=`${process.env.GATEWAY_URL}/testim/services`,process.env.EXTENSION_SERVICES_HOST=process.env.TUNNEL_GATEWAY?process.env.SERVICES_HOST:ks,ks=process.env.SERVICES_HOST);nd=parseInt(process.env.DISABLE_AGENT_ORIGIN_CHECK||"0",10),od=parseInt(process.env.DISABLE_DEBUGGER_INFINITE_TIMEOUT||"0",10),ro=parseInt(process.env.OVERRIDE_TIMEOUTS||"0",10),_s=process.env.EDITOR_URL,id=process.env.WEBSOCKET_HOST||`${ks}/ws`,fe=ks,ad=parseInt(process.env.LOGGER_CONSOLE||"0",10),cd=parseInt(process.env.LOGGER_DEBUG||"0",10),so=parseInt(process.env.WEBDRIVER_DEBUG||"0",10),Oe=parseInt(process.env.IS_ON_PREM||"0",10),Ka=process.env.REQUESTS_QUEUE_SIZE?parseInt(process.env.REQUESTS_QUEUE_SIZE,10):void 0,ld=parseInt(process.env.DEBUG_MODE||"0",10),no=process.env.TESTIM_CONCURRENT_WORKER_COUNT?parseInt(process.env.TESTIM_CONCURRENT_WORKER_COUNT,10):null,ud=process.env.ROLLOUT_KEY||"5b5560729601aa6484276518",xR=parseInt(process.env.DF_ENABLE_VIDEO||"0",10),pd=parseInt(process.env.START_WORKER_DELAY_MS||"1500",10),CR=process.env.APPIUM_VERSION||"1.10.1",dd=process.env.GATEWAY_URL,md=process.env.EXTENSION_SERVICES_HOST||ks,Nr=process.env.GATEWAY_URL?`${process.env.GATEWAY_URL}/testim/blob`:rd,fd=process.env.GATEWAY_URL?`${process.env.GATEWAY_URL}/testim/edge`:sd,gd=rd,hd=sd,yd=5*60*1e3,bd=40,Td=process.env.TMA_BASE_API_URL||"http://127.0.0.1:8585/api",Ja=process.env.HEADSPIN_MOBILE_API_BASE_URL||"https://api-dev.headspin.io",Ya=process.env.TDC_MOBILE_API_BASE_URL||"https://api.tdc.tricentis-cloud.com",Xa=process.env.HEADSPIN_TDC_DEVICES_API_PATH||"v0",Qa=process.env.HEADSPIN_TDC_APPS_API_PATH||"v1",wd=process.env.TVC_MOBILE_API_URL||"https://api.waldo.com",Os=process.env.BROWSERSTACK_APPS_API_URL||"https://api-cloud.browserstack.com/app-automate",vd=process.env.SAUCE_LABS_US_APPS_API_URL||"https://api.us-west-1.saucelabs.com/v1",Sd=process.env.SAUCE_LABS_EU_APPS_API_URL||"https://api.eu-central-1.saucelabs.com/v1",Ed=process.env.P_CLOUDY_DEFAULT_TEST_DURATION||60,Za=process.env.P_CLOUDY_DEFAULT_ANDROID_DEVICE_NAME||"samsung"});var ec={};G(ec,{CoralogixTransport:()=>Ur});var Re,Id,$T,WT,Ur,tc=w(()=>{"use strict";Re=require("coralogix-logger"),Id=S(require("winston-transport")),$T={debug:Re.Severity.debug,silly:Re.Severity.verbose,verbose:Re.Severity.verbose,silent:Re.Severity.verbose,info:Re.Severity.info,http:Re.Severity.info,warn:Re.Severity.warning,warning:Re.Severity.warning,error:Re.Severity.error,critical:Re.Severity.critical,crit:Re.Severity.critical},WT=["err","error","reason","e"],Ur=class extends Id.default{constructor(t){t={...Ur.options,...t};super(t);this.options=t,this.logger=new Re.CoralogixLogger(t.category||""),this.name="Coralogix Transport",t.timestamp&&(this.timestamp=t.timestamp)}log(t,r){let{category:n,level:o,message:i,meta:a={},...l}=t,c={...a,...this.options.extraFields,...l},d=new Re.Log;d.severity=$T[o],d.text=i,d.category=n,c.className&&(d.className=c.className),c.methodName&&(d.methodName=c.methodName),c.threadId&&(d.threadId=c.threadId),delete c.className,delete c.methodName,delete c.threadId,delete c.category,delete c.level,delete c.message;let m=!1;a instanceof Error&&(m=!0,c.msg=a.message+a.stack,i&&(c.msg=`${i}
|
|
3
|
-
${c.msg}`));for(let u of WT)a[u]instanceof Error&&(c[u]={message:a[u].message,stack:a[u].stack,name:a[u].name,type:a[u].type,cause:a[u].cause,...a[u]});Object.keys(c).length>0&&(i&&!m&&(c.msg=i),d.text=c),this.logger.addLog(d),r(null,!0)}waitForFlush(){return this.logger.waitForFlush()}static configure(t){Re.CoralogixLogger.configure(t),Ur.options=t}}});var cc={};G(cc,{getLogger:()=>C,sessionPlayerLoggerFormatter:()=>nc,setExecutionId:()=>oc,setProjectId:()=>ic,setProxyUri:()=>ac});function HT(){let s=[],e=()=>Promise.resolve();if(!Oe){let{CoralogixTransport:t}=(tc(),be(ec));t.configure(Pd);let r=new t({category:"ROOT"});s.push(r),e=()=>r.waitForFlush()}if(ad){let t={depth:5,colors:!0};s.push(new ft.transports.Console({format:ft.format.combine(ft.format.colorize({all:!0,colors:{info:"blue",error:"red",warning:"yellow"}}),ft.format.timestamp({format:"HH:mm:ss:SSS"}),ft.format.printf(r=>`[${r.timestamp}] ${r.level} ${r.category}: ${r.message} ${io.inspect(r.meta,t)}`))}))}return[s,e]}function oc(s){rc=s}function ic(s){kd=s}function ac(s){if(Oe||!s)return;let{CoralogixTransport:e}=(tc(),be(ec));e.configure({...Pd,proxyUri:s})}function Ad(s){return{projectId:kd,time:new Date().toISOString(),...rc&&!s&&{executionId:rc}}}function C(s){return new sc(YT.child({category:s}))}var xd,ft,io,oo,Cd,VT,GT,Pd,Rd,nc,qT,zT,KT,JT,YT,rc,kd,sc,j=w(()=>{"use strict";xd=S(require("os")),ft=S(require("winston"));ue();io=S(require("util")),oo=S(require("chalk")),Cd=S(require("dayjs"));F();VT=xd.hostname(),GT=gt(),Pd={privateKey:"d0eb01da-f966-1663-63c6-8871225d7c39",applicationName:"testim",subsystemName:"runner"};Rd={depth:5,colors:!0},nc=(s,e,t)=>{let r=`[${(0,Cd.default)().format("HH:mm:ss:SSS")}]`,n=io.inspect(e,Rd),o=io.inspect(t,Rd);return`${oo.default.white(r)} ${oo.default.reset()}SessionPlayer-${oo.default.red(s)} ${n} ${o}`},[qT,zT]=HT(),KT=cd?"debug":"info",JT={release:Boolean(!0),branch:"production"},YT=ft.createLogger({levels:ft.config.syslog.levels,level:KT,transports:qT,defaultMeta:{name:"runner",hostname:VT,nodeVersion:process.version,runnerVersion:GT,...JT}}),rc=null,kd=null;sc=class{constructor(e){this._logger=e;this.debug=this.debug.bind(this),this.info=this.info.bind(this),this.warn=this.warn.bind(this),this.error=this.error.bind(this),this.fatal=this.fatal.bind(this)}debug(e,t={}){this.innerLog("debug",e,t)}info(e,t={}){this.innerLog("info",e,t)}warn(e,t={}){this.innerLog("warning",e,t)}error(e,t={}){this.innerLog("error",e,t)}fatal(e,t={}){this.innerLog("crit",e,t)}innerLog(e,t,r={}){let{executionId:n}=r;try{this._logger.log(e,{meta:r,message:t,...Ad(n)})}catch(o){try{this._logger.log("crit",{message:`failed to log message ${o.message}, ${o.stack}`,...Ad(n)})}catch{}}}waitForFlush(){return zT()}}});var uo,Fr,P,Jt,fr,Rt,ao,Br,ne,Ls,ze,Yt,At,co,jr,lo,Ds,K=w(()=>{"use strict";uo=require("p-retry"),Fr=class extends Error{constructor(){super(...arguments);this.name="NoArgsError"}},P=class extends Error{constructor(){super(...arguments);this.name="ArgError"}},Jt=class extends Error{constructor(){super(...arguments);this.name="StopRunOnError"}},fr=class extends Error{constructor(t,r){super(t);this.type=r}},Rt=class extends uo.AbortError{},ao=class extends uo.AbortError{},Br=class extends uo.AbortError{},ne=class extends Error{},Ls=class extends Error{},ze=class extends Error{constructor(){super(...arguments);this.name="GridError"}toString(){return this.message}},Yt=class extends ze{constructor(){super(...arguments);this.name="GridConcurrencyError"}},At=class extends Error{constructor(){super(...arguments);this.name="NpmPackageError"}},co=class extends Error{constructor(){super(...arguments);this.message="selenium driver crashed";this.name="SeleniumCrashError"}},jr=class extends Error{constructor(t){super(`Testim had missing write access to ${t}`);this.path=t}},lo=class extends Error{constructor(e){super(`Package for CLI action need to have a CommonJS export which the package ${e} does not have`)}},Ds=class extends Error{constructor(e=!1){let t="not implemented";e&&(t="should be implemented on descendant"),super(t)}}});function lc(s){return!!s&&(typeof s=="object"||typeof s=="function")&&typeof s.then=="function"&&typeof s.catch=="function"}function oe(s){return(0,Ld.setTimeout)(s)}function uc(s,e){let t=new Promise((r,n)=>{e.onabort=()=>{n(e.reason)}});return Promise.race([s,t])}function ce(s,e,t="Timeout Error"){ro&&!_d&&(_d=!0,console.log("Debugger connected - timeouts were overridden to 10 minutes to improve debugging"));let r=new ne(t);return e=ro?Number(ro)||6e5:e,Promise.race([s,oe(e).then(()=>{throw r})])}async function ie(s,e,{concurrency:t}={}){if(t){Od||=(await import("p-limit")).default;let r=Od(t);return await Promise.all(Array.from(s,(n,o)=>r(()=>e(n,o))))}return await Promise.all(Array.from(s,e))}function Xt(s){return new Promise((e,t)=>{s((r,n)=>r?t(r):e(n))})}var Ld,_d,Od,pc=w(()=>{"use strict";Ld=require("timers/promises");K();ue();_d=!1});var Ns,Dd,XT,Ms,Md,QT,ZT,Nd,Ud=w(()=>{"use strict";Ns=S(require("lodash"));ue();Dd=require("dns");j();pc();XT=C("http-request-counters"),Ms=!1,Md=async()=>{if(Oe)return!0;let s=["www.google.com","www.facebook.com","www.microsoft.com","testim.io"];try{let e=Boolean(await ie(s,t=>Dd.promises.lookup(t)));return e||(Ms=!0),e}catch{return XT.error("network connectivity test failed"),Ms=!0,!1}},QT=Ns.throttle(Md,10*1e3),ZT=60*1e3*15,Nd=()=>{let s={call:new Map,success:new Map,fail:new Map};function e(n,o){let i=n.get(o)||0;n.set(o,i+1),setTimeout(()=>{let a=n.get(o)||1;n.set(o,a-1)},ZT)}function t(n,o=n.name){return async function(...i){e(s.call,o);try{let a=await n.call(null,...i);return e(s.success,o),a}catch(a){throw e(s.fail,o),Ms||QT(),a}}}async function r(){if(Ms||!await Md())return!1;let n=Ns.sum([...s.fail.values()]),o=Ns.sum([...s.call.values()]);return n<o*.1}return r.counters=s,t.counters=s,t.isNetworkHealthy=r,t.didNetworkConnectivityTestFail=()=>Ms,t}});var Ke={};G(Ke,{deleteFullRes:()=>nw,deleteReq:()=>Us,didNetworkConnectivityTestFail:()=>Tc,download:()=>yc,get:()=>Te,getFullRes:()=>iw,getText:()=>Bs,head:()=>aw,isNetworkHealthy:()=>bc,post:()=>Ve,postForm:()=>Fs,postFullRes:()=>ow,postText:()=>gc,put:()=>hc});function tw(){return global.caFileContent}function rw(s,e){let t=[];s.on("data",r=>{t.push(r)}),s.on("end",()=>{e(null,Buffer.concat(t))})}function sw(){return!xt.default.Request.prototype.proxy&&global.SuperagentProxy&&global.SuperagentProxy(xt.default),global.proxyUri}function gr(s,e=!1){let t=tw();t&&s.ca(t);let r=!e&&sw();r&&s.proxy(r)}async function Fd(s,e={},t={},r=$r){let n=xt.default.delete(s).send(e).timeout(r).set(t);return gr(n),await n}async function mc(s,e,t={},r=$r,n=0){let o=xt.default.post(s).send(e).timeout(r).set(t);gr(o),n&&o.retry(n);try{return await o}catch(i){throw i.url=s,i.originalRequestTimeout=r,i.additionalSetHeaders=t,i}}async function fc(s,e,t={},r=$r,{isBinary:n=!1,skipProxy:o=!1}={}){let i=xt.default.get(s).query(e||{}).timeout(r).set(t);return n&&i.buffer(!0),gr(i,o),await i}var xt,dc,We,$r,ew,Mt,Us,nw,Ve,ow,Fs,Bs,gc,Te,iw,aw,hc,yc,bc,Tc,Ge=w(()=>{"use strict";xt=S(require("superagent"));j();Ud();dc=C("http-request"),We=Nd(),$r=parseInt(process.env.DEFAULT_REQUEST_TIMEOUT||"0",10)||3e4,ew=6e4;Mt=(s,e,t)=>{throw dc.error(s,{...t,error:e}),e};Us=We(async(s,e,t,r)=>{try{let n=await Fd(s,e,t,r);return n.type==="text/plain"?n.text:n.body}catch(n){return Mt("failed to delete request",n,{url:s})}});nw=We(Fd),Ve=We(async({url:s,body:e,headers:t,timeout:r,retry:n})=>{try{let o=await mc(s,e,t,r,n);return o.type==="text/plain"?o.text:o.body}catch(o){return Mt("failed to post request",o,{url:s})}});ow=We(mc),Fs=We(async(s,e,t,r={},n=$r)=>{let o=xt.default.post(s).type("form").timeout(n).set(r);o.field(e),Object.entries(t).forEach(([i,a])=>{o.attach(i,a.buffer,a.fileName)}),gr(o);try{let i=await o;return i.type==="text/plain"?i.text:i.body}catch(i){return Mt("failed to post request",i,{url:s})}});Bs=We(async(s,e,t)=>{try{return(await fc(s,e,t)).text}catch(r){return Mt("failed to getText request",r,{url:s,query:e})}}),gc=We(async({url:s,body:e,headers:t,timeout:r,retry:n})=>{try{return(await mc(s,e,t,r,n)).text}catch(o){return Mt("failed to post request",o,{url:s})}}),Te=We(async(s,e,t,r,n)=>{try{return(await fc(s,e,t,r,n)).body}catch(o){return Mt("failed to get request",o,{url:s,query:e})}}),iw=We((s,e,t,r)=>fc(s,e,t,r)),aw=We(async s=>{let e=xt.default.head(s).timeout($r);gr(e);try{return await e}catch(t){return Mt("failed to head request",t,{url:s})}}),hc=We(async(s,e,t={},r=$r)=>{let n=xt.default.put(s).send(e).timeout(r).set(t);gr(n);try{return(await n).body}catch(o){return Mt("failed to put request",o,{url:s})}}),yc=We(async s=>{dc.info("start to download",{url:s});let e=xt.default.get(s).timeout(ew).buffer(!0).parse(rw);gr(e);try{let t=await e;return dc.info("finished to download",{url:s}),t}catch(t){return Mt("failed to download",t,{url:s})}}),bc=We.isNetworkHealthy,Tc=We.didNetworkConnectivityTestFail});function ht(){let s;return require.main?(require.main.filename.includes("/src")||require.main.filename.includes("\\src")?s=Nt.resolve(__dirname,"../../"):s=Nt.resolve(__dirname,""),s):process.cwd()}function po(s,e){return _e(s)?e||Nt.join(process.cwd(),s.replace(/^.*[\\/]/,"")):e||Nt.basename(s)}function gt(){try{return require(`${__dirname}/package.json`).version}catch{return""}}function lw(){try{return td.node}catch{return""}}async function $d(s,e,t=!0){let r=await rt.promises.readdir(s,{withFileTypes:!0});await rt.promises.mkdir(e,{recursive:t});for(let n of r){let o=Nt.join(s,n.name),i=Nt.join(e,n.name);n.isDirectory()?await $d(o,i):await rt.promises.copyFile(o,i)}}async function ge(s){try{return await rt.promises.access(s),!0}catch(e){if(e.code==="ENOENT")return!1;throw e}}var Nt,Bd,jd,rt,cw,Ut,Je,mo,wc,st,vc,Wd=w(()=>{"use strict";Nt=S(require("path"));Ha();to();Bd=S(require("unzip-stream")),jd=S(require("p-retry")),rt=require("fs"),cw=3;Ut=async s=>{let e=await Promise.resolve().then(()=>(Ge(),Ke));return(0,jd.default)(()=>e.download(s),{retries:cw,factor:1})},Je=async(s,e)=>{let t=await Ut(s);return rt.promises.writeFile(e,t.body)};mo=async(s,e)=>{let t=po(s,e);return _e(s)?Je(s,t):rt.promises.copyFile(s,t)},wc=async s=>_e(s)?Ut(s):rt.promises.readFile(s),st=async(s,e)=>await(0,rt.createReadStream)(s).pipe(Bd.Extract({path:e})),vc=s=>(0,rt.statSync)(s).size/1e6});var Ft={};G(Ft,{APPIUM_SESSION_MESSAGE:()=>Ac,CLI_MODE:()=>ee,MOBILE_APP_SOURCE:()=>fo,MOBILE_RUN_SKIP_REASON:()=>Rc,gridMessages:()=>yt,gridTypes:()=>_,mobileWeb:()=>Ec,runnerStatus:()=>Sc,runnerTestStatus:()=>de,socketEventTypes:()=>Ct,stepResult:()=>$s,test:()=>Ic,testRunStatus:()=>js,testStatus:()=>Ye,timeoutMessages:()=>Ue});var Ue,js,Sc,de,Ye,yt,Ec,Ic,Ct,ee,_,$s,fo,Rc,Ac,ae=w(()=>{"use strict";Ue={GET_BROWSER_TIMEOUT_MSG:"get-browser-timeout",TEST_START_TIMEOUT_MSG:"test-start-timeout",TEST_COMPLETE_TIMEOUT_MSG:"test-complete-timeout"},js={COMPLETED:"completed"},Sc={RUNNING:"RUNNING",SKIPPED:"SKIPPED",FINISHED:"FINISHED",ABORTED:"ABORTED",QUEUED:"QUEUED",TIMEOUT:"TIMEOUT"},de={PASSED:"PASSED",FAILED:"FAILED",ABORTED:"ABORTED",SKIPPED:"SKIPPED",QUEUED:"QUEUED",PENDING:"PENDING"},Ye={DRAFT:"draft",EVALUATING:"evaluating",ACTIVE:"active",QUARANTINE:"quarantine"},yt={NOT_FOUND:"The specified grid is not available",UNKNOWN:"Test couldn't get browser - unknown error"},Ec={MOBILE_WEB_REMOTE_RUN_HEADER_SPACING:50},Ic={HIDDEN_PARAM:"TST_HIDDEN_PARAM"},Ct={TEST_RESULT_CREATED:"test-result-created",TEST_RESULT_UPDATED:"test-result-updated",REMOTE_STEP_SAVED:"remote-step-saved"},ee={EXTENSION:"extension",SELENIUM:"selenium",APPIUM:"appium"},_={TESTIM_ENTERPRISE:"testimEnterprise",TESTIM:"testim",LAMBDATEST:"testimLambdaTest",DEVICE_FARM:"testimDF",HYBRID:"testimHybrid",BROWSERSTACK:"browserstack",SAUCELABS:"saucelabs",TESTIM_HEADSPIN:"testimHeadspin",TESTIM_TDC:"testimTDC",TESTIM_TVC:"testimTVC",P_CLOUDY:"pcloudy"},$s={SETUP_TIMEOUT:"setup-timeout",NETWORK_ERROR:"network-error",GRID_ERROR:"grid-error",SELENIUM_ERROR:"selenium-error",BROWSER_CLOSED:"browser-closed",MOBILE_SESSION_ERROR:"mobile-session-error",UNKNOWN_ERROR:"unknown-error"},fo={FROM_LIBRARY:"from-library",FROM_DEVICE:"from-device"},Rc={APP_FROM_DEVICE:"app-from-device",VIRTUAL_BUILD:"virtual-build"},Ac={APP_NOT_EXIST_ON_DEVICE:"used to start the app doesn't exist or cannot be launched",APP_NEVER_STARTED:"never started",DEVICE_OS_VERSION_TOO_LOW:"DeviceOSVersionTooLow",TIMEOUT_ERROR:"Timeout awaiting 'request'",SAUCELABS_APP_IS_NOT_INSTALLED:"Original error: 'app' option is required for reinstall"}});function Ws(s,e){var t,r,n;return((t=s.testConfigNames)!=null&&t.length||(r=s.testConfigIds)!=null&&r.length||s.testPlan.length||s.testPlanIds.length)&&!s.browser?[...new Set(e.map(o=>{var i;return(i=o.runConfig)==null?void 0:i.browserValue}))]:[(n=s.browser)==null?void 0:n.toLowerCase()]}function uw(){let{argv:s}=process;if(s.includes("--remoteRunId"))return{remoteRunId:s[s.indexOf("--remoteRunId")+1],projectId:s[s.indexOf("--project")+1],token:s[s.indexOf("--token")+1]}}var Vs,Vd,Xe,pw,dw,mw,fw,gw,xc,Cc,Gd=w(()=>{"use strict";ae();Vs=s=>{var e,t;return Boolean(((e=s.testPlan)==null?void 0:e.length)||((t=s.testPlanIds)==null?void 0:t.length))},Vd=s=>Boolean(s.resultId&&s.source==="remote-run"),Xe=(s,e)=>s.testStatus===Ye.QUARANTINE&&!Vd(e)&&!e.runQuarantinedTests;pw=s=>Boolean(s.loginMode),dw=s=>Boolean(s.tunnelOnlyMode),mw=s=>Boolean(s.createPrefechedData),fw=s=>Boolean(s.installLazyDepsMode),gw=s=>Boolean(s.agentMode),xc=(s,e)=>{s.forEach((t,r)=>{e.has(t)&&(s[r]=`--${t}`)})},Cc=s=>{let e=[];return Object.entries(s).forEach(([t,r])=>{r&&e.push(`--${t}`,r)}),e}});function ho(s=0){return go.default.duration(s).format("HH:mm:ss.SSS")}function Pc(s=0){return go.default.duration(s).asSeconds()}var go,Hd,qd=w(()=>{"use strict";go=S(require("dayjs")),Hd=S(require("dayjs/plugin/duration"));go.default.extend(Hd.default)});var Gs,Wr,Hs,zd,Vr,Kd=w(()=>{"use strict";ae();Gs=s=>!(!s||"fileName"in s),Wr=(s,e)=>{if(e===_.TESTIM_TVC)return!1;if(s){if(s.appMetadata&&"iOSSupportedTargetDevice"in s.appMetadata)return s.appMetadata.iOSSupportedTargetDevice==="virtual";if("fileName"in s)return s.fileName.endsWith(".app")}return!1},Hs=s=>{var e,t;return((e=s.projectData)==null?void 0:e.type)==="ios"||((t=s.projectData)==null?void 0:t.type)==="android"},zd=s=>s===_.TESTIM_TVC,Vr=(s,e)=>zd(e)||!s.flags.allowAppFromDeviceRuns.isEnabled()});function kc(s=4e3){let e=process.memoryUsage(),t=r=>Math.round(r/1024/1024*100)/100;return{isOverThreshold:t(e.rss)>s,rss:`${t(e.rss)} MB -> Resident Set Size - total memory allocated for the process execution`,heapTotal:`${t(e.heapTotal)} MB -> total size of the allocated heap`,heapUsed:`${t(e.heapUsed)} MB -> actual memory used during the execution`,external:`${t(e.external)} MB -> V8 external memory`}}var Jd=w(()=>{"use strict"});var J={};G(J,{OSS:()=>Gr,TESTIM_BROWSER_DIR:()=>Bt,buildBasicHeader:()=>Ga,calcPercentile:()=>To,copyDir:()=>$d,delay:()=>oe,doesPathExist:()=>ge,download:()=>Ut,downloadAndSave:()=>Je,extractElementId:()=>De,getArgsOnRemoteRunFailure:()=>uw,getBrowserInfo:()=>yw,getCdpAddressForHost:()=>yr,getCliLocation:()=>ht,getDuration:()=>ho,getDurationSec:()=>Pc,getEnginesVersion:()=>lw,getEnvironmentGitBranch:()=>hr,getLinksFromUnescapeHTML:()=>Ks,getLocalFileSizeInMB:()=>vc,getMemorySnapshot:()=>kc,getPlanType:()=>bo,getRunConfigByBrowserName:()=>qs,getRunnerVersion:()=>gt,getSource:()=>mo,getSourceAsBuffer:()=>wc,getSourcePath:()=>po,getTestUrl:()=>qe,getUniqBrowsers:()=>Ws,groupTestsByRetries:()=>Oc,guid:()=>se,hasTestPlanFlag:()=>Vs,isAgentMode:()=>gw,isAppFromDevice:()=>Gs,isAppFromDeviceDisabled:()=>Vr,isCreatePrefetchedDataMode:()=>mw,isInstallLazyDepsMode:()=>fw,isLoginMode:()=>pw,isMobileProject:()=>Hs,isPromise:()=>lc,isQuarantineAndNotRemoteRun:()=>Xe,isRemoteRun:()=>Vd,isTestimVirtualGrid:()=>zd,isTunnelOnlyMode:()=>dw,isURL:()=>_e,promiseAbort:()=>uc,promiseFromCallback:()=>Xt,promiseMap:()=>ie,promiseTimeout:()=>ce,removePropertyFromObject:()=>yo,replaceArgsWithNoDashes:()=>xc,shouldBlockVirtualIosBuild:()=>Wr,spreadObjectToArgs:()=>Cc,unescapeHTML:()=>zs,unzipFile:()=>st});function yw(s){return s=s.toLowerCase(),_c.find(e=>e.browserValue===s)}function qs(s,e,t){s=s==null?void 0:s.toLowerCase();let r=_c.find(o=>o.browserName.toLowerCase()===s||s.includes(o.synonyms))||_c[0],n=Gr.find(o=>o.osName==="Windows 10");return e&&(e.platform?n=Gr.find(o=>o.sl.platform===e.platform):e.platformName&&(n=Gr.find(o=>o.sl.platformName===e.platformName))),t&&(t.os_version?n=Gr.find(o=>o.bs.os_version===t.os_version):t.platform&&(n=Gr.find(o=>o.bs.platform===t.platform))),Hr.merge(r,n)}function hr(){return process.env.GIT_BRANCH||process.env.CIRCLE_BRANCH||process.env.TRAVIS_BRANCH||process.env.CI_BRANCH}function yo(s,e,t){for(let r in s)Object.hasOwn(s,r)&&(t(r,e)?delete s[r]:typeof s[r]=="object"&&yo(s[r],e,t))}function De(s){return s.ELEMENT||s[Kt]}function bo(s){s||={};let e=Date.now(),t=s.expireAt||s.expireAT;return s.plan!=="free"?"pro":t?t<e?"free":"trial":"free"}function Oc(s=[]){return Hr.chain(s).groupBy(e=>e.originalTestResultId||e.resultId).values().reduce((e,t)=>{if(!t)return e;if(t.length===1)return e.push(t[0]),e;let r=t.slice().sort((o,i)=>{let a=typeof o.retryCount=="number"?o.retryCount:1,l=typeof i.retryCount=="number"?i.retryCount:1;return a===l?o.startTime-i.startTime:(o.retryCount??0)-(i.retryCount??0)}),n=Hr.cloneDeep(r.at(-1));return n&&(n.retryTestResults=r,e.push(n)),e},[]).compact().value()}function zs(s){return Zd.parseFromString(`<html><body>${s}</body></html>`,"text/html").documentElement.textContent}function Ks(s){return[...Zd.parseFromString(`<html><body>${s}</body></html>`,"text/html").getElementsByTagName("a")].map(t=>t.href).filter(Boolean)}async function yr(s,e){let t=await Promise.resolve().then(()=>(Ge(),Ke));try{return(await t.get(`http://${s}/json/version`,void 0,void 0,e)).webSocketDebuggerUrl}catch{throw new Error("unable to connect to devtools server")}}var Yd,Hr,Xd,Qd,hw,Bt,Gr,_c,To,Zd,F=w(()=>{"use strict";Yd=S(require("os")),Hr=S(require("lodash")),Xd=S(require("path")),Qd=require("linkedom");Mr();Wd();Gd();qd();Ha();pc();Kd();Jd();hw=Yd.homedir(),Bt=Xd.join(hw,".testim-browser-profile"),Gr=[{osName:"Linux",bs:{os:"LINUX"},sl:{platform:"Linux"}},{osName:"Windows 11",bs:{os:"WINDOWS",os_version:"11"},sl:{platform:"Windows 11"}},{osName:"Windows 10",bs:{os:"WINDOWS",os_version:"10"},sl:{platform:"Windows 10"}},{osName:"Windows 8",bs:{os:"WINDOWS",os_version:"8"},sl:{platform:"Windows 8"}},{osName:"Windows 8.1",bs:{os:"WINDOWS",os_version:"8.1"},sl:{platform:"Windows 8.1"}},{osName:"Windows 7",bs:{os:"WINDOWS",os_version:"7"},sl:{platform:"Windows 7"}},{osName:"Windows XP",bs:{os:"WINDOWS",os_version:"XP"},sl:{platform:"Windows XP"}},{osName:"macOS Sonoma",bs:{os:"OS X",os_version:"Sonoma",safari_version:"17"},sl:{}},{osName:"macOS Ventura",bs:{os:"OS X",os_version:"Ventura",safari_version:"16.5"},sl:{platform:"macOS 13",safari_version:"latest"}},{osName:"macOS Monterey",bs:{os:"OS X",os_version:"Monterey",safari_version:"15.6"},sl:{platform:"macOS 12",safari_version:"latest"}},{osName:"macOS Big Sur",bs:{os:"OS X",os_version:"Big Sur",safari_version:"14.1"},sl:{platform:"macOS 11",safari_version:"latest"}},{osName:"macOS Catalina",bs:{os:"OS X",os_version:"Catalina",safari_version:"13.1"},sl:{platform:"macOS 10.15",safari_version:"latest"}},{osName:"macOS Mojave",bs:{os:"OS X",os_version:"Mojave",safari_version:"12.1"},sl:{platform:"macOS 10.14",safari_version:"latest"}},{osName:"macOS High Sierra",bs:{os:"OS X",os_version:"High Sierra",safari_version:"11.1"},sl:{platform:"macOS 10.13",safari_version:"latest"}},{osName:"macOS Sierra",bs:{os:"OS X",os_version:"Sierra",safari_version:"10.1"},sl:{platform:"macOS 10.12",safari_version:"latest"}},{osName:"OS X El Capitan",bs:{os:"OS X",os_version:"El Capitan",safari_version:"9.1"},sl:{platform:"OS X 10.11",safari_version:"latest"}},{osName:"OS X Yosemite",bs:{os:"OS X",os_version:"Yosemite",safari_version:"8"},sl:{platform:"OS X 10.10",safari_version:"latest"}},{osName:"OS X Mavericks",bs:{os:"OS X",os_version:"Mavericks",safari_version:"7.1"},sl:{platform:"OS X 10.9",safari_version:"latest"}},{osName:"OS X Mountain Lion",bs:{os:"OS X",os_version:"Mountain Lion",safari_version:"6.2"},sl:{platform:"OS X 10.8",safari_version:"latest"}},{osName:"OS X Lion",bs:{os:"OS X",os_version:"Lion",safari_version:"6"},sl:{}},{osName:"OS X Snow Leopard",bs:{os:"OS X",os_version:"Snow Leopard",safari_version:"5.1"},sl:{}},{osName:"iOS",bs:{platform:"MAC"},sl:{platformName:"iOS",appiumVersion:"1.6.4"}},{osName:"Android",bs:{platform:"ANDROID"},sl:{platformName:"Android",appiumVersion:"1.6.4"}}],_c=[{browserName:"Chrome",bs:{browser:"Chrome",browser_version:"112"},sl:{browserName:"chrome",version:"94.0"},browserValue:"chrome"},{browserName:"Firefox",bs:{browser:"Firefox",browser_version:"89"},sl:{browserName:"firefox",version:"89.0"},browserValue:"firefox"},{browserName:"Safari",bs:{browser:"Safari"},sl:{browserName:"safari"},browserValue:"safari"},{browserName:"Edge Chromium",bs:{browser:"Edge",browser_version:"112"},sl:{browserName:"MicrosoftEdge",version:"94"},synonyms:["edge-chromium"],browserValue:"edge-chromium",seleniumName:"MicrosoftEdge"},{browserName:"Browser",bs:{},sl:{browserName:"Browser"},browserValue:"browser"},{browserName:"Android",bs:{browserName:"android"},sl:{},browserValue:"android"},{browserName:"iPad",bs:{browserName:"iPad"},sl:{},browserValue:"ipad"},{browserName:"iPhone",bs:{browserName:"iPhone"},sl:{},browserValue:"iphone"}];To=(s,e)=>{if(s.length===0)return 0;if(typeof e!="number")throw new TypeError("p must be a number");if(s=[...s].sort((r,n)=>r-n),e<=0)return s[0];if(e>=100)return s.at(-1);let t=Math.ceil(s.length*(e/100))-1;return s[t]};Zd=new Qd.DOMParser});var Lc={};G(Lc,{$schema:()=>bw,default:()=>Ew,definitions:()=>Tw,properties:()=>Sw,required:()=>vw,type:()=>ww});var bw,Tw,ww,vw,Sw,Ew,em=w(()=>{bw="http://json-schema.org/draft-07/schema#",Tw={request:{type:"object",required:["url"],additionalProperties:!1,properties:{url:{type:"string"},method:{type:"string",pattern:"^GET$|^HEAD$|^POST$|^PUT$|^DELETE$|^CONNECT$|^OPTIONS$|^TRACE$|^PATCH$"}}},header:{type:"object",required:["name","value"],additionalProperties:!1,properties:{name:{type:"string"},value:{type:"string"}}},cookie:{type:"object",required:["name","value"],additionalProperties:!1,properties:{name:{type:"string"},value:{type:"string"},path:{type:"string"},domain:{type:"string"},expires:{type:"string",format:"date-time"},httpOnly:{type:"boolean"},secure:{type:"boolean"}}},response:{type:"object",required:["status"],additionalProperties:!1,properties:{status:{type:"integer",minimum:100,exclusiveMaximum:600},headers:{type:"array",items:{$ref:"#/definitions/header"}},cookies:{type:"array",items:{$ref:"#/definitions/cookie"}},content:{type:"object",required:["text"],additionalProperties:!1,properties:{text:{type:"string"}}}}},redirectResponse:{type:"object",required:["redirectUrl"],additionalProperties:!1,properties:{redirectUrl:{type:"string"}}},passthroughResponse:{type:"object",required:["passthrough"],additionalProperties:!1,properties:{passthrough:{type:"boolean",enum:[!0]}}},entry:{type:"object",required:["request","response"],additionalProperties:!1,properties:{request:{$ref:"#/definitions/request"},response:{oneOf:[{$ref:"#/definitions/response"},{$ref:"#/definitions/redirectResponse"},{$ref:"#/definitions/passthroughResponse"}]},maxHits:{type:"integer",minimum:1}}}},ww="object",vw=["entries"],Sw={version:{type:"string",enum:["1.2","1.2.0"]},creator:{type:"string"},entries:{type:"array",items:{$ref:"#/definitions/entry"}}},Ew={$schema:bw,definitions:Tw,type:ww,required:vw,properties:Sw}});async function am(){try{return await ce(wo.promises.readFile(Io()).then(async s=>{let e=await im;return Aw(e,s)}),3e4)}catch{return{}}}function Aw(s,e){let t=e.slice(0,16),r=e.slice(16),n=Buffer.from(s),o=zr.createDecipheriv("aes-256-cbc",Buffer.concat([n,Buffer.alloc(32)],32),t),i=o.update(r);return JSON.parse(Buffer.concat([i,o.final()]))}function bt(s,e,t=Iw,r=void 0){return async()=>{if(!sm)return await s();let n=e;r&&(e+=JSON.stringify(r));let o=await xw(e);if(o)return Js.debug("cache hit:",{fnName:e}),o;if(Js.debug("cache miss:",{fnName:e}),!nm)throw new Error(`Attempted to rebuild cache for ${n}. cache miss is not allowed with current run configuration`);let i=await s();return i&&await Cw(e,i,t),i}}async function xw(s){let t=(await Ro)[s];if(!t)return;let{value:r,expiry:n}=t;if(!(n<Date.now())&&r)return r}async function Cw(s,e,t){if(Dc)throw Js.error("calling set after waitForSave is not allowed",{key:s,ttl:t}),new Error("calling set after waitForSave is not allowed");try{let r=await Ro;r[s]={value:e,expiry:Date.now()+t},om=new Promise(n=>{Eo=n}),Rw(r)}catch{Js.error("failed updating cache")}}async function Kr(){let s=await Ro;Object.keys(s).forEach(e=>{delete s[e]})}function cm(s){sm=s}function Pw(s=!0){nm=s}async function lm(){try{return Dc=!0,await om}finally{Dc=!1}}function um(s){So=s,Ro=am()}var wo,vo,zr,tm,Js,So,rm,Eo,sm,nm,Dc,om,im,Iw,Io,Ro,Rw,pm,dm,tA,mm,jt=w(()=>{"use strict";wo=S(require("fs")),vo=S(require("path")),zr=S(require("crypto"));F();tm=require("lodash");j();Js=C("local cache"),So=vo.resolve(ht(),"testim-cache"),sm=!0,nm=!0,Dc=!1,om=new Promise(s=>{Eo=s}),im=new Promise(s=>{rm=s}),Iw=1e3*60*60*3,Io=()=>vo.resolve(vo.resolve(So,"testim.cache"));Ro=am(),Rw=(0,tm.debounce)(async s=>{let e;try{let t=await im,r=zr.randomBytes(16),n=JSON.stringify(s),o=Buffer.from(t),i=zr.createCipheriv("aes-256-cbc",Buffer.concat([o,Buffer.alloc(32)],32),r),a=Buffer.concat([r,i.update(n),i.final()]);await ge(So)||await wo.promises.mkdir(So,{recursive:!0}),await wo.promises.writeFile(Io(),a)}catch(t){Js.error("failed saving cache",{err:t}),e=t}Eo(e?{success:!1,error:e}:{success:!0})},200);pm=rm,dm=cm.bind(void 0,!1),tA=cm.bind(void 0,!0),mm=()=>Pw(!1)});function Ao(){return{cliLocation:ht(),userInfo:Jr.userInfo(),platform:Jr.platform(),release:Jr.release()}}var Jr,Mc=w(()=>{"use strict";Jr=S(require("os"));F()});function kw(s){try{return xo.resolve(xo.dirname(require.resolve(`${s}/package.json`)),require(`${s}/package.json`).main||"")}catch(e){if(e.code==="ERR_PACKAGE_PATH_NOT_EXPORTED")return require.resolve(s);throw e}}function Zt(s){let e=kw(s);return require(e)}var xo,Ys=w(()=>{"use strict";xo=S(require("path"))});function _w(s){let t=/EACCES[^']+'(.+)'/.exec(s);return t===null?!1:t[1]}function Ow(s){return/The "to" argument must be of type string./.exec(s)}function ym(s,e,t){let r=_w(s),n=Ow(s);return r||n?(hm.info("Failed to install package due to insufficient write access",{...Ao(),package:t,path:r}),console.error(`
|
|
3
|
+
${c.msg}`));for(let u of WT)a[u]instanceof Error&&(c[u]={message:a[u].message,stack:a[u].stack,name:a[u].name,type:a[u].type,cause:a[u].cause,...a[u]});Object.keys(c).length>0&&(i&&!m&&(c.msg=i),d.text=c),this.logger.addLog(d),r(null,!0)}waitForFlush(){return this.logger.waitForFlush()}static configure(t){Re.CoralogixLogger.configure(t),Ur.options=t}}});var cc={};G(cc,{getLogger:()=>C,sessionPlayerLoggerFormatter:()=>nc,setExecutionId:()=>oc,setProjectId:()=>ic,setProxyUri:()=>ac});function HT(){let s=[],e=()=>Promise.resolve();if(!Oe){let{CoralogixTransport:t}=(tc(),be(ec));t.configure(Pd);let r=new t({category:"ROOT"});s.push(r),e=()=>r.waitForFlush()}if(ad){let t={depth:5,colors:!0};s.push(new ft.transports.Console({format:ft.format.combine(ft.format.colorize({all:!0,colors:{info:"blue",error:"red",warning:"yellow"}}),ft.format.timestamp({format:"HH:mm:ss:SSS"}),ft.format.printf(r=>`[${r.timestamp}] ${r.level} ${r.category}: ${r.message} ${io.inspect(r.meta,t)}`))}))}return[s,e]}function oc(s){rc=s}function ic(s){kd=s}function ac(s){if(Oe||!s)return;let{CoralogixTransport:e}=(tc(),be(ec));e.configure({...Pd,proxyUri:s})}function Ad(s){return{projectId:kd,time:new Date().toISOString(),...rc&&!s&&{executionId:rc}}}function C(s){return new sc(YT.child({category:s}))}var xd,ft,io,oo,Cd,VT,GT,Pd,Rd,nc,qT,zT,KT,JT,YT,rc,kd,sc,j=w(()=>{"use strict";xd=S(require("os")),ft=S(require("winston"));ue();io=S(require("util")),oo=S(require("chalk")),Cd=S(require("dayjs"));F();VT=xd.hostname(),GT=gt(),Pd={privateKey:"d0eb01da-f966-1663-63c6-8871225d7c39",applicationName:"testim",subsystemName:"runner"};Rd={depth:5,colors:!0},nc=(s,e,t)=>{let r=`[${(0,Cd.default)().format("HH:mm:ss:SSS")}]`,n=io.inspect(e,Rd),o=io.inspect(t,Rd);return`${oo.default.white(r)} ${oo.default.reset()}SessionPlayer-${oo.default.red(s)} ${n} ${o}`},[qT,zT]=HT(),KT=cd?"debug":"info",JT={release:Boolean(!0),branch:"production"},YT=ft.createLogger({levels:ft.config.syslog.levels,level:KT,transports:qT,defaultMeta:{name:"runner",hostname:VT,nodeVersion:process.version,runnerVersion:GT,...JT}}),rc=null,kd=null;sc=class{constructor(e){this._logger=e;this.debug=this.debug.bind(this),this.info=this.info.bind(this),this.warn=this.warn.bind(this),this.error=this.error.bind(this),this.fatal=this.fatal.bind(this)}debug(e,t={}){this.innerLog("debug",e,t)}info(e,t={}){this.innerLog("info",e,t)}warn(e,t={}){this.innerLog("warning",e,t)}error(e,t={}){this.innerLog("error",e,t)}fatal(e,t={}){this.innerLog("crit",e,t)}innerLog(e,t,r={}){let{executionId:n}=r;try{this._logger.log(e,{meta:r,message:t,...Ad(n)})}catch(o){try{this._logger.log("crit",{message:`failed to log message ${o.message}, ${o.stack}`,...Ad(n)})}catch{}}}waitForFlush(){return zT()}}});var uo,Fr,P,Jt,fr,Rt,ao,Br,ne,Ls,ze,Yt,At,co,jr,lo,Ds,K=w(()=>{"use strict";uo=require("p-retry"),Fr=class extends Error{constructor(){super(...arguments);this.name="NoArgsError"}},P=class extends Error{constructor(){super(...arguments);this.name="ArgError"}},Jt=class extends Error{constructor(){super(...arguments);this.name="StopRunOnError"}},fr=class extends Error{constructor(t,r){super(t);this.type=r}},Rt=class extends uo.AbortError{},ao=class extends uo.AbortError{},Br=class extends uo.AbortError{},ne=class extends Error{},Ls=class extends Error{},ze=class extends Error{constructor(){super(...arguments);this.name="GridError"}toString(){return this.message}},Yt=class extends ze{constructor(){super(...arguments);this.name="GridConcurrencyError"}},At=class extends Error{constructor(){super(...arguments);this.name="NpmPackageError"}},co=class extends Error{constructor(){super(...arguments);this.message="selenium driver crashed";this.name="SeleniumCrashError"}},jr=class extends Error{constructor(t){super(`Testim had missing write access to ${t}`);this.path=t}},lo=class extends Error{constructor(e){super(`Package for CLI action need to have a CommonJS export which the package ${e} does not have`)}},Ds=class extends Error{constructor(e=!1){let t="not implemented";e&&(t="should be implemented on descendant"),super(t)}}});function lc(s){return!!s&&(typeof s=="object"||typeof s=="function")&&typeof s.then=="function"&&typeof s.catch=="function"}function oe(s){return(0,Ld.setTimeout)(s)}function uc(s,e){let t=new Promise((r,n)=>{e.onabort=()=>{n(e.reason)}});return Promise.race([s,t])}function ce(s,e,t="Timeout Error"){ro&&!_d&&(_d=!0,console.log("Debugger connected - timeouts were overridden to 10 minutes to improve debugging"));let r=new ne(t);return e=ro?Number(ro)||6e5:e,Promise.race([s,oe(e).then(()=>{throw r})])}async function ie(s,e,{concurrency:t}={}){if(t){Od||=(await import("p-limit")).default;let r=Od(t);return await Promise.all(Array.from(s,(n,o)=>r(()=>e(n,o))))}return await Promise.all(Array.from(s,e))}function Xt(s){return new Promise((e,t)=>{s((r,n)=>r?t(r):e(n))})}var Ld,_d,Od,pc=w(()=>{"use strict";Ld=require("timers/promises");K();ue();_d=!1});var Ns,Dd,XT,Ms,Md,QT,ZT,Nd,Ud=w(()=>{"use strict";Ns=S(require("lodash"));ue();Dd=require("dns");j();pc();XT=C("http-request-counters"),Ms=!1,Md=async()=>{if(Oe)return!0;let s=["www.google.com","www.facebook.com","www.microsoft.com","testim.io"];try{let e=Boolean(await ie(s,t=>Dd.promises.lookup(t)));return e||(Ms=!0),e}catch{return XT.error("network connectivity test failed"),Ms=!0,!1}},QT=Ns.throttle(Md,10*1e3),ZT=60*1e3*15,Nd=()=>{let s={call:new Map,success:new Map,fail:new Map};function e(n,o){let i=n.get(o)||0;n.set(o,i+1),setTimeout(()=>{let a=n.get(o)||1;n.set(o,a-1)},ZT)}function t(n,o=n.name){return async function(...i){e(s.call,o);try{let a=await n.call(null,...i);return e(s.success,o),a}catch(a){throw e(s.fail,o),Ms||QT(),a}}}async function r(){if(Ms||!await Md())return!1;let n=Ns.sum([...s.fail.values()]),o=Ns.sum([...s.call.values()]);return n<o*.1}return r.counters=s,t.counters=s,t.isNetworkHealthy=r,t.didNetworkConnectivityTestFail=()=>Ms,t}});var Ke={};G(Ke,{deleteFullRes:()=>nw,deleteReq:()=>Us,didNetworkConnectivityTestFail:()=>Tc,download:()=>yc,get:()=>Te,getFullRes:()=>iw,getText:()=>Bs,head:()=>aw,isNetworkHealthy:()=>bc,post:()=>Ve,postForm:()=>Fs,postFullRes:()=>ow,postText:()=>gc,put:()=>hc});function tw(){return global.caFileContent}function rw(s,e){let t=[];s.on("data",r=>{t.push(r)}),s.on("end",()=>{e(null,Buffer.concat(t))})}function sw(){return!xt.default.Request.prototype.proxy&&global.SuperagentProxy&&global.SuperagentProxy(xt.default),global.proxyUri}function gr(s,e=!1){let t=tw();t&&s.ca(t);let r=!e&&sw();r&&s.proxy(r)}async function Fd(s,e={},t={},r=$r){let n=xt.default.delete(s).send(e).timeout(r).set(t);return gr(n),await n}async function mc(s,e,t={},r=$r,n=0){let o=xt.default.post(s).send(e).timeout(r).set(t);gr(o),n&&o.retry(n);try{return await o}catch(i){throw i.url=s,i.originalRequestTimeout=r,i.additionalSetHeaders=t,i}}async function fc(s,e,t={},r=$r,{isBinary:n=!1,skipProxy:o=!1}={}){let i=xt.default.get(s).query(e||{}).timeout(r).set(t);return n&&i.buffer(!0),gr(i,o),await i}var xt,dc,We,$r,ew,Mt,Us,nw,Ve,ow,Fs,Bs,gc,Te,iw,aw,hc,yc,bc,Tc,Ge=w(()=>{"use strict";xt=S(require("superagent"));j();Ud();dc=C("http-request"),We=Nd(),$r=parseInt(process.env.DEFAULT_REQUEST_TIMEOUT||"0",10)||3e4,ew=6e4;Mt=(s,e,t)=>{throw dc.error(s,{...t,error:e}),e};Us=We(async(s,e,t,r)=>{try{let n=await Fd(s,e,t,r);return n.type==="text/plain"?n.text:n.body}catch(n){return Mt("failed to delete request",n,{url:s})}});nw=We(Fd),Ve=We(async({url:s,body:e,headers:t,timeout:r,retry:n})=>{try{let o=await mc(s,e,t,r,n);return o.type==="text/plain"?o.text:o.body}catch(o){return Mt("failed to post request",o,{url:s})}});ow=We(mc),Fs=We(async(s,e,t,r={},n=$r)=>{let o=xt.default.post(s).type("form").timeout(n).set(r);o.field(e),Object.entries(t).forEach(([i,a])=>{o.attach(i,a.buffer,a.fileName)}),gr(o);try{let i=await o;return i.type==="text/plain"?i.text:i.body}catch(i){return Mt("failed to post request",i,{url:s})}});Bs=We(async(s,e,t)=>{try{return(await fc(s,e,t)).text}catch(r){return Mt("failed to getText request",r,{url:s,query:e})}}),gc=We(async({url:s,body:e,headers:t,timeout:r,retry:n})=>{try{return(await mc(s,e,t,r,n)).text}catch(o){return Mt("failed to post request",o,{url:s})}}),Te=We(async(s,e,t,r,n)=>{try{return(await fc(s,e,t,r,n)).body}catch(o){return Mt("failed to get request",o,{url:s,query:e})}}),iw=We((s,e,t,r)=>fc(s,e,t,r)),aw=We(async s=>{let e=xt.default.head(s).timeout($r);gr(e);try{return await e}catch(t){return Mt("failed to head request",t,{url:s})}}),hc=We(async(s,e,t={},r=$r)=>{let n=xt.default.put(s).send(e).timeout(r).set(t);gr(n);try{return(await n).body}catch(o){return Mt("failed to put request",o,{url:s})}}),yc=We(async s=>{dc.info("start to download",{url:s});let e=xt.default.get(s).timeout(ew).buffer(!0).parse(rw);gr(e);try{let t=await e;return dc.info("finished to download",{url:s}),t}catch(t){return Mt("failed to download",t,{url:s})}}),bc=We.isNetworkHealthy,Tc=We.didNetworkConnectivityTestFail});function ht(){let s;return require.main?(require.main.filename.includes("/src")||require.main.filename.includes("\\src")?s=Nt.resolve(__dirname,"../../"):s=Nt.resolve(__dirname,""),s):process.cwd()}function po(s,e){return _e(s)?e||Nt.join(process.cwd(),s.replace(/^.*[\\/]/,"")):e||Nt.basename(s)}function gt(){try{return require(`${__dirname}/package.json`).version}catch{return""}}function lw(){try{return td.node}catch{return""}}async function $d(s,e,t=!0){let r=await rt.promises.readdir(s,{withFileTypes:!0});await rt.promises.mkdir(e,{recursive:t});for(let n of r){let o=Nt.join(s,n.name),i=Nt.join(e,n.name);n.isDirectory()?await $d(o,i):await rt.promises.copyFile(o,i)}}async function ge(s){try{return await rt.promises.access(s),!0}catch(e){if(e.code==="ENOENT")return!1;throw e}}var Nt,Bd,jd,rt,cw,Ut,Je,mo,wc,st,vc,Wd=w(()=>{"use strict";Nt=S(require("path"));Ha();to();Bd=S(require("unzip-stream")),jd=S(require("p-retry")),rt=require("fs"),cw=3;Ut=async s=>{let e=await Promise.resolve().then(()=>(Ge(),Ke));return(0,jd.default)(()=>e.download(s),{retries:cw,factor:1})},Je=async(s,e)=>{let t=await Ut(s);return rt.promises.writeFile(e,t.body)};mo=async(s,e)=>{let t=po(s,e);return _e(s)?Je(s,t):rt.promises.copyFile(s,t)},wc=async s=>_e(s)?Ut(s):rt.promises.readFile(s),st=async(s,e)=>await(0,rt.createReadStream)(s).pipe(Bd.Extract({path:e})),vc=s=>(0,rt.statSync)(s).size/1e6});var Ft={};G(Ft,{APPIUM_SESSION_MESSAGE:()=>Ac,CLI_MODE:()=>ee,MOBILE_APP_SOURCE:()=>fo,MOBILE_RUN_SKIP_REASON:()=>Rc,gridMessages:()=>yt,gridTypes:()=>_,mobileWeb:()=>Ec,runnerStatus:()=>Sc,runnerTestStatus:()=>de,socketEventTypes:()=>Ct,stepResult:()=>$s,test:()=>Ic,testRunStatus:()=>js,testStatus:()=>Ye,timeoutMessages:()=>Ue});var Ue,js,Sc,de,Ye,yt,Ec,Ic,Ct,ee,_,$s,fo,Rc,Ac,ae=w(()=>{"use strict";Ue={GET_BROWSER_TIMEOUT_MSG:"get-browser-timeout",TEST_START_TIMEOUT_MSG:"test-start-timeout",TEST_COMPLETE_TIMEOUT_MSG:"test-complete-timeout"},js={COMPLETED:"completed"},Sc={RUNNING:"RUNNING",SKIPPED:"SKIPPED",FINISHED:"FINISHED",ABORTED:"ABORTED",QUEUED:"QUEUED",TIMEOUT:"TIMEOUT"},de={PASSED:"PASSED",FAILED:"FAILED",ABORTED:"ABORTED",SKIPPED:"SKIPPED",QUEUED:"QUEUED",PENDING:"PENDING"},Ye={DRAFT:"draft",EVALUATING:"evaluating",ACTIVE:"active",QUARANTINE:"quarantine"},yt={NOT_FOUND:"The specified grid is not available",UNKNOWN:"Test couldn't get browser - unknown error"},Ec={MOBILE_WEB_REMOTE_RUN_HEADER_SPACING:50},Ic={HIDDEN_PARAM:"TST_HIDDEN_PARAM"},Ct={TEST_RESULT_CREATED:"test-result-created",TEST_RESULT_UPDATED:"test-result-updated",REMOTE_STEP_SAVED:"remote-step-saved"},ee={EXTENSION:"extension",SELENIUM:"selenium",APPIUM:"appium"},_={TESTIM_ENTERPRISE:"testimEnterprise",TESTIM:"testim",LAMBDATEST:"testimLambdaTest",DEVICE_FARM:"testimDF",HYBRID:"testimHybrid",BROWSERSTACK:"browserstack",SAUCELABS:"saucelabs",TESTIM_HEADSPIN:"testimHeadspin",TESTIM_TDC:"testimTDC",TESTIM_TVC:"testimTVC",P_CLOUDY:"pcloudy"},$s={SETUP_TIMEOUT:"setup-timeout",NETWORK_ERROR:"network-error",GRID_ERROR:"grid-error",SELENIUM_ERROR:"selenium-error",BROWSER_CLOSED:"browser-closed",MOBILE_SESSION_ERROR:"mobile-session-error",UNKNOWN_ERROR:"unknown-error"},fo={FROM_LIBRARY:"from-library",FROM_DEVICE:"from-device"},Rc={APP_FROM_DEVICE:"app-from-device",VIRTUAL_BUILD:"virtual-build"},Ac={APP_NOT_EXIST_ON_DEVICE:"used to start the app doesn't exist or cannot be launched",APP_NEVER_STARTED:"never started",DEVICE_OS_VERSION_TOO_LOW:"DeviceOSVersionTooLow",TIMEOUT_ERROR:"Timeout awaiting 'request'",SAUCELABS_APP_IS_NOT_INSTALLED:"Original error: 'app' option is required for reinstall"}});function Ws(s,e){var t,r,n;return((t=s.testConfigNames)!=null&&t.length||(r=s.testConfigIds)!=null&&r.length||s.testPlan.length||s.testPlanIds.length)&&!s.browser?[...new Set(e.map(o=>{var i;return(i=o.runConfig)==null?void 0:i.browserValue}))]:[(n=s.browser)==null?void 0:n.toLowerCase()]}function uw(){let{argv:s}=process;if(s.includes("--remoteRunId"))return{remoteRunId:s[s.indexOf("--remoteRunId")+1],projectId:s[s.indexOf("--project")+1],token:s[s.indexOf("--token")+1]}}var Vs,Vd,Xe,pw,dw,mw,fw,gw,xc,Cc,Gd=w(()=>{"use strict";ae();Vs=s=>{var e,t;return Boolean(((e=s.testPlan)==null?void 0:e.length)||((t=s.testPlanIds)==null?void 0:t.length))},Vd=s=>Boolean(s.resultId&&s.source==="remote-run"),Xe=(s,e)=>s.testStatus===Ye.QUARANTINE&&!Vd(e)&&!e.runQuarantinedTests;pw=s=>Boolean(s.loginMode),dw=s=>Boolean(s.tunnelOnlyMode),mw=s=>Boolean(s.createPrefechedData),fw=s=>Boolean(s.installLazyDepsMode),gw=s=>Boolean(s.agentMode),xc=(s,e)=>{s.forEach((t,r)=>{e.has(t)&&(s[r]=`--${t}`)})},Cc=s=>{let e=[];return Object.entries(s).forEach(([t,r])=>{r&&e.push(`--${t}`,r)}),e}});function ho(s=0){return go.default.duration(s).format("HH:mm:ss.SSS")}function Pc(s=0){return go.default.duration(s).asSeconds()}var go,Hd,qd=w(()=>{"use strict";go=S(require("dayjs")),Hd=S(require("dayjs/plugin/duration"));go.default.extend(Hd.default)});var Gs,Wr,Hs,zd,Vr,Kd=w(()=>{"use strict";ae();Gs=s=>!(!s||"fileName"in s),Wr=(s,e)=>{if(e===_.TESTIM_TVC)return!1;if(s){if(s.appMetadata&&"iOSSupportedTargetDevice"in s.appMetadata)return s.appMetadata.iOSSupportedTargetDevice==="virtual";if("fileName"in s)return s.fileName.endsWith(".app")}return!1},Hs=s=>{var e,t;return((e=s.projectData)==null?void 0:e.type)==="ios"||((t=s.projectData)==null?void 0:t.type)==="android"},zd=s=>s===_.TESTIM_TVC,Vr=(s,e)=>zd(e)||!s.flags.allowAppFromDeviceRuns.isEnabled()});function kc(s=4e3){let e=process.memoryUsage(),t=r=>Math.round(r/1024/1024*100)/100;return{isOverThreshold:t(e.rss)>s,rss:`${t(e.rss)} MB -> Resident Set Size - total memory allocated for the process execution`,heapTotal:`${t(e.heapTotal)} MB -> total size of the allocated heap`,heapUsed:`${t(e.heapUsed)} MB -> actual memory used during the execution`,external:`${t(e.external)} MB -> V8 external memory`}}var Jd=w(()=>{"use strict"});var J={};G(J,{OSS:()=>Gr,TESTIM_BROWSER_DIR:()=>Bt,buildBasicHeader:()=>Ga,calcPercentile:()=>To,copyDir:()=>$d,delay:()=>oe,doesPathExist:()=>ge,download:()=>Ut,downloadAndSave:()=>Je,extractElementId:()=>De,getArgsOnRemoteRunFailure:()=>uw,getBrowserInfo:()=>yw,getCdpAddressForHost:()=>yr,getCliLocation:()=>ht,getDuration:()=>ho,getDurationSec:()=>Pc,getEnginesVersion:()=>lw,getEnvironmentGitBranch:()=>hr,getLinksFromUnescapeHTML:()=>Ks,getLocalFileSizeInMB:()=>vc,getMemorySnapshot:()=>kc,getPlanType:()=>bo,getRunConfigByBrowserName:()=>qs,getRunnerVersion:()=>gt,getSource:()=>mo,getSourceAsBuffer:()=>wc,getSourcePath:()=>po,getTestUrl:()=>qe,getUniqBrowsers:()=>Ws,groupTestsByRetries:()=>Oc,guid:()=>se,hasTestPlanFlag:()=>Vs,isAgentMode:()=>gw,isAppFromDevice:()=>Gs,isAppFromDeviceDisabled:()=>Vr,isCreatePrefetchedDataMode:()=>mw,isInstallLazyDepsMode:()=>fw,isLoginMode:()=>pw,isMobileProject:()=>Hs,isPromise:()=>lc,isQuarantineAndNotRemoteRun:()=>Xe,isRemoteRun:()=>Vd,isTestimVirtualGrid:()=>zd,isTunnelOnlyMode:()=>dw,isURL:()=>_e,promiseAbort:()=>uc,promiseFromCallback:()=>Xt,promiseMap:()=>ie,promiseTimeout:()=>ce,removePropertyFromObject:()=>yo,replaceArgsWithNoDashes:()=>xc,shouldBlockVirtualIosBuild:()=>Wr,spreadObjectToArgs:()=>Cc,unescapeHTML:()=>zs,unzipFile:()=>st});function yw(s){return s=s.toLowerCase(),_c.find(e=>e.browserValue===s)}function qs(s,e,t){s=s==null?void 0:s.toLowerCase();let r=_c.find(o=>o.browserName.toLowerCase()===s||s.includes(o.synonyms))||_c[0],n=Gr.find(o=>o.osName==="Windows 10");return e&&(e.platform?n=Gr.find(o=>o.sl.platform===e.platform):e.platformName&&(n=Gr.find(o=>o.sl.platformName===e.platformName))),t&&(t.os_version?n=Gr.find(o=>o.bs.os_version===t.os_version):t.platform&&(n=Gr.find(o=>o.bs.platform===t.platform))),Hr.merge(r,n)}function hr(){return process.env.GIT_BRANCH||process.env.CIRCLE_BRANCH||process.env.TRAVIS_BRANCH||process.env.CI_BRANCH}function yo(s,e,t){for(let r in s)Object.hasOwn(s,r)&&(t(r,e)?delete s[r]:typeof s[r]=="object"&&yo(s[r],e,t))}function De(s){return s.ELEMENT||s[Kt]}function bo(s){s||={};let e=Date.now(),t=s.expireAt||s.expireAT;return s.plan!=="free"?"pro":t?t<e?"free":"trial":"free"}function Oc(s=[]){return Hr.chain(s).groupBy(e=>e.originalTestResultId||e.resultId).values().reduce((e,t)=>{if(!t)return e;if(t.length===1)return e.push(t[0]),e;let r=t.slice().sort((o,i)=>{let a=typeof o.retryCount=="number"?o.retryCount:1,l=typeof i.retryCount=="number"?i.retryCount:1;return a===l?o.startTime-i.startTime:(o.retryCount??0)-(i.retryCount??0)}),n=Hr.cloneDeep(r.at(-1));return n&&(n.retryTestResults=r,e.push(n)),e},[]).compact().value()}function zs(s){return Zd.parseFromString(`<html><body>${s}</body></html>`,"text/html").documentElement.textContent}function Ks(s){return[...Zd.parseFromString(`<html><body>${s}</body></html>`,"text/html").getElementsByTagName("a")].map(t=>t.href).filter(Boolean)}async function yr(s,e){let t=await Promise.resolve().then(()=>(Ge(),Ke));try{return(await t.get(`http://${s}/json/version`,void 0,void 0,e)).webSocketDebuggerUrl}catch{throw new Error("unable to connect to devtools server")}}var Yd,Hr,Xd,Qd,hw,Bt,Gr,_c,To,Zd,F=w(()=>{"use strict";Yd=S(require("os")),Hr=S(require("lodash")),Xd=S(require("path")),Qd=require("linkedom");Mr();Wd();Gd();qd();Ha();pc();Kd();Jd();hw=Yd.homedir(),Bt=Xd.join(hw,".testim-browser-profile"),Gr=[{osName:"Linux",bs:{os:"LINUX"},sl:{platform:"Linux"},lt:{platform:"Linux"}},{osName:"Windows 11",bs:{os:"WINDOWS",os_version:"11"},sl:{platform:"Windows 11"},lt:{platform:"Windows 11"}},{osName:"Windows 10",bs:{os:"WINDOWS",os_version:"10"},sl:{platform:"Windows 10"},lt:{platform:"Windows 10"}},{osName:"Windows 8",bs:{os:"WINDOWS",os_version:"8"},sl:{platform:"Windows 8"}},{osName:"Windows 8.1",bs:{os:"WINDOWS",os_version:"8.1"},sl:{platform:"Windows 8.1"}},{osName:"Windows 7",bs:{os:"WINDOWS",os_version:"7"},sl:{platform:"Windows 7"}},{osName:"Windows XP",bs:{os:"WINDOWS",os_version:"XP"},sl:{platform:"Windows XP"}},{osName:"macOS Sonoma",bs:{os:"OS X",os_version:"Sonoma",safari_version:"17"},sl:{},lt:{platform:"macOS Sonoma",safari_version:"17"}},{osName:"macOS Ventura",bs:{os:"OS X",os_version:"Ventura",safari_version:"16.5"},sl:{platform:"macOS 13",safari_version:"latest"},lt:{platform:"macOS Ventura",safari_version:"16"}},{osName:"macOS Monterey",bs:{os:"OS X",os_version:"Monterey",safari_version:"15.6"},sl:{platform:"macOS 12",safari_version:"latest"},lt:{platform:"macOS Monterey",safari_version:"15"}},{osName:"macOS Big Sur",bs:{os:"OS X",os_version:"Big Sur",safari_version:"14.1"},sl:{platform:"macOS 11",safari_version:"latest"}},{osName:"macOS Catalina",bs:{os:"OS X",os_version:"Catalina",safari_version:"13.1"},sl:{platform:"macOS 10.15",safari_version:"latest"}},{osName:"macOS Mojave",bs:{os:"OS X",os_version:"Mojave",safari_version:"12.1"},sl:{platform:"macOS 10.14",safari_version:"latest"}},{osName:"macOS High Sierra",bs:{os:"OS X",os_version:"High Sierra",safari_version:"11.1"},sl:{platform:"macOS 10.13",safari_version:"latest"}},{osName:"macOS Sierra",bs:{os:"OS X",os_version:"Sierra",safari_version:"10.1"},sl:{platform:"macOS 10.12",safari_version:"latest"}},{osName:"OS X El Capitan",bs:{os:"OS X",os_version:"El Capitan",safari_version:"9.1"},sl:{platform:"OS X 10.11",safari_version:"latest"}},{osName:"OS X Yosemite",bs:{os:"OS X",os_version:"Yosemite",safari_version:"8"},sl:{platform:"OS X 10.10",safari_version:"latest"}},{osName:"OS X Mavericks",bs:{os:"OS X",os_version:"Mavericks",safari_version:"7.1"},sl:{platform:"OS X 10.9",safari_version:"latest"}},{osName:"OS X Mountain Lion",bs:{os:"OS X",os_version:"Mountain Lion",safari_version:"6.2"},sl:{platform:"OS X 10.8",safari_version:"latest"}},{osName:"OS X Lion",bs:{os:"OS X",os_version:"Lion",safari_version:"6"},sl:{}},{osName:"OS X Snow Leopard",bs:{os:"OS X",os_version:"Snow Leopard",safari_version:"5.1"},sl:{}},{osName:"iOS",bs:{platform:"MAC"},sl:{platformName:"iOS",appiumVersion:"1.6.4"}},{osName:"Android",bs:{platform:"ANDROID"},sl:{platformName:"Android",appiumVersion:"1.6.4"}}],_c=[{browserName:"Chrome",bs:{browser:"Chrome",browser_version:"112"},sl:{browserName:"chrome",version:"94.0"},browserValue:"chrome"},{browserName:"Firefox",bs:{browser:"Firefox",browser_version:"89"},sl:{browserName:"firefox",version:"89.0"},browserValue:"firefox"},{browserName:"Safari",bs:{browser:"Safari"},sl:{browserName:"safari"},browserValue:"safari"},{browserName:"Edge Chromium",bs:{browser:"Edge",browser_version:"112"},sl:{browserName:"MicrosoftEdge",version:"94"},synonyms:["edge-chromium"],browserValue:"edge-chromium",seleniumName:"MicrosoftEdge"},{browserName:"Browser",bs:{},sl:{browserName:"Browser"},browserValue:"browser"},{browserName:"Android",bs:{browserName:"android"},sl:{},browserValue:"android"},{browserName:"iPad",bs:{browserName:"iPad"},sl:{},browserValue:"ipad"},{browserName:"iPhone",bs:{browserName:"iPhone"},sl:{},browserValue:"iphone"}];To=(s,e)=>{if(s.length===0)return 0;if(typeof e!="number")throw new TypeError("p must be a number");if(s=[...s].sort((r,n)=>r-n),e<=0)return s[0];if(e>=100)return s.at(-1);let t=Math.ceil(s.length*(e/100))-1;return s[t]};Zd=new Qd.DOMParser});var Lc={};G(Lc,{$schema:()=>bw,default:()=>Ew,definitions:()=>Tw,properties:()=>Sw,required:()=>vw,type:()=>ww});var bw,Tw,ww,vw,Sw,Ew,em=w(()=>{bw="http://json-schema.org/draft-07/schema#",Tw={request:{type:"object",required:["url"],additionalProperties:!1,properties:{url:{type:"string"},method:{type:"string",pattern:"^GET$|^HEAD$|^POST$|^PUT$|^DELETE$|^CONNECT$|^OPTIONS$|^TRACE$|^PATCH$"}}},header:{type:"object",required:["name","value"],additionalProperties:!1,properties:{name:{type:"string"},value:{type:"string"}}},cookie:{type:"object",required:["name","value"],additionalProperties:!1,properties:{name:{type:"string"},value:{type:"string"},path:{type:"string"},domain:{type:"string"},expires:{type:"string",format:"date-time"},httpOnly:{type:"boolean"},secure:{type:"boolean"}}},response:{type:"object",required:["status"],additionalProperties:!1,properties:{status:{type:"integer",minimum:100,exclusiveMaximum:600},headers:{type:"array",items:{$ref:"#/definitions/header"}},cookies:{type:"array",items:{$ref:"#/definitions/cookie"}},content:{type:"object",required:["text"],additionalProperties:!1,properties:{text:{type:"string"}}}}},redirectResponse:{type:"object",required:["redirectUrl"],additionalProperties:!1,properties:{redirectUrl:{type:"string"}}},passthroughResponse:{type:"object",required:["passthrough"],additionalProperties:!1,properties:{passthrough:{type:"boolean",enum:[!0]}}},entry:{type:"object",required:["request","response"],additionalProperties:!1,properties:{request:{$ref:"#/definitions/request"},response:{oneOf:[{$ref:"#/definitions/response"},{$ref:"#/definitions/redirectResponse"},{$ref:"#/definitions/passthroughResponse"}]},maxHits:{type:"integer",minimum:1}}}},ww="object",vw=["entries"],Sw={version:{type:"string",enum:["1.2","1.2.0"]},creator:{type:"string"},entries:{type:"array",items:{$ref:"#/definitions/entry"}}},Ew={$schema:bw,definitions:Tw,type:ww,required:vw,properties:Sw}});async function am(){try{return await ce(wo.promises.readFile(Io()).then(async s=>{let e=await im;return Aw(e,s)}),3e4)}catch{return{}}}function Aw(s,e){let t=e.slice(0,16),r=e.slice(16),n=Buffer.from(s),o=zr.createDecipheriv("aes-256-cbc",Buffer.concat([n,Buffer.alloc(32)],32),t),i=o.update(r);return JSON.parse(Buffer.concat([i,o.final()]))}function bt(s,e,t=Iw,r=void 0){return async()=>{if(!sm)return await s();let n=e;r&&(e+=JSON.stringify(r));let o=await xw(e);if(o)return Js.debug("cache hit:",{fnName:e}),o;if(Js.debug("cache miss:",{fnName:e}),!nm)throw new Error(`Attempted to rebuild cache for ${n}. cache miss is not allowed with current run configuration`);let i=await s();return i&&await Cw(e,i,t),i}}async function xw(s){let t=(await Ro)[s];if(!t)return;let{value:r,expiry:n}=t;if(!(n<Date.now())&&r)return r}async function Cw(s,e,t){if(Dc)throw Js.error("calling set after waitForSave is not allowed",{key:s,ttl:t}),new Error("calling set after waitForSave is not allowed");try{let r=await Ro;r[s]={value:e,expiry:Date.now()+t},om=new Promise(n=>{Eo=n}),Rw(r)}catch{Js.error("failed updating cache")}}async function Kr(){let s=await Ro;Object.keys(s).forEach(e=>{delete s[e]})}function cm(s){sm=s}function Pw(s=!0){nm=s}async function lm(){try{return Dc=!0,await om}finally{Dc=!1}}function um(s){So=s,Ro=am()}var wo,vo,zr,tm,Js,So,rm,Eo,sm,nm,Dc,om,im,Iw,Io,Ro,Rw,pm,dm,tA,mm,jt=w(()=>{"use strict";wo=S(require("fs")),vo=S(require("path")),zr=S(require("crypto"));F();tm=require("lodash");j();Js=C("local cache"),So=vo.resolve(ht(),"testim-cache"),sm=!0,nm=!0,Dc=!1,om=new Promise(s=>{Eo=s}),im=new Promise(s=>{rm=s}),Iw=1e3*60*60*3,Io=()=>vo.resolve(vo.resolve(So,"testim.cache"));Ro=am(),Rw=(0,tm.debounce)(async s=>{let e;try{let t=await im,r=zr.randomBytes(16),n=JSON.stringify(s),o=Buffer.from(t),i=zr.createCipheriv("aes-256-cbc",Buffer.concat([o,Buffer.alloc(32)],32),r),a=Buffer.concat([r,i.update(n),i.final()]);await ge(So)||await wo.promises.mkdir(So,{recursive:!0}),await wo.promises.writeFile(Io(),a)}catch(t){Js.error("failed saving cache",{err:t}),e=t}Eo(e?{success:!1,error:e}:{success:!0})},200);pm=rm,dm=cm.bind(void 0,!1),tA=cm.bind(void 0,!0),mm=()=>Pw(!1)});function Ao(){return{cliLocation:ht(),userInfo:Jr.userInfo(),platform:Jr.platform(),release:Jr.release()}}var Jr,Mc=w(()=>{"use strict";Jr=S(require("os"));F()});function kw(s){try{return xo.resolve(xo.dirname(require.resolve(`${s}/package.json`)),require(`${s}/package.json`).main||"")}catch(e){if(e.code==="ERR_PACKAGE_PATH_NOT_EXPORTED")return require.resolve(s);throw e}}function Zt(s){let e=kw(s);return require(e)}var xo,Ys=w(()=>{"use strict";xo=S(require("path"))});function _w(s){let t=/EACCES[^']+'(.+)'/.exec(s);return t===null?!1:t[1]}function Ow(s){return/The "to" argument must be of type string./.exec(s)}function ym(s,e,t){let r=_w(s),n=Ow(s);return r||n?(hm.info("Failed to install package due to insufficient write access",{...Ao(),package:t,path:r}),console.error(`
|
|
4
4
|
|
|
5
5
|
Testim failed installing the package ${t||""} due to insufficient permissions.
|
|
6
6
|
This is probably due to an installation of @testim/testim-cli with sudo, and running it without sudo.
|
|
@@ -216,7 +216,7 @@ When running the CLI in Selenium mode, the Turbo Mode option is ignored, as they
|
|
|
216
216
|
`,u=[],f=new wh.Worker(m,{eval:!0});try{return await ce(new Promise(h=>{f.on("message",g=>{if(g.action==="finish"){let{data:y}=g,T={...y,tstConsoleLogs:u};ct.debug("Run code worker response",{messageWithLogs:T,transactionId:s}),h(T)}else g.action==="progress"&&u.push(g.data)}).on("error",g=>{g.message==="malformed data: URI"?ct.error("Run code worker error",{err:g,transactionId:s,fileDataUrl:i}):ct.error("Run code worker error",{err:g,transactionId:s}),h({tstConsoleLogs:u,status:"failed",result:{resultValue:g==null?void 0:g.toString(),exports:{},exportsTest:{},exportsGlobal:{}},success:!1})}).on("exit",()=>{ct.debug("Run code worker has been terminated",{transactionId:s})}),f.postMessage({incomingParams:e,context:JSON.parse(JSON.stringify(t)),code:r})}),o)}catch(h){if(!(h instanceof ne))throw h;return ct.warn("timeout to run code",{transactionId:s,err:h}),{tstConsoleLogs:u,status:"failed",result:{resultValue:h==null?void 0:h.toString(),exports:{},exportsTest:{},exportsGlobal:{}},success:!1}}finally{f==null||f.terminate()}}async function uE(s){try{await yh.promises.rm(s,{recursive:!0,force:!0})}catch(e){ct.warn("failed to remove install npm packages folder",{err:e})}}function vh(s,e,t,r){return`${e}_${t}_${s}_${r}`}async function ds(s,e,t,r,n,o){let i=vh(n,e,s,t),{data:a}=await pE(i,r,o);return a}async function ms(s,e,t,r,n,o,i,a,l,c){var g;let d=r.computePackagePathFromPackageJsonExports||L.flags.computePackagePathFromPackageJsonExports.isEnabled(),m=Object.fromEntries(((g=t.nodePackageParams)==null?void 0:g.map(y=>{if(d){let T=vm(y.testimPackageLocalLocation);return[y.paramName,ps.join(y.testimPackageLocalLocation,T)]}return[y.paramName,y.testimPackageLocalLocation]}))||[]),u=vh(i,n,e,o);if(c){let y=await cn(c);y&&(l=y)}Buffer.isBuffer(l)&&(ct.debug("runCodeWithPackages: converted a buffer to base 64 string data URI",{fileDataUrl:l}),l=l.toString());let f="data:,";return l==="data:"&&(ct.debug("runCodeWithPackages, fileDataUrl was an empty string ",{fileDataUrl:l}),l=f),{...await lE(u,t,r,s,m,a,l),nodeVersion:process.version}}async function pE(s,e,t){let r=e.map(c=>`${c.packageName}@${c.packageVersion}`),n=Sh(),i=L.flags.reuseCliPkgInstallFolder.isEnabled()?n:ps.join(n,`/${s}`),a=global.proxyUri;async function l(){let c="";try{if(c=await Sm(i,r,a,t),ct.info("npm package install finished",{transactionId:s,output:c,timeout:t}),Number(c.trim().split(" ")[1])<r.length)throw"npm package install failed, couldn't install all packages";return{data:e.map(m=>{let u=Tm(i,m.packageName);return{...m,packageFullName:`${m.packageName}@${u}`,packageLocalLocation:ps.resolve(i,"node_modules",m.packageName)}}),installFolder:i}}catch(d){throw ct.warn("npm package install failed",{transactionId:s,err:d}),d}}try{return await ce(l(),t)}catch(c){throw c instanceof ne&&ct.warn("timeout to install package",{packages:r,transactionId:s,err:c,timeout:t}),c}}function Sh(){return ps.join(bh.tmpdir(),"/testim_local_packages")}function dE(){let s=Sh();return uE(s)}var yh,bh,ps,Th,wh,ct,fs=w(()=>{"use strict";yh=S(require("fs")),bh=S(require("os")),ps=S(require("path"));F();Yr();Th=S(require("data-uri-to-buffer")),wh=require("worker_threads");K();j();he();Yr();pe();ct=C("cli-service");dE().catch(s=>ct.warn("failed to clean local package folder",{err:s}))});var ar={};G(ar,{run:()=>fE});function mE(s,e){try{let t=e.defaults.enforceMaximumJsResultSize,r=L.flags.maximumJsResultSize.getValue(),n=JSON.stringify(s).length>r;return t?n:!1}catch{return!1}}var fE,Eh=w(()=>{"use strict";fs();K();pe();fE=async(s,e,t)=>{let{code:r,stepId:n,incomingParams:o,context:i,testResultId:a,retryIndex:l,stepResultId:c,runTimeout:d,fileDataUrl:m,s3filepath:u}=e.data;try{let f=await ms(r,n,o,i,a,l,c,d,m,u);return f&&mE({result:f.result,tstConsoleLogs:f.tstConsoleLogs},t)?{code:"js-result-max-size-exceeded",success:!1}:{data:f,success:!0}}catch(f){throw f instanceof ne?new Error("Timeout while running action"):f}}});var zu={};G(zu,{run:()=>gE});var gE,Ih=w(()=>{"use strict";fs();K();gE=async(s,e)=>{let{stepId:t,testResultId:r,retryIndex:n,stepResultId:o,packageData:i,timeout:a}=e.data;try{return{data:await ds(t,r,n,i,o,a),success:!0}}catch(l){if(l instanceof At)return{success:!1,code:"invalid-node-package",message:l.message};if(l instanceof ne)return{success:!1,code:"timeout"};throw l}}});async function Ah(s,e,t,r){try{return await vl(s,e,t,r)}catch{Oi.error("failed to report remote step state",{projectId:s,resultId:e,stepId:t});return}}async function yE(s,e,t,r,n){return Oi.info("finished to run remote step",{stepId:t,sessionId:n}),await Ah(s,e,t,{status:"completed",success:!0,failureReason:null,data:r})}async function Rh(s,e,t,r,n){return Oi.info("failed to run remote step",{stepId:t,sessionId:n,failureReason:r}),await Ah(s,e,t,{status:"completed",success:!1,failureReason:r})}async function xh(s,e,t,r){if(!(t!=null&&t.type)||t.status==="completed")return;let{project:n,projectData:o}=s,i=t.type,a=e.getSessionId(),l=t.id;Oi.info("start play remote step",{stepType:i,stepId:l,sessionId:a});let c=hE[i];if(!c)return await Rh(n,r,l,`Failed to find step type ${i}`,a);try{let d=await c.run(e,t,o);return await yE(n,r,l,d,a)}catch(d){return await Rh(n,r,l,d.message,a)}}var Oi,hE,Ch=w(()=>{"use strict";Eh();he();Ih();j();Oi=C("step-playback"),hE={"cli-validation-code-step":ar,"cli-wait-for-code-step":ar,"cli-action-code-step":ar,"cli-api-code-step":ar,"cli-condition-step":ar,"cli-download-code-step":ar,"node-package":zu}});var Ku,Ph,Cr,TE,Ju,vt,Li=w(()=>{"use strict";F();Qe();Ku=S(require("ws")),Ph=require("events");j();ue();Cr=C("socket-service"),TE=5e3,Ju=class extends Ph.EventEmitter{constructor(){super(...arguments);this.clientId=se();this.ws=null;this.filterMap={};this.listeners={}}onReconnect(t){Cr.info("test result websocket re-connect"),setTimeout(()=>this.connect(t),TE)}formatUrl(t){return t.startsWith("http://")?t.replace("http://","ws://"):t.startsWith("https://")?t.replace("https://","wss://"):t}parseEvent(t){try{return JSON.parse(t)}catch(r){Cr.error("failed to parse or trigger event",{err:r})}}connect(t){let r=this.formatUrl(id);return Pt().then(n=>new Promise(o=>{let i={...global.proxyUri&&{agent:new global.ProxyAgent(global.proxyUri)}};this.ws=new Ku.default(`${r}?projectId=${t}&clientId=${this.clientId}&token=${n}`,i),this.ws.on("open",()=>{var a;return Cr.info("websocket opened"),this.reSendAllExistingFilters(),(a=this.onConnect)==null||a.call(this),o()}),this.ws.on("close",a=>{Cr.info("websocket closed",{event:a}),(!this.ws||this.ws.readyState===Ku.default.CLOSED)&&this.onReconnect(t)}),this.ws.on("error",a=>{Cr.info("websocket error",{event:a})}),this.ws.on("message",a=>{let l=this.parseEvent(a);l!=null&&l.type&&this.emit(l.type,l.data)})}))}sendMessage(t){if(!this.ws){Cr.warn("tried to send error when websocket was disconnected");return}try{this.ws.send(JSON.stringify(t))}catch(r){Cr.error("failed to stringify message for sending",{err:r})}}listenOnce(t,r,n){let o=i=>{r(i)&&(n(i),this.removeListener(t,o))};this.on(t,o)}listenTo(t,r,n,o){function i(l){n(l)&&o(l)}(Array.isArray(r)?r:[r]).forEach(l=>{this.listeners[`${t}:${l}`]||=[];let c=i.bind(this);this.listeners[`${t}:${l}`].push(c),this.on(l,c)})}reSendAllExistingFilters(){Object.keys(this.filterMap).forEach(t=>{let r=this.filterMap[t];this.sendMessage({type:"add-filter",filter:r})})}addFilter(t,r,n,o=!1){return new Promise(i=>{let a=se(),l={query:r,id:a,type:n,fullDocument:o};this.listenOnce("add-filter:done",c=>c.id===a,i),this.sendMessage({type:"add-filter",filter:l}),this.filterMap[t]=l})}removeListeners(t,r){Object.keys(this.listeners).length!==0&&r.forEach(n=>{let o=this.listeners[`${t}:${n}`];o&&(delete this.listeners[`${t}:${n}`],o.forEach(i=>this.removeListener(n,i)))})}removeFilter(t,r){let n=this.filterMap[t];if(!n)return;let o=Array.isArray(r)?r:[r];this.removeListeners(t,o),delete this.filterMap[t],this.sendMessage({type:"remove-filter",filter:n})}},vt=new Ju});var _h,Yu,wE,vE,SE,kh,Di,gs,Xu=w(()=>{"use strict";_h=S(require("p-retry")),Yu=S(require("socket.io-client"));ue();F();j();wE=50,vE=10,SE=5e3,kh=10*1e3,Di=C("base socket service"),gs=class{constructor(){this.attempts=0;this.rooms={};this.emitPromiseQueue=void 0}joinToMultipleResults(){let e=Object.keys(this.rooms);Di.info("re-join all existing rooms",{testResultIds:e}),e.forEach(t=>{var n;let r=this.rooms[t];(n=this.emitJoinRoom)==null||n.call(this,t,r)})}joinRoom(e,t){this.rooms[e]=t}leaveRoom(e){delete this.rooms[e]}addSocketHandlers(){let e=(t,r)=>{let n="websocket";try{n=this._socket.io.engine.transport.name}catch{}Di.error(`Error in SocketService websocket _${t}_ socket ${this._socket.id} is ${this.url} over ${n}. Reconnect attempts ${this.attempts}. Error is: ${r==null?void 0:r.message}`)};this._socket.on("reconnect_attempt",t=>{if(e("reconnect_attempt",{message:"reconnect attempt",attempt:t}),this.attempts++,this.attempts===vE&&!this.isAllowedWS&&(this._socket.io.opts.transports=["polling"],this._socket.io.opts.upgrade=!1),this.attempts>=wE)throw new Error(`Can't connect to Testim Servers.
|
|
217
217
|
Action required: Please allow opening a websockets connection to ${fe} in your firewall/proxy`)}),this._socket.on("connect_error",t=>{e("connect_error",t)}),this._socket.on("connect_timeout",t=>{e("connect_timeout",t)}),this._socket.on("error",t=>{e("error",t)}),this._socket.on("reconnect_error",t=>{this.prevErr&&this.prevErr.type===t.type||(this.prevErr=t,e("reconnect_error",t))}),this._socket.on("reconnect",()=>{Di.info("reconnect to socket and re-join to rooms"),this.joinToMultipleResults()}),this._socket.on("connect",()=>{var t;this.attempts=0,this.isAllowedWS===void 0&&(this.isAllowedWS=this._socket.io.engine.transport&&this._socket.io.engine.transport.name==="websocket"),(t=this.onConnect)==null||t.call(this)})}initNewSocket(e,t){let r={query:{projectId:e},requestTimeout:kh,transports:["websocket"],upgrade:!1,forceNew:!0,rejectUnauthorized:process.env.NODE_TLS_REJECT_UNAUTHORIZED!=="0",...global.caFileContent&&{ca:global.caFileContent},...global.proxyUri&&{agent:new global.ProxyAgent(global.proxyUri)}};return new Promise(n=>{this.url=`${fe}/${t}`,this._socket=Yu.connect(this.url,r),this.addSocketHandlers(),this._socket.on("connect",n),this._socket.open()})}init(e,t){let r={query:{projectId:e},requestTimeout:kh,transports:["websocket"],upgrade:!1,rejectUnauthorized:process.env.NODE_TLS_REJECT_UNAUTHORIZED!=="0",...global.caFileContent&&{ca:global.caFileContent},...global.proxyUri&&{agent:new global.ProxyAgent(global.proxyUri)}};this.url=`${fe}/${t}`,this._socket=Yu.connect(this.url,r),this.addSocketHandlers()}emitPromise(e,t){let r={},n=()=>new Promise((o,i)=>{this._socket.emit(e,t,a=>a!=null&&a.success?o():(r[e]=t,i(new Error("bad ack"))))});return this.emitPromiseQueue=(this.emitPromiseQueue||Promise.resolve()).then(()=>(0,_h.default)(()=>ce(n(),SE),{retries:200,minTimeout:3e3,factor:1})).finally(()=>{Object.keys(r).length>0&&Di.error("Bad acknowledge from socket emit",{errorneousEvents:r})}),this.emitPromiseQueue}}});var Oh={};G(Oh,{remoteStepServiceSocketIO:()=>EE});var Qu,EE,Lh=w(()=>{"use strict";Xu();Qu=class extends gs{constructor(){super(...arguments);this.listeners={}}init(t){super.init(t,"remoteStep"),this.listeners={}}emitJoinRoom(t){return this.emitPromise("remoteStep:join",{resultId:t})}emitLeaveRoom(t){return this.emitPromise("remoteStep:leave",{resultId:t})}async joinToRemoteStep(t){this.rooms[t]||(this.joinRoom(t),await this.emitJoinRoom(t))}listenToRemoteStep(t,r){this.listeners[t]&&(this._socket.off("remoteStep:saved",this.listeners[t]),delete this.listeners[t]),this.listeners[t]=n=>{n.resultId===t&&n.remoteStep&&n.remoteStep.status==="pending"&&r(n.remoteStep)},this._socket.on("remoteStep:saved",this.listeners[t])}async unlistenToRemoteStep(t){this.listeners[t]&&(this.leaveRoom(t),this._socket.off("remoteStep:saved",this.listeners[t]),delete this.listeners[t],await this.emitLeaveRoom(t))}},EE=new Qu});var Dh={};G(Dh,{remoteStepService:()=>hs});var Zu,Ln,ep,hs,Mi=w(()=>{"use strict";Li();ae();pe();({REMOTE_STEP_SAVED:Zu}=Ct),ep=class{async init(e){L.flags.useNewWSCLI.isEnabled()||(Ln=(await Promise.resolve().then(()=>(Lh(),Oh))).remoteStepServiceSocketIO,Ln.init(e))}joinToRemoteStep(e){return L.flags.useNewWSCLI.isEnabled()?vt.addFilter(`${e}:remoteStep`,{resultId:e},[Zu]):Ln.joinToRemoteStep(e)}listenToRemoteStep(e,t){if(L.flags.useNewWSCLI.isEnabled()){vt.listenTo(`${e}:remoteStep`,[Zu],r=>r.resultId===e&&r.remoteStep&&r.remoteStep.status==="pending",r=>t(r.remoteStep));return}Ln.listenToRemoteStep(e,t)}unlistenToRemoteStep(e){return L.flags.useNewWSCLI.isEnabled()?(vt.removeFilter(`${e}:remoteStep`,[Zu]),Promise.resolve()):Ln.unlistenToRemoteStep(e)}},hs=new ep});var tp,Pr,Mh=w(()=>{"use strict";Xu();tp=class extends gs{constructor(){super(...arguments);this.listeners={}}init(t){super.init(t,"testResult"),this.listeners={}}listenToTestResult(t,r,n){this.listeners[t]&&(this._socket.off("testResult:updated",this.listeners[t]),delete this.listeners[t]),this.listeners[t]=o=>{o.resultId===t&&o.testId===r&&n(o.testResult)},this._socket.on("testResult:updated",this.listeners[t])}emitJoinRoom(t,r){return this.emitPromise("testResult:join",{resultId:t,testId:r})}async joinToTestResult(t,r){this.rooms[t]||this.joinRoom(t,r),await this.emitJoinRoom(t,r)}emitLeaveRoom(t,r){return this.emitPromise("testResult:leave",{resultId:t,testId:r})}leaveTestResult(t,r){return this.listeners[t]?(this.leaveRoom(t),this._socket.off("testResult:updated",this.listeners[t]),delete this.listeners[t],this.emitLeaveRoom(t,r)):Promise.resolve()}getSocket(){return this._socket}},Pr=new tp});var Uh={};G(Uh,{testResultService:()=>Lt});var Nh,rp,Lt,Ni=w(()=>{"use strict";Nh=require("events");Li();ae();pe();Mh();rp=class extends Nh.EventEmitter{init(e){if(L.flags.useNewWSCLI.isEnabled()){vt.onConnect=()=>this.emit("socket-connected");return}Pr.init(e),Pr.onConnect=()=>this.emit("socket-connected")}joinToTestResult(e,t){return L.flags.useNewWSCLI.isEnabled()?vt.addFilter(`${e}:testResult`,{resultId:e,testId:t},[Ct.TEST_RESULT_UPDATED,Ct.TEST_RESULT_CREATED]):Pr.joinToTestResult(e,t)}async leaveTestResult(e,t){if(L.flags.useNewWSCLI.isEnabled()){vt.removeFilter(`${e}:testResult`,[Ct.TEST_RESULT_UPDATED,Ct.TEST_RESULT_CREATED]);return}await Pr.leaveTestResult(e,t)}listenToTestResult(e,t,r){if(L.flags.useNewWSCLI.isEnabled()){vt.listenTo(`${e}:testResult`,[Ct.TEST_RESULT_UPDATED,Ct.TEST_RESULT_CREATED],n=>n.resultId===e&&n.testId===t,n=>r(n));return}Pr.listenToTestResult(e,t,r)}getSocket(){if(!L.flags.useNewWSCLI.isEnabled())return Pr.getSocket()}},Lt=new rp});var Bh,jh,$h,Se,IE,Wh,Fh,Ui,Vh=w(()=>{"use strict";Bh=S(require("lodash"));F();ue();$e();ts();Qe();he();Ch();jh=S(require("p-retry")),$h=require("url");j();ei();cs();ae();Mi();Ni();Se=C("test-run-handler"),IE=3,Wh=20*1e3,Fh=s=>JSON.stringify(s).length<Wh,Ui=class{constructor(e,t,r,n,o,i){this._executionId=e;this._executionName=t;this._options=n;this._branch=o;this._testRunStatus=i;this.seleniumPerfStats=new Ir;this._totalRetryCount=1;this._retryCount=1;this._timeoutRetryCount=1;this._seleniumHubRetryCount=2;this.clearTestResultFinished=Promise.resolve(void 0);var l,c;this._testStatus=r.testStatus,this._testId=r.testId,this._testName=r.name,this._testResultId=r.resultId,this._baseUrl=n.baseUrl||r.baseUrl||r.testConfig.baseUrl,this._nativeApp=r.nativeApp,this._overrideTestConfig=r.overrideTestConfig||r.testConfig,this._overrideTestConfigId=(l=r.overrideTestConfig)==null?void 0:l.id,this._maxRetryCount=n.retries,this._remoteRunId=n.remoteRunId;let a=!((c=r.runConfig)!=null&&c.isMobileWeb)&&n.browser;this._runConfig=a?qs(n.browser,n.saucelabs,n.browserstack):r.runConfig}async waitForExecutionStartedFinished(){return await this._testRunStatus.waitForExecutionStartedFinished(),await this.clearTestResultFinished}get testStatus(){return this._testStatus}get runMode(){return this._options.mode}get runConfig(){return this._runConfig}get testResultId(){return this._testResultId}get baseUrl(){return this._baseUrl}set baseUrl(e){this._baseUrl=e}get executionId(){return this._executionId}get executionName(){return this._executionName}getSauceLabsAppPath(e,t){var r,n;return this.isAppFromDevice?null:t?e.includes("us-west-1")?t.usSauceLabsAppId:t.euSauceLabsAppId:e.includes("us-west-1")?(r=this._nativeApp)==null?void 0:r.usSauceLabsAppId:(n=this._nativeApp)==null?void 0:n.euSauceLabsAppId}getAppPath(e,t){var r;return this.isAppFromDevice?null:t?t[e]:(r=this._nativeApp)==null?void 0:r[e]}getAppPathByGridType(e,t,r){var n,o,i,a;return this.isAppFromDevice?null:r?(o=(n=r.gridData)==null?void 0:n[e])==null?void 0:o[t]:this._nativeApp&&"gridData"in this._nativeApp?(a=(i=this._nativeApp.gridData)==null?void 0:i[e])==null?void 0:a[t]:null}get appPackageNameOrBundleId(){return this.nativeAppMetadata?this.nativeAppMetadata.id||this.nativeAppMetadata.packageName:null}get androidActivityWait(){var r;let e=(r=this.nativeAppMetadata)==null?void 0:r.activity;if(!e)return null;let t=e.split(".").pop();return e.replace(t,"*")}get isAppFromDevice(){return Gs(this._nativeApp)}get isAppForIosVirtualDevice(){var t;let e=(t=this._options.gridData)==null?void 0:t.type;return Wr(this._nativeApp,e)}get getAppSource(){if(this._nativeApp)return this.isAppFromDevice?fo.FROM_DEVICE:fo.FROM_LIBRARY}get downloadableAppPublicLink(){return this._nativeApp&&"filePath"in this._nativeApp?`${fe}/storage${this._nativeApp.filePath}?access_token=${this._options.authData.token}`:null}get mobileApp(){return this._nativeApp}set nativeApp(e){this._nativeApp=e}get nativeAppMetadata(){return this._nativeApp?"appMetadata"in this._nativeApp?this._nativeApp.appMetadata:this._nativeApp:null}get branch(){return this._branch}get sfdcCredential(){return this._options.sfdcCredential}get remoteRunId(){return this._remoteRunId}get overrideTestConfig(){return this._overrideTestConfig}get overrideTestConfigId(){return this._overrideTestConfigId}markClearBrowser(){this.clearBrowser=!0}async getRunRequestParams(){var r,n;let t={tokenV3:await Pt(),refreshToken:Mo(),projectId:this._options.project,executionId:this._executionId,executionName:this._executionName,testId:this._testId,resultId:this._testResultId,baseUrl:this._baseUrl,branch:this._branch,servicesUrl:md,remoteRunId:this.remoteRunId,previousTestResultId:this.previousTestResultId,testRetryCount:this.retryCount,...this._options.shouldMonitorPerformance&&{shouldMonitorPerformance:!0},...this._options.company&&{companyId:this._options.company.companyId,storageBaseUrl:this._options.company.storageBaseUrl,storageType:this._options.company.storageType,planType:this._options.company.planType,isPOC:this._options.company.isPOC,isStartUp:this._options.company.isStartUp},...this._options.collectCodeCoverage&&{codeCoverageUrlFilter:this._options.codeCoverageUrlFilter||`${this.baseUrl}*`},...this._options.disableMockNetwork&&{disableMockNetwork:this._options.disableMockNetwork},...this._options.lightweightMode&&{lightweightMode:this._options.lightweightMode},...this.clearBrowser&&{clearBrowser:!0},...this._options.localRCASaver&&{localRCASaver:this._options.localRCASaver},...this.sfdcCredential&&{sfdcCredential:this.sfdcCredential},userAccessKey:await No()};if(this._options.disableMockNetwork&&Tt("user-disable-mock"),t.lightweightMode&&((r=this._options.lightweightMode)!=null&&r.general)){Object.assign(t,{company:this._options.company});let o=this.runData,i=Fh(o);Object.assign(t.lightweightMode,{isRunDataSentInUrl:i});let a=JSON.stringify(o).length,l=this.testId;i?(Object.assign(t,{runData:o}),Se.info(`Run data sent as URL param, test id: ${l} run data length: ${a}`)):Se.warn(`Run data is too big to be sent as a URL param. Test id: ${l}, run data size: ${a} (limit: ${Wh} characters)`),Object.assign(t,{isLocalRun:Boolean(this._options.useLocalChromeDriver||this._options.useChromeLauncher)})}if((n=this._options.lightweightMode)!=null&&n.preloadTests&&this._options.useChromeLauncher){let o=await hn(this._options);Object.assign(t,{preloadedTest:o[t.testId]})}return t}async getRunTestUrl(){let e=await this.getRunRequestParams(),t=`https://run.testim.io/?params=${encodeURIComponent(JSON.stringify(e))}`;return Se.info(`Test (${this.testId}) run URL length: ${t.length}`),t}set sessionId(e){this._sessionId=e}get sessionId(){return this._sessionId}get testId(){return this._testId}get testName(){return this._testName}get runParams(){var e;return((e=this._options.runParams)==null?void 0:e[this._testResultId])||{}}get runData(){return{userParamsData:this.runParams,overrideTestConfigId:this._overrideTestConfigId||null}}async clearTestResult(){var o;let e={...this.runData,...this._options.mockNetworkRules&&{mockNetworkRules:this._options.mockNetworkRules}},t=this._timeoutRetryCount>1||this._retryCount>1;if((o=this._options.lightweightMode)!=null&&o.disableResults&&!t&&Fh(e))return;let r=async()=>{try{return await Sl(this._options.project,this._testId,this._testResultId,e)}catch(i){return Se.error("failed to upload run data artifact (runner)",{err:i}),""}},n=async()=>{let i=await r();return await this._testRunStatus.waitForExecutionStartedFinished(),wl(this._options.project,this._testResultId,this._testId,{name:this._testName,resultId:this._testResultId,status:"pending",retryCount:this._retryCount,runDataUrl:i,runData:i?void 0:e,testRetryKey:this.retryKey})};return this.clearTestResultFinished=n(),this.clearTestResultFinished}hasMoreRetries(){return this._retryCount<this._maxRetryCount}isSeleniumHubNoMatchSessionError(e){return/Session \[([a-zA-Z0-9]+)\] not available and is not among the last \d+ terminated sessions/.test(e)}decreaseSeleniumHubRetry(){this._seleniumHubRetryCount-=1}get ignoreSeleniumHubError(){return this._seleniumHubRetryCount===0}get retryKey(){return`${this._retryCount}:${this._timeoutRetryCount}`}startNewRetry(){return this._retryCount++,this._timeoutRetryCount=1,this.onRetry()}async runTestUsingCDP(e){N("runTestUsingCDP");let{targetInfos:t}=await e.cdpCommand("Target.getTargets")||{targetInfos:[]},r=["Testim Editor","Tricentis Testim Editor"],{targetId:n}=t.find(i=>i.type==="background_page"&&r.includes(i.title))||{},{targetId:o}=t.find(i=>i.type==="page")||{};if(!n)throw new Error("Tricentis Testim extension not found");if(!o)throw new Error("AUT target not found");try{N("before Target.attachToTarget");let[i,a]=await Promise.all([e.cdpCommand("Target.attachToTarget",{targetId:n,flatten:!0}),this.getRunRequestParams()]),{sessionId:l}=i||{};N("before Runtime.evaluate"),await(0,jh.default)(async()=>{let{result:d}=await e.cdpCommand("Runtime.evaluate",{expression:"typeof runTestimTest !== 'undefined'",returnByValue:!0},l);if(!d.value)throw new Error("runTestimTest not available on global scope")},{retries:100,minTimeout:30,factor:1}),N("after wait for runTestimTest function");let{result:c}=await e.cdpCommand("Runtime.evaluate",{expression:`runTestimTest(${JSON.stringify(a)})`,awaitPromise:!0,returnByValue:!0},l);if(c.subtype==="error")throw new Error(c.description);return N("after Runtime.evaluate"),c.value}catch(i){throw Se.error("error running test using CDP",{err:i}),new Error("Error running test using CDP")}}isRetryKeyMismatch(e){return e.testRetryKey&&e.testRetryKey!==this.retryKey}validateRunConfig(){let{baseUrl:e,runConfig:{browserValue:t}}=this;if(e&&t==="safari"){let r;try{r=new $h.URL(e)}catch{return}let{username:n,password:o}=r;if(n||o)throw new Error("Basic authentication in URL is not supported in Safari")}}onStarted(e){return new Promise(t=>{let r=!1,n=o=>{if(!r){if(this.isRetryKeyMismatch(o)){Se.warn(`ignoring result update for on started due to retry key mismatch, got ${o.testRetryKey}, current is ${this.retryKey}`,{resultId:this.testResultId,testId:this.testId});return}["running","completed"].includes(o.status)&&(o.resultId=this.testResultId,o.status==="completed"&&!this.isSeleniumHubNoMatchSessionError(o.reason)&&(Se.info("setting _wasCompletedOnStartedCheck to true",{testResult:o,resultId:this.testResultId,testId:this.testId,testRetryKey:this.retryKey}),this._wasCompletedOnStartedCheck=o),r=!0,t(o))}};if(this._options.disableSockets){let o=Date.now()+e,i=async()=>{if(Date.now()>o)return;let{testId:a,testResultId:l,branch:c,_options:{project:d}}=this;try{let m=await Sr(a,l,d,c);n(m),r||setTimeout(i,3e3)}catch(m){Se.error("failed to check if done",{err:m}),setTimeout(i,3e3)}};setTimeout(i,3e3)}else Lt.listenToTestResult(this._testResultId,this._testId,n)})}async checkViaRestAPIIfTestStarted(){let{testId:e,testResultId:t,_options:{project:r},branch:n}=this;try{let o=await Sr(e,t,r,n),i=["running","completed"];if(i.includes(o.status))return Se.info(`get status: ${o.status} after not get test started status`,{testId:e,testResultId:t,branch:n}),o;throw Se.error(`test not start test status: ${o.status} (expected [${i.join(", ")}])`,{testId:e,testResultId:t,branch:n}),new Error(Ue.TEST_START_TIMEOUT_MSG)}catch(o){throw Se.error("failed to get test result after test start timeout",{err:o,testId:e,testResultId:t,branch:n}),new Error(Ue.TEST_START_TIMEOUT_MSG)}}async onCompletedCleanup(){if(!this._options.disableSockets)return await Lt.leaveTestResult(this._testResultId,this._testId)}async onCompleted(){let e;try{let t=await new Promise(r=>{if(this._wasCompletedOnStartedCheck&&!this.isRetryKeyMismatch(this._wasCompletedOnStartedCheck)){Se.info("test was already completed in on started check",{resultId:this.testResultId,testId:this.testId}),r(this._wasCompletedOnStartedCheck);return}this._options.disableSockets||Lt.listenToTestResult(this._testResultId,this._testId,i=>{if(this.isRetryKeyMismatch(i)){Se.warn(`ignoring result update for on completed due to retry key mismatch, got ${i.testRetryKey}, current is ${this.retryKey}`,{resultId:this.testResultId,testId:this.testId});return}i.status==="completed"&&(i.resultId=this._testResultId,r(i))});let n=this._options.disableSockets?0:Math.floor(1e4+Math.random()*5e3),o=this._options.disableSockets?0:Math.floor(6e4+Math.random()*15e3);if(e=Bh.debounce(async()=>{try{let i=await Sr(this._testId,this._testResultId,this._options.project,this.branch);return this.isRetryKeyMismatch(i)?(Se.warn(`ignoring result update for on completed (in reconnect) due to retry key mismatch, got ${i.testRetryKey}, current is ${this.retryKey}`,{resultId:this.testResultId,testId:this.testId}),!1):(i==null?void 0:i.status)==="completed"?(Se.info("Socket reconnected - Test complete",{testId:this._testId,resultId:this._testResultId,projectId:this._options.project}),i.resultId=this._testResultId,r(i),!0):!1}catch(i){return Se.warn("Error while trying to check status on socket connect",i),!1}},n,{maxWait:o}),!this._options.disableSockets)Lt.on("socket-connected",async()=>{try{await Lt.joinToTestResult(this._testResultId,this.testId)}catch(i){Se.error("failed joining to test result updates after socket reconnected",{error:i})}e==null||e()});else{let i=()=>{setTimeout(async()=>{try{let{isComplete:a}=await ul(this._testResultId,this._options.project,this.retryKey);a?await e()||(Se.warn("onConnected returned false even though isComplete was true"),i()):i()}catch(a){Se.error("failed to check is complete",{err:a}),i()}},3e3)};i()}});return await this.onCompletedCleanup(),t}finally{e&&!this._options.disableSockets&&Lt.off("socket-connected",e)}}listenToRemoteStep(e){hs.listenToRemoteStep(this.testResultId,t=>{xh(this._options,e,t,this.testResultId)})}hasMoreTimeoutRetries(){let e=this._options.disableTimeoutRetry?1:IE;return this._timeoutRetryCount<e}decreaseRetryCount(){this._retryCount--,this._totalRetryCount--}startNewTimeoutRetry(){return this._timeoutRetryCount++,this.onRetry()}get retryCount(){return this._retryCount}get previousTestResultId(){return this._previousTestResultId}isAllowReportTestResultRetries(){var e,t,r;return Boolean((r=(t=(e=this._options.company)==null?void 0:e.activePlan)==null?void 0:t.premiumFeatures)==null?void 0:r.allowReportTestResultRetries)}async onRetry(){var e;this._previousTestResultId=this.testResultId,this.isAllowReportTestResultRetries()&&(this._totalRetryCount++,this._originalTestResultId||=this._previousTestResultId,this._testResultId=se(),!((e=this._options.lightweightMode)!=null&&e.onlyTestIdsNoSuite)&&await this._testRunStatus.addRetryTestResult({retryCount:this._totalRetryCount,executionId:this._executionId,projectId:this._options.project,newResultId:this._testResultId,originalTestResultId:this._originalTestResultId,previousTestResultId:this._previousTestResultId}))}}});var Fi,Gh=w(()=>{"use strict";Vh();Fi=class{constructor(e,t,r,n,o,i){this.pendingAppUploads=new Map;let a=new Set(r.map(l=>{var c;return(c=l.nativeApp)==null?void 0:c.appId}).filter(Boolean));!n.appId&&a.size>1&&a.forEach(l=>{this.pendingAppUploads.set(l,{isUploaded:!1,uploadedAppId:""})}),n.appId&&this.pendingAppUploads.set(n.appId,{isUploaded:!1,uploadedAppId:""}),this._waitingTests=r.map(l=>new Ui(e,t,l,n,o,i))}stop(){this._waitingTests=[]}getNext(){let e=this._waitingTests.shift();if(e)return e}hasMoreTests(){return Boolean(this._waitingTests.length)}}});var RE,AE,xE,Dn,sp=w(()=>{"use strict";ns();is();j();RE=C("worker-utils"),AE=async(s,e,t)=>{e&&await pu(s,t)},xE=async(s,e,t)=>{await du(s,e,t)},Dn=async(s,e,t,r,n,o)=>{RE.info("releasing player",{hasPlayer:Boolean(o)});try{await(o==null?void 0:o.onDone())}finally{n==="mongo"&&await AE(s,e,t),n==="redis"&&await xE(s,r,t)}}});function DE(s,e,t,r){return{testId:s,reason:r,name:e,resultId:t,success:!1}}var $i,Kh,ji,ip,Jh,St,Hh,qh,np,Mn,CE,op,PE,cr,kE,Bi,_E,zh,OE,LE,ME,lt,Nn=w(()=>{"use strict";$i=S(require("ms")),Kh=S(require("lodash")),ji=S(require("p-retry")),ip=S(require("dayjs")),Jh=S(require("dayjs/plugin/duration"));F();$e();ns();is();he();j();sp();Ot();ii();pe();Mi();Ni();Qe();Ge();ae();K();ip.default.extend(Jh.default);St=C("base-worker"),{GET_BROWSER_TIMEOUT_MSG:Hh,TEST_START_TIMEOUT_MSG:qh,TEST_COMPLETE_TIMEOUT_MSG:np}=Ue,{SETUP_TIMEOUT:Mn,NETWORK_ERROR:CE,GRID_ERROR:op,BROWSER_CLOSED:PE,SELENIUM_ERROR:cr,UNKNOWN_ERROR:kE,MOBILE_SESSION_ERROR:Bi}=$s,_E=(0,$i.default)("1s"),zh=(0,$i.default)("600s"),OE=(0,$i.default)("180s"),LE=1;ME=["fullLogs","locatorStats","stepsResults","setupStepResult","sharedStepClasses","revisionStatus","revisions","testData","exportsGlobal"],lt=class{constructor(e,t,r,n,o,i,a,l,c=!0){this.executionQueue=e;this.options=t;this.customExtensionLocalLocation=r;this.executionId=n;this.onTestStarted=o;this.onTestCompleted=i;this.onGridSlot=a;this.onTestIgnored=l;this.releaseSlotOnTestFinished=c;this.id=lt.getWorkerId();this.lambdatestService=new re;this.baseUrl=t.baseUrl,this.testRunTimeout=t.timeout,this.userData=t.userData}static getWorkerId(){return LE++}async getGridSlot(e,t){let r=await cg(e,t.executionId,this.options,this.id);return this.onGridSlot(t.testResultId,r),r}async getSlotOnce(e){let{browserValue:t}=this.testRunConfig;return Z.onGetSlot(this.id,t||"chrome"),await this.getGridSlot(t,e)}initPlayer(e){throw new Ds(!0)}async getBrowserOnce(e,t,r,n){throw new Ds(!0)}async runTestOnce(e,t){return e.sessionId=t.getSessionId(),St.info("Test run started",{testId:e.testId,resultId:e.testResultId,seleniumSession:t.getSessionId()}),await e.clearTestResult()}handleQuarantine(e){if(!Xe({testStatus:e.testStatus},this.options))return;let t={name:e.testName,testId:e.testId,resultId:e.testResultId,runnerStatus:de.SKIPPED,testStatus:e.testStatus};return this.onTestIgnored(this.id,t),t}handleMobileTest(e){var n,o;if(((n=this.options.gridData)==null?void 0:n.mode)==="local")return;let t=Vr(L,(o=this.options.gridData)==null?void 0:o.type)&&e.isAppFromDevice&&!this.options.appId,r=e.isAppForIosVirtualDevice;if(t||r){let i={name:e.testName,testId:e.testId,resultId:e.testResultId,runnerStatus:de.SKIPPED,testStatus:e.testStatus,mobile:{isAppFromDevice:t,isAppForIosVirtualDevice:r}};return this.onTestIgnored(this.id,i),i}}setSessionTimeout(){var e;if(this.options.mode===ee.APPIUM){let t=(e=this.options.gridData)==null?void 0:e.type;return t===_.BROWSERSTACK?Math.max(zh,this.options.getSessionTimeout):L.flags.increaseTDCRequestTimeout.isEnabled()&&(t===_.TESTIM_TDC||t===_.TESTIM_HEADSPIN)?Math.max(zh,this.options.getSessionTimeout):Math.max(OE,this.options.getSessionTimeout)}return Math.max(this.lambdatestService.getSessionTimeout||0,this.options.getSessionTimeout)}async getGridInfoAndSlotFromMongoGridQueue(e){let t=0;return{gridInfo:await(0,ji.default)(async()=>{let n=Date.now();try{return await ce(this.getSlotOnce(e),this.options.getBrowserTimeout,Ue.GET_BROWSER_TIMEOUT_MSG)}catch(o){return t++,await this.handleGetSlotError(o,n)}},{retries:this.options.getBrowserRetries-1,minTimeout:0,factor:1}),failedAttemptsCount:t}}async getSlotFromCompanySlotManager(){let e=0;return{slotId:await(0,ji.default)(async()=>{var n,o;let r=Date.now();try{let i=(n=this.options.company)==null?void 0:n.companyId,a=(o=this.options.projectData)==null?void 0:o.projectId;return await ce(dg(i,a,this.id),this.options.getBrowserTimeout,Ue.GET_BROWSER_TIMEOUT_MSG)}catch(i){return e++,await this.handleGetSlotError(i,r)}},{retries:this.options.getBrowserRetries-1,minTimeout:0,factor:1}),failedAttemptsCount:e}}async handleGetSlotError(e,t){let r={testId:this.testId,testResultId:this.testResultId,executionId:this.executionId};throw e instanceof Yt?St.info("could not get grid slot due to concurrency issue",r):St.error("error getting grid slot",{error:e,...r}),await oe(this.options.getBrowserTimeout-(Date.now()-t)),e}async handleGetSlot(e){if(this.options.slotService==="redis"){let{failedAttemptsCount:t}=await this.getSlotFromCompanySlotManager();return{gridInfo:this.options.gridData,failedAttemptsCount:t}}return await this.getGridInfoAndSlotFromMongoGridQueue(e)}async getTestPlayer(e,t){var o;let r=(o=this.userData)==null?void 0:o.projectId,n;try{N("before getSlotOnce retries");let{failedAttemptsCount:i,gridInfo:a={}}=await this.handleGetSlot(e);N("before getBrowserOnce retries");let l=this.options.getBrowserRetries-i;if(!l)throw new Error("No free browser slots in desired grid");let c=0;n=await(0,ji.default)(async()=>{let d=Date.now(),m=this.initPlayer(e);try{let u=await lg(this.options,a,this.testRunConfig,this.lambdatestService,{maxRetries:l,currentRetry:c+1});this.options.gridData.provider=u.provider,this.options.gridData.host=u.host,this.options.gridData.failedGetBrowserAttempts=c;let f=this.setSessionTimeout();N("before getBrowserOnce");let h=await ce(this.getBrowserOnce(e,t,m,u),f,Ue.GET_BROWSER_TIMEOUT_MSG);return N("after getBrowserOnce"),Z.onGetBrowserSuccess(this.id,r),m||h}catch(u){let f={...a,failedGetBrowserAttempts:c,id:this.options.gridData.gridId},h=this.options.mode===ee.APPIUM?"device":"browser";throw St.error(`error getting ${h} from grid`,{error:u,testId:this.testId,testResultId:this.testResultId,executionId:this.executionId,grid:f,publicIps:this.options.publicIps}),Z.onGetBrowserFailure(this.id,r,++c),m.onDone(),!(u instanceof Rt)&&this.options.mode!==ee.APPIUM&&await oe(this.options.getBrowserTimeout-(Date.now()-d)),u}},{retries:l-1,minTimeout:0,factor:1}),N("after getBrowserOnce retries")}catch(i){throw await Dn(this.id,this.releaseSlotOnTestFinished,r,this.options.company.companyId,this.options.slotService,n),[Rt,Br].some(a=>i instanceof a)?i:i instanceof ze?new fr(i,op):new fr(i,cr)}return n}async runTest(e,t,r){var d;N("inside runTest");let n=(d=this.userData)==null?void 0:d.projectId,o=this.handleQuarantine(e);if(o)return o;let i=Hs(this.options)&&this.handleMobileTest(e);if(i)return i;N("before runTest onTestStarted");let a=e.getAppSource,l=await this.onTestStarted(this.id,e.testId,e.testResultId,r,e.retryKey,a);e.baseUrl=l.config.baseUrl;let c=await this.getTestPlayer(e,t);try{return this.userData.loginData.token=await Pt(),await this.runTestOnce(e,c)}finally{await Dn(this.id,this.releaseSlotOnTestFinished,n,this.options.company.companyId,this.options.slotService,c)}}async runTestCleanup(){}async onQueueCompleted(){}run(){var u,f;let e=()=>process.nextTick(()=>this.run()),t=async(h,g,y)=>{var D,U,H;if(Xe(h,this.options)||Vr(L,(D=this.options.gridData)==null?void 0:D.type)&&g.isAppFromDevice&&!this.options.appId||g.isAppForIosVirtualDevice)return e();let T=g.sessionId,R=q=>y==null?void 0:y.message.includes(q),b=y&&y instanceof fr,v=y&&(R(qh)||R(np)),O=L.flags.retryOnSeleniumHubError.isEnabled()&&!!h.reason&&g.isSeleniumHubNoMatchSessionError(h.reason)&&!g.ignoreSeleniumHubError,W=v&&g.hasMoreTimeoutRetries(),A=g.hasMoreRetries()&&!b&&!v,E=!h.success&&(A||W||O);try{let q=g.retryKey;h.testRetryKey=q;let Y=g.getAppSource;if(await this.onTestCompleted(this.id,this.testId,h,T,E,Y),this.executionQueue.hasMoreTests()&&!((U=this.options.lightweightMode)!=null&&U.general)&&await oe(_E),await this.runTestCleanup(),E){if(W&&await g.startNewTimeoutRetry(),O){St.info(`retry test id: ${this.testId} name: ${this.testName} again due to selenium hub error`,{testId:g.testId,retryReason:h.reason,testName:this.testName,testResultId:this.testResultId,executionId:this.executionId});let me=(H=this.options.projectData)==null?void 0:H.projectId,pt=g.testResultId,It=g.testId;await Wo(me,pt,It,{show:!1}),g.decreaseSeleniumHubRetry(),g.decreaseRetryCount(),await g.startNewRetry()}return A&&!O&&!W&&await g.startNewRetry(),St.info(`retry test id: ${this.testId} name: ${this.testName} again`,{testId:this.testId,testName:this.testName,isTimeoutErrors:v,testRetryKey:q,totalRetries:g._totalRetryCount}),this.testResultId=g.testResultId,await d(g,E)}return await e()}catch(q){if(q instanceof Jt)return;St.error("failed to process test result",{error:q}),e();return}},r=()=>`Due to network connectivity issues, Testim CLI has been unable to connect to the grid.
|
|
218
218
|
Please make sure the CLI has stable access to the internet. ${Tc()?"(Internal: network connectivity test failed)":""}`,n=h=>{let{DEVICE_OS_VERSION_TOO_LOW:g,APP_NOT_EXIST_ON_DEVICE:y,APP_NEVER_STARTED:T,TIMEOUT_ERROR:R,SAUCELABS_APP_IS_NOT_INSTALLED:b}=Ac,v=h instanceof Error?h.message:h;return v.replace(/(Visit\s+)?(https?:\/\/\S+)?(\s+)?(for\s+troubleshooting(\.)?)?/gi,""),v.includes(Hh)||v.includes(R)?{errorType:Mn,reason:"timeout while getting device"}:v.includes(y)||v.includes(b)?{errorType:Bi,reason:"app doesn't exist on device"}:v.includes(T)?{errorType:Bi,reason:"app never started, check app permission or app activity"}:v.includes(g)?{errorType:Bi,reason:"Unable to install app: DeviceOSVersionTooLow"}:{errorType:Bi,reason:v}},o=(h,g)=>{let y=this.options.mode===ee.APPIUM?"device":"browser";if(!g&&L.flags.errorMessageOnBadNetwork.isEnabled())return{errorType:CE,reason:r()};let T=h instanceof Error?h.message:h;if(T.includes(Hh))return{errorType:Mn,reason:`Test couldn't get ${y}`};if(T.includes(qh))return{errorType:Mn,reason:"Test couldn't be started"};if(T.includes(np)){if(!this.testRunTimeout)return{errorType:Mn,reason:"Test timeout reached: test is too long"};let R=ip.default.duration({milliseconds:this.testRunTimeout}),b=Math.floor(R.asMinutes()),v=R.asSeconds(),I=b>0?` ${b} min`:"",x=v>0?` ${v} sec`:"";return{errorType:Mn,reason:`Test timeout reached (timeout:${I}${x}): test is too long`}}if(h instanceof fr&&h.type){if(h.type===op)return{errorType:op,reason:`Test couldn't get ${y} from grid - ${h.message}`};if(h.type===cr)return{errorType:cr,reason:`Failed to create new session - ${h.message}`}}return"type"in h&&h.type===PE?{errorType:cr,reason:`Session terminated, this is often caused to connection
|
|
219
|
-
problems between the Testim CLI and the grid running the test. Please check your network connection.`}:/SeleniumError: connect ECONNREFUSED/.test(h.message)||/Couldn't connect to selenium server/.test(h.message)?{errorType:cr,reason:"Failed to connect to the grid, please check if the grid is accessible from your network"}:/terminated due to FORWARDING_TO_NODE_FAILED/.test(h.message)?{errorType:cr,reason:"Session terminated, it is likely that the grid is out of memory or not responding, please try to rerun the test"}:/terminated due to PROXY_REREGISTRATION/.test(h.message)?{errorType:cr,reason:"Session terminated, it is likely that the grid is not responding, please try to rerun the test"}:/forwarding the new session cannot find : Capabilities/.test(h.message)?{errorType:cr,reason:`Session could not be created, please check that the ${y} you requested is supported in your plan`}:{errorType:kE,reason:T}},i=async(h,g)=>{var v;let y=await bc();!y&&L.flags.warnOnBadNetwork.isEnabled()&&console.warn(r()),St.warn("error on run",{err:h});let T=(v=this.userData)==null?void 0:v.projectId,{errorType:R,reason:b}=this.options.mode===ee.APPIUM?n(h):o(h,y);Wo(T,this.testResultId,this.testId,{status:js.COMPLETED,success:!1,reason:b,errorType:R,testRetryKey:g.retryKey,setupStepResult:{status:js.COMPLETED,success:!1,reason:b,errorType:R}},g.remoteRunId),await t(DE(this.testId,this.testName,this.testResultId,b),g,h)},a=async(h,g)=>{var v;let y=this.testId,T=this.testResultId,R=(v=this.userData)==null?void 0:v.projectId,b=this.branch;if(!y||!T||!R||!b)return St.warn("Test failed. Not enough data to recover results via API",{err:h}),i(h,g);try{let I=await Sr(y,T,R,b);if(St.warn("Test failed. Got results via API",{err:h,testResult:Kh.default.omit(I,ME),resultId:T}),I&&I.status===js.COMPLETED&&!h.message.includes(np))return await t(I,g);throw h}catch(I){return I!==h&&St.error("Failed to fetch test results from server",{testId:y,resultId:T,projectId:R,branch:b,err:I}),i(h,g)}},l=this.options.disableSockets||((u=this.options.lightweightMode)==null?void 0:u.disableResults)&&(this.options.useChromeLauncher||this.options.mode!=="extension"),c=this.options.disableSockets||((f=this.options.lightweightMode)==null?void 0:f.disableRemoteStep),d=async(h,g)=>{try{await Promise.all([!c&&hs.joinToRemoteStep(this.testResultId),!l&&Lt.joinToTestResult(this.testResultId,this.testId)]),this.options.mode!==ee.APPIUM&&h.validateRunConfig();let y=await this.runTest(h,this.customExtensionLocalLocation,g),T=await t(y,h);return N("After onRunComplete"),T}catch(y){return a(y,h)}finally{c||hs.unlistenToRemoteStep(this.testResultId)}},m=this.executionQueue.getNext();return m?(this.testId=m.testId,this.testName=m.testName,this.testResultId=m.testResultId,this.overrideTestConfigId=m.overrideTestConfigId,this.testRunConfig=m.runConfig,this.branch=m.branch,d(m)):this.onQueueCompleted()}}});var ap,Yh,ys,cp=w(()=>{"use strict";F();ap=S(require("p-retry"));F();j();K();Yh=C("window-utils"),ys=class{constructor(e,t){this.id=e;this.driver=t}async getElementFromPoint(e,t){function r(o,i){let a=document.elementFromPoint(o,i);return{testimId:a?a.getAttribute("testim_dom_element_id"):null,tagName:a?a.tagName:null}}let{value:n}=await this.driver.executeJS(r,e,t);return n}getLocation(){return this.driver.getUrl()}async stopListeningToScroll(){}async resumeListeningToScroll(){}scrollToPosition(e){return this.driver.scroll(e.x,e.y)}scrollToPositionWithoutAnimation(e){function t(r){return"scrollBehavior"in document.documentElement.style?window.scrollTo({left:r.x,top:r.y,behavior:"instant"}):window.scrollTo(r.x,r.y)}return this.driver.executeJS(t,e)}async getCurrentScrollPosition(){function e(){return{x:window.scrollX,y:window.scrollY}}let{value:t}=await this.driver.executeJS(e);return t}navigate(e,t=15e3){let r=async(n=3)=>{try{await this.driver.url(e)}catch(o){let i=o.message.includes("method IWebBrowser2::Navigate2() failed");if(o.seleniumStack&&i&&n>0)return Yh.warn("selenium navigation failed. retrying to navigate",{err:o}),await oe(1500),r(n-1);throw!o.seleniumStack&&i&&Yh.warn("selenium navigation failed. Due to wdio7 the error is unhandled",{err:o}),o}};return Promise.race([r(),oe(t)])}reloadTab(e=15e3){return Promise.race([this.driver.reloadTab(),oe(e)])}async getZoom(){function e(){return{zoomLevel:window.outerWidth/window.innerWidth}}let{value:t}=await this.driver.executeJS(e);return t}getViewportSize(){return this.driver.getViewportSize()}maximizeWithoutValidation(){return this.driver.maximizeWithoutValidation()}async getFullPageSize(){function e(){let r=document.body,n=document.documentElement,o=Math.max(r.scrollHeight,r.offsetHeight,n.clientHeight,n.scrollHeight,n.offsetHeight),i=Math.max(r.scrollWidth,r.offsetWidth,n.clientWidth,n.scrollWidth,n.offsetWidth);return{height:o,width:i}}let{value:t}=await this.driver.executeJS(e);return t}async extractToNewWindow(){}async checkSize(e){await oe(1e3);let t=await this.getViewportSize();if(t.width!==e.width||t.height!==e.height)throw Object.assign(new Error("checkSize failed"),{actualSize:t,expectedSize:e});return{actualSize:t,expectedSize:e}}async setViewportSize(e){return await this.driver.setViewportSize(e.width,e.height),await this.checkSize(e)}async validatePageIsAvailable(){function e(){let r;if(typeof location<"u")r=location;else if(typeof window<"u"&&window.location!==void 0)r=window.location;else return!1;return r.href!=="chrome-error://chromewebdata/"&&r.href!=="safari-resource:/ErrorPage.html"&&r.href.indexOf("res://ieframe.dll/http_404.htm")!==0&&r.href.indexOf("ms-appx-web://microsoft.microsoftedge/assets/errorpages/")!==0}if(!(await this.driver.executeJS(e)).value)throw new Rt("validatePageIsAvailable:PageNotAvailableError")}focusTab(){return this.driver.switchTab(this.id)}quit(){}async getOsAndBrowser(){let e=await(0,ap.default)(()=>this.driver.getBrowserAndOS(),{retries:3,factor:1});return{uaBrowserName:e.browser,uaOs:e.os,userAgent:e.userAgent,browserVersion:e.browserVersion}}getUserAgentInfo(){return(0,ap.default)(()=>this.driver.getUserAgentInfo(),{retries:3,factor:1})}}});var lp,bs,up=w(()=>{"use strict";j();lp=C("cookies-utils"),bs=class{constructor(e){this.driver=e}async set(e){let t=e.domain;!e.hostOnly&&t&&!t.startsWith(".")&&(t=`.${t}`);try{return await this.driver.setCookie(e.name,e.value,t,e.httpOnly,e.secure,e.path,e.expirationDate)}catch(r){throw lp.error("failed to set cookie",{err:r}),r}}async get(e){try{return await this.driver.getCookie(e.name)}catch(t){throw lp.error("failed to get cookie",{err:t}),t}}async remove(e){try{return await this.driver.deleteCookie(e.name)}catch(t){throw lp.error("failed to remove cookie",{err:t}),t}}}});var pp,Wi,Xh=w(()=>{"use strict";pp=S(require("p-retry")),Wi=class{constructor(e,t,r={takeScreenshots:!0}){this.tabId=e;this.driver=t;this.options=r;this.screencastHandler=void 0}base64AddPadding(e){return e+Array((4-e.length%4)%4+1).join("=")}shouldTakeScreenshots(){return typeof this.options.takeScreenshots!="boolean"?!0:this.options.takeScreenshots}async takeScreenshot(){if(!this.shouldTakeScreenshots())return{devicePixelRatio:1,image:""};let e=3,t=2e3,r=this.currentDevicePixelRatio||this.getDevicePixelRatio(),n=()=>Promise.all([r,this.driver.takeScreenshot()]),[o,i]=await(0,pp.default)(n,{retries:e,minTimeout:t,factor:1}),a=i?i.value:"";return{image:`data:image/png;base64,${this.base64AddPadding(a.replace(/[\r\n]/g,""))}`,devicePixelRatio:o}}async takeElementScreenshot(e){if(!this.shouldTakeScreenshots())return{devicePixelRatio:1,image:""};let t=3,r=2e3,n=this.currentDevicePixelRatio?Promise.resolve(this.currentDevicePixelRatio):this.getDevicePixelRatio(),o=()=>Promise.all([n,this.driver.takeElementScreenshot(e)]),[i,a]=await(0,pp.default)(o,{retries:t,minTimeout:r,factor:1}),l=a||"";return{image:`data:image/png;base64,${this.base64AddPadding(l.replace(/[\r\n]/g,""))}`,devicePixelRatio:i}}async getDevicePixelRatio(){function e(){try{return window.devicePixelRatio}catch{return 1}}let{value:t}=await this.driver.executeJS(e);return t}forcePixelRatio(e=1){return this.currentDevicePixelRatio=e,Promise.resolve()}getCurrentDevicePixelRatio(){return this.currentDevicePixelRatio}}});async function Qh(s,e){let t=e.image||e,r=e.devicePixelRatio;if(!t)throw new Error("Failed to get image");let n=t.match(/^data:[^;]*;base64,(.*)$/);if(!n)throw new Error("Image is not in base64 format");let o=s.offset||{top:0,left:0};if(o.top*=r,o.left*=r,!s.elementRect)return NE.warn("missing elementRect",ey.omit(s,"image")),{};let{elementRect:i}=s,a=await Ts.default.read(Buffer.from(n[1],"base64")),l=i.left*r+o.left*r,c=i.top*r+o.top*r,d=i.width*r,m=i.height*r;l<0&&(d+=l,d=d<0?0:d,l=0),c<0&&(m+=c,m=m<0?0:m,c=0);let u=a.bitmap.width,f=a.bitmap.height;if(l+d>u&&(d=u-l),c+m>f&&(m=f-c),m<=0||d<=0)throw new dp("height or width is equal or lower than zero");return{elementImage:await a.crop(l,c,d,m).getBase64Async(Ts.default.MIME_PNG)}}async function UE(s,e){let t=await Ts.default.read(s.width,s.height);for(let n of e){let o=n.image.match(/^data:[^;]*;base64,(.*)$/),i=await Ts.default.read(Buffer.from(o[1],"base64"));await new Promise((a,l)=>{t.composite(i,n.position.left,n.position.top,c=>{if(c){l(c);return}a()})})}return await t.getBase64Async(Ts.default.MIME_PNG)}function FE(s,e){return UE(s,e)}async function BE(){}async function jE(s){function e(o){let i=s[o];return typeof i=="string"&&i.startsWith("data")}async function t(o){let i=await BE(s[o]);return{key:o,url:i}}let r=await ie(Object.keys(s).filter(e),t),n=Object.fromEntries(r.map(o=>[o.key,o.url]));return Object.assign(s,n)}function Zh(s,e){return e||=1,s||={left:0,top:0,width:0,height:0},{left:e*Math.round(s.left),top:e*Math.round(s.top),width:e*Math.round(s.width),height:e*Math.round(s.height),pixelRatio:e}}var ey,Ts,NE,dp,Vi,ty=w(()=>{"use strict";ey=S(require("lodash"));F();Ts=S(require("jimp"));j();NE=C("image-capture-utils"),dp=class extends Error{constructor(){super(...arguments);this.rectIsOutsideOfImageError=!0}};Vi=class{constructor(e,t,r){this.windowUtils=t;this.screenshotUtils=r}async takeViewPortImage(){let e=await this.screenshotUtils.takeScreenshot();return typeof e=="string"?e:e.image}takeImageForComparison(){return this.takeViewPortImage()}async takeAreaDataUrl(e){let t=await this.screenshotUtils.takeScreenshot(),r=await Qh(e,t);return Object.assign(r,{screenImage:t.image,absoluteScreenHighlight:Zh(e.elementRect,t.devicePixelRatio)})}async takeElementImage(e){let t=await this.screenshotUtils.takeElementScreenshot({ELEMENT:e});return{elementImage:typeof t=="string"?t:t.image}}async takeArea(e){let t=await this.screenshotUtils.takeScreenshot();return jE({screenImage:t.image,absoluteScreenHighlight:Zh(e.elementRect,t.devicePixelRatio)})}forcePixelRatio(e){return this.screenshotUtils.forcePixelRatio(e)}getCurrentDevicePixelRatio(){return this.screenshotUtils.getCurrentDevicePixelRatio()}async takeStitchedDataUrl(e){let{windowUtils:t,screenshotUtils:r}=this,n=()=>oe(250),o=Boolean(e);async function i(u,f){o?await t.scrollToPositionWithoutAnimation(u):await t.scrollToPosition(u),await n();let h=await r.takeScreenshot(),g=await Qh({elementRect:f},h);return{position:{left:u.x+f.left,top:u.y+f.top},size:{width:f.width,height:f.height},image:g.elementImage}}async function a(u){let f=[];for(let h of u){let g=await i(h.scrollPos,h.cropData);f.push(g)}return f}function l(u,f){let h=Math.max(u.width,f.width),g=f.width,y=Math.max(u.height,f.height),T=f.height,R=Array.from({length:Math.ceil(h/g)},(v,I)=>({scrollX:Math.min(I*g,h-g),cropX:I*g-Math.min(I*g,h-g),cropW:g-(I*g-Math.min(I*g,h-g))})),b=Array.from({length:Math.ceil(y/T)},(v,I)=>({scrollY:Math.min(I*T,y-T),cropY:I*T-Math.min(I*T,y-T),cropH:T-(I*T-Math.min(I*T,y-T))}));return R.flatMap(v=>b.map(I=>({scrollPos:{x:v.scrollX,y:I.scrollY},cropData:{top:I.cropY,left:v.cropX,width:v.cropW,height:I.cropH}})))}async function c(u,f){let h=await t.getCurrentScrollPosition(),g=l(u,f),y=await a(g);return await t.scrollToPosition(h),FE(u,y)}let[d,m]=await Promise.all([t.getFullPageSize(),t.getViewportSize()]);return await c(d,m)}}});var ry,sy,Gi,Hi,ny=w(()=>{"use strict";ry=S(require("p-retry")),sy=S(require("semver"));F();j();cp();Xh();ty();we();Gi=C("tab-service"),Hi=class{constructor(e){this.driver=e;this.sessionTabs={};this._utils={};this.pendingTabs={};this.addedTabs={}}on(){}tabCount(e){if(this.sessionTabs[e])return this.sessionTabs[e].tabCount}getAllOpenTabIds(e){let t=this.getAllTabInfos(e);return Object.keys(t).filter(r=>!t[r].isClosed)}getActiveTabInfo(e){return this.sessionTabs[e].lastActiveTabInfo}getAllTabIds(e){return Object.keys(this.getAllTabInfos(e)).map(t=>t)}isSessionTab(e,t){return this.getAllTabIds(e).includes(t)}createSesion(e){this.sessionTabs[e]||(this.addedTabs[e]=new Set,this.sessionTabs[e]={pendingInfos:{},tabCount:0,tabInfos:{}})}setAddFrameHandlerCallBack(e){this.addFrameHandler=e}getAllTabInfoStrings(e){return this.getAllTabIds(e).map(r=>{let n=this.getTabInfo(e,r);return`tabId=${r}, url=${n.url}, order=${n.order}, isMain=${n.isMain}, openerStepId=${n.openerStepId}, isClosed=${n.isClosed}, currentUrl: ${n.currentUrl}, lastUpdatedUrl: ${n.lastUpdatedUrl}`})}getAllTabInfos(e){return this.sessionTabs[e].tabInfos}async addNewTab(e,t,r,n){if(!this.addedTabs[e].has(t))return this.addedTabs[e].add(t),Gi.info(`Adding a new tab sessionId: ${e}, tabId: ${t}, openerId: ${r}`),this.addTab(e,t,this.sessionTabs[e].tabCount++,r,n)}addOpenerStepId(e,t,r){this.sessionTabs[e].tabInfos[t].openerStepId=r}addOpenerStep(e,t,r){this.sessionTabs[e].tabInfos[t].openerStepId=r.id,this.sessionTabs[e].tabInfos[t].openerOriginalStepId=r.originalStepId}fixMissingMainTab(e){if(this.getMainTabInfo(e))return;let r=this.getAllTabInfos(e);Object.keys(r).length!==0&&(Object.values(this.getAllTabInfos(e))[0].isMain=!0)}async buildTabInfo(e,t,r,n,o={}){let i=await this.getTabDetails(t,e,o),a=se();function l(c){return o.checkForMainTab?i.isMainTab:!i.isMainTab||i.isMainTab==="unknown"?!c.getMainTabInfo(e):i.isMainTab}return this.sessionTabs[e].tabInfos[t]={infoId:a,url:i.url,title:i.title,favIconUrl:i.favIconUrl,order:r,from:this.getTabInfo(e,i.openerTabId),isMain:l(this),openerStepId:n},a}async addTab(e,t,r,n,o={}){let i=await this.buildTabInfo(e,t,r,n,o),a=new ys(t,this.driver);this._utils[i]={attachDebugger:()=>Promise.resolve(),detachDebugger:()=>Promise.resolve(),onDebuggerDetached:()=>{},tabId:t,domUtils:{getDOM:async()=>{}},windowUtils:a,imageCaptureUtils:new Vi(t,a,new Wi(t,this.driver,{takeScreenshots:o.takeScreenshots}))}}getTabUtilsByTabIdAndSessionId(e,t){let r=this.sessionTabs[e].tabInfos[t];return this._utils[r.infoId]}getTabUtilsByTabId(e){let t=Object.keys(this._utils).find(r=>this._utils[r].tabId===e);return this._utils[t]}getTabInfo(e,t){return this.sessionTabs[e].tabInfos[t]}getTabUtils(e,t){if(!t)return this.getMainTabUtils(e);if(this._utils[t.infoId])return this._utils[t.infoId];if(t.isMain)return this.getMainTabUtils(e);let r=this.getAllTabInfos(e),n=Object.keys(r).map(i=>r[i]).filter(i=>!i.isMain);if(n.length===1)return this._utils[n[0].infoId];let o=Object.keys(e).map(i=>e[i]).filter(i=>this.isSameTab(e,t,i));return o.length>0?this._utils[o[0].infoId]:this.getMainTabUtils(e)}exactUrlMatch(e,t,r){let n=r.filter(o=>o===t.url);return!!((e.url===t.url||e.currentUrl===t.url||e.currentUrl&&e.currentUrl===t.currentUrl)&&n.length===1)}singleExactMatchForParts(e,t,r,n){let{urlUtils:o}=Q(),i=o.urlBreaker(e.url||e.currentUrl),a=o.urlBreaker(t.url||t.currentUrl),l=n(i),c=n(a),d=r.map(m=>o.urlBreaker(m)).map(m=>n(m)).filter(m=>m===l);return l===c&&d.length===1}isSameTab(e,t,r){let{tabMatcher:n}=Q();if(n){let c=this.getAllTabInfos(e),d=Object.keys(c).map(m=>c[m]);return n.isSameTab(d,t,r)}if(t.isMain&&r.isMain||t.openerStepId&&r.openerStepId&&t.openerStepId===r.openerStepId)return!0;let o=this.getAllTabInfos(e),i=Object.keys(o).map(c=>o[c].url);if(this.exactUrlMatch(t,r,i))return!0;let a=c=>`${c.domain}/${c.path.join("/")}`;if(this.singleExactMatchForParts(t,r,i,a))return!0;let l=c=>`${c.domain}/${c.path.join("/")}#${c.hash}`;return!!(this.singleExactMatchForParts(t,r,i,l)||t.order===r.order)}getMainTabInfo(e){let t=this.getAllTabInfos(e);return Object.keys(t).map(r=>t[r]).find(r=>r.isMain)}getMainTabUtils(e){let t=this.getMainTabInfo(e);return t?this.getTabUtils(e,t):{}}removeTabInfo(e,t){let n=this.getAllTabInfos(e)[t];delete this.sessionTabs[e].tabInfos[t],delete this._utils[n.infoId],this.sessionTabs[e].tabCount--}getMainTabId(e){let t=this.getAllTabInfos(e);return Object.keys(t).find(r=>t[r].isMain)}async isMainTabExists(e){let t=this.getMainTabId(e);return Boolean(t)}clearAllTabs(e){let t=this.getAllTabInfos(e);this.sessionTabs[e].tabCount=0,Object.keys(t).forEach(r=>this.removeTabInfo(e,r))}clearNonMainTabs(e){let t=this.getAllTabInfos(e);Object.keys(t).filter(r=>!t[r].isMain).forEach(r=>this.removeTabInfo(e,r)),this.sessionTabs[e].tabCount=1}async switchTab(e,t,{forceSwitch:r=!1}={}){let n=this.sessionTabs[t]?this.sessionTabs[t].tabCount:1;if(typeof n=="number"&&n>1||r)return this.driver.switchTab(e)}async getTabDetails(e,t,r={}){try{if(await this.switchTab(e,t,r),r.skipLoadInfo)return{title:"",url:""};let n=Promise.resolve("unknown");r.checkForMainTab&&(n=this.driver.executeJS("return window.__isMainTestimTab").then(o=>o.value));try{let[o,i,a]=await Promise.all([this.driver.getTitle(),this.driver.getUrl(),n]);return{title:o,url:i,isMainTab:a}}catch(o){Gi.error("failed to get url or title",{err:o})}}catch(n){Gi.error("failed to switch to tab",{tabId:e,err:n})}return{title:"",url:""}}async getUnregisteredTabId(e){return(await this.driver.getTabIds()).find(r=>!this.getAllTabIds(e).includes(r))}async waitForTabToOpen(e){let t=await this.getUnregisteredTabId(e);return t||(await oe(500),await this.waitForTabToOpen(e))}async tryToAddTab(e){if(this.pendingTabs[e])return;let t=await this.getUnregisteredTabId(e);t&&(await this.addNewTab(e,t),await this.addFrameHandler(t),Object.assign(this.sessionTabs[e],{currentTab:null}))}async addNewPopup(e,t){let r=this.getAllTabInfos(e);if(Object.keys(r).find(i=>r[i].openerStepId===t))return;if(this.pendingTabs[e]){Gi.info(`overriding opener step id from ${this.pendingTabs[e]} to ${t}`),this.pendingTabs[e]=t;return}this.pendingTabs[e]=t;let o=await this.waitForTabToOpen(e);await this.addNewTab(e,o,this.pendingTabs[e]),this.addFrameHandler(o),delete this.pendingTabs[e],Object.assign(this.sessionTabs[e],{currentTab:null})}async waitToPendingTabs(e,t){if(t)return(0,ry.default)(()=>{if(this.pendingTabs[e]===t)throw new Error("awaiting pending tabs")},{retries:5,factor:1,minTimeout:500,maxTimeout:500}).catch(()=>{})}async isMainTabIncognito(){return!1}isInvalidStepVersion(e){let t=sy.lt(e._version||e.version,"1.2.0"),r=!!e.parameterValues,n=r&&e.parameterValues.some(o=>o.type==="locate"&&!o.frameLocators);return t&&(!r||n)}async getTabIdByTabInfo(e,t){var l,c;let{tabMatcher:r,commonConstants:n}=Q();if(this.isInvalidStepVersion(t))throw Object.assign(new Error(""),{success:!1,shouldRetry:!1,errorType:n.stepResult.INVALID_TEST_VERSION});if((l=t.useCurrentTab)!=null&&l.call(t)){let d=await this.driver.getCurrentTabId();if(d)return d;let m=this.getMainTabId(e);if(m)return m;throw new Error("Current tab not found")}let o=(c=t.tabInfo)==null?void 0:c.openerStepId;await this.waitToPendingTabs(e,o);let i=this.getAllTabIds(e).map(d=>({...this.getTabInfo(e,d),tabId:d})).filter(d=>!d.isClosed),a=r.matchTabs(t,i);if(!a)throw await this.tryToAddTab(e),new Error("No tab ID found");if(this.sessionTabs[e].currentTab===a)return a;try{return await this.switchTab(a,e),Object.assign(this.sessionTabs[e],{currentTab:a}),a}catch(d){let m=["no such window","no window found","the window could not be found"];if(d.message&&m.some(u=>d.message.toLowerCase().includes(u)))return this.sessionTabs[e].tabCount--,this.sessionTabs[e].tabInfos[a].isClosed=!0,this.getTabIdByTabInfo(e,t);throw d}}}});var mp,qi,fp=w(()=>{"use strict";mp=class{select(){return console.log(`
|
|
219
|
+
problems between the Testim CLI and the grid running the test. Please check your network connection.`}:/SeleniumError: connect ECONNREFUSED/.test(h.message)||/Couldn't connect to selenium server/.test(h.message)?{errorType:cr,reason:"Failed to connect to the grid, please check if the grid is accessible from your network"}:/terminated due to FORWARDING_TO_NODE_FAILED/.test(h.message)?{errorType:cr,reason:"Session terminated, it is likely that the grid is out of memory or not responding, please try to rerun the test"}:/terminated due to PROXY_REREGISTRATION/.test(h.message)?{errorType:cr,reason:"Session terminated, it is likely that the grid is not responding, please try to rerun the test"}:/forwarding the new session cannot find : Capabilities/.test(h.message)?{errorType:cr,reason:`Session could not be created, please check that the ${y} you requested is supported in your plan`}:{errorType:kE,reason:T}},i=async(h,g)=>{var v;let y=await bc();!y&&L.flags.warnOnBadNetwork.isEnabled()&&console.warn(r()),St.warn("error on run",{err:h});let T=(v=this.userData)==null?void 0:v.projectId,{errorType:R,reason:b}=this.options.mode===ee.APPIUM?n(h):o(h,y);Wo(T,this.testResultId,this.testId,{status:js.COMPLETED,success:!1,reason:b,errorType:R,testRetryKey:g.retryKey,setupStepResult:{status:js.COMPLETED,success:!1,reason:b,errorType:R}},g.remoteRunId),await t(DE(this.testId,this.testName,this.testResultId,b),g,h)},a=async(h,g)=>{var v;let y=this.testId,T=this.testResultId,R=(v=this.userData)==null?void 0:v.projectId,b=this.branch;if(!y||!T||!R||!b)return St.warn("Test failed. Not enough data to recover results via API",{err:h}),i(h,g);try{let I=await Sr(y,T,R,b);if(St.warn("Test failed. Got results via API",{err:h,testResult:Kh.default.omit(I,ME),resultId:T}),I&&I.status===js.COMPLETED&&!h.message.includes(np))return await t(I,g);throw h}catch(I){return I!==h&&St.error("Failed to fetch test results from server",{testId:y,resultId:T,projectId:R,branch:b,err:I}),i(h,g)}},l=this.options.disableSockets||((u=this.options.lightweightMode)==null?void 0:u.disableResults)&&(this.options.useChromeLauncher||this.options.mode!=="extension"),c=this.options.disableSockets||((f=this.options.lightweightMode)==null?void 0:f.disableRemoteStep),d=async(h,g)=>{try{await Promise.all([!c&&hs.joinToRemoteStep(this.testResultId),!l&&Lt.joinToTestResult(this.testResultId,this.testId)]),this.options.mode!==ee.APPIUM&&h.validateRunConfig();let y=await this.runTest(h,this.customExtensionLocalLocation,g),T=await t(y,h);return N("After onRunComplete"),T}catch(y){return a(y,h)}finally{c||hs.unlistenToRemoteStep(this.testResultId)}},m=this.executionQueue.getNext();return m?(this.testId=m.testId,this.testName=m.testName,this.testResultId=m.testResultId,this.overrideTestConfigId=m.overrideTestConfigId,this.testRunConfig=m.runConfig,this.branch=m.branch,d(m)):this.onQueueCompleted()}}});var ap,Yh,ys,cp=w(()=>{"use strict";F();ap=S(require("p-retry"));F();j();K();Yh=C("window-utils"),ys=class{constructor(e,t){this.id=e;this.driver=t}async getElementFromPoint(e,t){function r(o,i){let a=document.elementFromPoint(o,i);return{testimId:a?a.getAttribute("testim_dom_element_id"):null,tagName:a?a.tagName:null}}let{value:n}=await this.driver.executeJS(r,e,t);return n}getLocation(){return this.driver.getUrl()}async stopListeningToScroll(){}async resumeListeningToScroll(){}scrollToPosition(e){return this.driver.scroll(e.x,e.y)}scrollToPositionWithoutAnimation(e){function t(r){return"scrollBehavior"in document.documentElement.style?window.scrollTo({left:r.x,top:r.y,behavior:"instant"}):window.scrollTo(r.x,r.y)}return this.driver.executeJS(t,e)}async getCurrentScrollPosition(){function e(){return{x:window.scrollX,y:window.scrollY}}let{value:t}=await this.driver.executeJS(e);return t}navigate(e,t=15e3){let r=async(n=3)=>{try{await this.driver.url(e)}catch(o){let i=o.message.includes("method IWebBrowser2::Navigate2() failed");if(o.seleniumStack&&i&&n>0)return Yh.warn("selenium navigation failed. retrying to navigate",{err:o}),await oe(1500),r(n-1);throw!o.seleniumStack&&i&&Yh.warn("selenium navigation failed. Due to wdio7 the error is unhandled",{err:o}),o}};return Promise.race([r(),oe(t)])}reloadTab(e=15e3){return Promise.race([this.driver.reloadTab(),oe(e)])}async getZoom(){function e(){return{zoomLevel:window.outerWidth/window.innerWidth}}let{value:t}=await this.driver.executeJS(e);return t}getViewportSize(){return this.driver.getViewportSize()}maximizeWithoutValidation(){return this.driver.maximizeWithoutValidation()}async getFullPageSize(){function e(){let r=document.body,n=document.documentElement,o=Math.max(r.scrollHeight,r.offsetHeight,n.clientHeight,n.scrollHeight,n.offsetHeight),i=Math.max(r.scrollWidth,r.offsetWidth,n.clientWidth,n.scrollWidth,n.offsetWidth);return{height:o,width:i}}let{value:t}=await this.driver.executeJS(e);return t}async extractToNewWindow(){}async checkSize(e){await oe(1e3);let t=await this.getViewportSize();if(t.width!==e.width||t.height!==e.height)throw Object.assign(new Error("checkSize failed"),{actualSize:t,expectedSize:e});return{actualSize:t,expectedSize:e}}async setViewportSize(e){return await this.driver.setViewportSize(e.width,e.height),await this.checkSize(e)}async validatePageIsAvailable(){function e(){let r;if(typeof location<"u")r=location;else if(typeof window<"u"&&window.location!==void 0)r=window.location;else return!1;return r.href!=="chrome-error://chromewebdata/"&&r.href!=="safari-resource:/ErrorPage.html"&&r.href.indexOf("res://ieframe.dll/http_404.htm")!==0&&r.href.indexOf("ms-appx-web://microsoft.microsoftedge/assets/errorpages/")!==0}if(!(await this.driver.executeJS(e)).value)throw new Rt("validatePageIsAvailable:PageNotAvailableError")}focusTab(){return this.driver.switchTab(this.id)}quit(){}async getOsAndBrowser(){let e=await(0,ap.default)(()=>this.driver.getBrowserAndOS(),{retries:3,factor:1});return{uaBrowserName:e.browser,uaOs:e.os,userAgent:e.userAgent,browserVersion:e.browserVersion}}getUserAgentInfo(){return(0,ap.default)(()=>this.driver.getUserAgentInfo(),{retries:3,factor:1})}}});var lp,bs,up=w(()=>{"use strict";j();lp=C("cookies-utils"),bs=class{constructor(e){this.driver=e}async set(e){let t=e.domain;!e.hostOnly&&t&&!t.startsWith(".")&&(t=`.${t}`);try{return await this.driver.setCookie(e.name,e.value,t,e.httpOnly,e.secure,e.path,e.expirationDate)}catch(r){throw lp.error("failed to set cookie",{err:r}),r}}async get(e){try{return await this.driver.getCookie(e.name)}catch(t){throw lp.error("failed to get cookie",{err:t}),t}}async remove(e){try{return await this.driver.deleteCookie(e.name)}catch(t){throw lp.error("failed to remove cookie",{err:t}),t}}}});var pp,Wi,Xh=w(()=>{"use strict";pp=S(require("p-retry")),Wi=class{constructor(e,t,r={takeScreenshots:!0}){this.tabId=e;this.driver=t;this.options=r;this.screencastHandler=void 0}base64AddPadding(e){return e+Array((4-e.length%4)%4+1).join("=")}shouldTakeScreenshots(){return typeof this.options.takeScreenshots!="boolean"?!0:this.options.takeScreenshots}async takeScreenshot(){if(!this.shouldTakeScreenshots())return{devicePixelRatio:1,image:""};let e=3,t=2e3,r=this.currentDevicePixelRatio||this.getDevicePixelRatio(),n=()=>Promise.all([r,this.driver.takeScreenshot()]),[o,i]=await(0,pp.default)(n,{retries:e,minTimeout:t,factor:1}),a=i?i.value:"";return{image:`data:image/png;base64,${this.base64AddPadding(a.replace(/[\r\n]/g,""))}`,devicePixelRatio:o}}async takeElementScreenshot(e){if(!this.shouldTakeScreenshots())return{devicePixelRatio:1,image:""};let t=3,r=2e3,n=this.currentDevicePixelRatio?Promise.resolve(this.currentDevicePixelRatio):this.getDevicePixelRatio(),o=()=>Promise.all([n,this.driver.takeElementScreenshot(e)]),[i,a]=await(0,pp.default)(o,{retries:t,minTimeout:r,factor:1}),l=a||"";return{image:`data:image/png;base64,${this.base64AddPadding(l.replace(/[\r\n]/g,""))}`,devicePixelRatio:i}}async getDevicePixelRatio(){function e(){try{return window.devicePixelRatio}catch{return 1}}let{value:t}=await this.driver.executeJS(e);return t}forcePixelRatio(e=1){return this.currentDevicePixelRatio=e,Promise.resolve()}getCurrentDevicePixelRatio(){return this.currentDevicePixelRatio}}});async function Qh(s,e){let t=e.image||e,r=e.devicePixelRatio;if(!t)throw new Error("Failed to get image");let n=t.match(/^data:[^;]*;base64,(.*)$/);if(!n)throw new Error("Image is not in base64 format");let o=s.offset||{top:0,left:0};if(o.top*=r,o.left*=r,!s.elementRect)return NE.warn("missing elementRect",ey.omit(s,"image")),{};let{elementRect:i}=s,a=await Ts.default.read(Buffer.from(n[1],"base64")),l=i.left*r+o.left*r,c=i.top*r+o.top*r,d=i.width*r,m=i.height*r;l<0&&(d+=l,d=d<0?0:d,l=0),c<0&&(m+=c,m=m<0?0:m,c=0);let u=a.bitmap.width,f=a.bitmap.height;if(l+d>u&&(d=u-l),c+m>f&&(m=f-c),m<=0||d<=0)throw new dp("height or width is equal or lower than zero");return{elementImage:await a.crop(l,c,d,m).getBase64Async(Ts.default.MIME_PNG)}}async function UE(s,e){let t=await Ts.default.read(s.width,s.height);for(let n of e){let o=n.image.match(/^data:[^;]*;base64,(.*)$/),i=await Ts.default.read(Buffer.from(o[1],"base64"));await new Promise((a,l)=>{t.composite(i,n.position.left,n.position.top,c=>{if(c){l(c);return}a()})})}return await t.getBase64Async(Ts.default.MIME_PNG)}function FE(s,e){return UE(s,e)}async function BE(){}async function jE(s){function e(o){let i=s[o];return typeof i=="string"&&i.startsWith("data")}async function t(o){let i=await BE(s[o]);return{key:o,url:i}}let r=await ie(Object.keys(s).filter(e),t),n=Object.fromEntries(r.map(o=>[o.key,o.url]));return Object.assign(s,n)}function Zh(s,e){return e||=1,s||={left:0,top:0,width:0,height:0},{left:e*Math.round(s.left),top:e*Math.round(s.top),width:e*Math.round(s.width),height:e*Math.round(s.height),pixelRatio:e}}var ey,Ts,NE,dp,Vi,ty=w(()=>{"use strict";ey=S(require("lodash"));F();Ts=S(require("jimp"));j();NE=C("image-capture-utils"),dp=class extends Error{constructor(){super(...arguments);this.rectIsOutsideOfImageError=!0}};Vi=class{constructor(e,t,r){this.windowUtils=t;this.screenshotUtils=r}async takeViewPortImage(){let e=await this.screenshotUtils.takeScreenshot();return typeof e=="string"?e:e.image}takeImageForComparison(){return this.takeViewPortImage()}async takeAreaDataUrl(e){let t=await this.screenshotUtils.takeScreenshot(),r=await Qh(e,t);return Object.assign(r,{screenImage:t.image,absoluteScreenHighlight:Zh(e.elementRect,t.devicePixelRatio)})}async takeElementImage(e){let t=await this.screenshotUtils.takeElementScreenshot({ELEMENT:e});return{elementImage:typeof t=="string"?t:t.image}}async takeArea(e){let t=await this.screenshotUtils.takeScreenshot();return jE({screenImage:t.image,absoluteScreenHighlight:Zh(e.elementRect,t.devicePixelRatio)})}forcePixelRatio(e){return this.screenshotUtils.forcePixelRatio(e)}getCurrentDevicePixelRatio(){return this.screenshotUtils.getCurrentDevicePixelRatio()}async takeStitchedDataUrl(e){let{windowUtils:t,screenshotUtils:r}=this,n=()=>oe(250),o=Boolean(e);async function i(u,f){o?await t.scrollToPositionWithoutAnimation(u):await t.scrollToPosition(u),await n();let h=await r.takeScreenshot(),g=await Qh({elementRect:f},h);return{position:{left:u.x+f.left,top:u.y+f.top},size:{width:f.width,height:f.height},image:g.elementImage}}async function a(u){let f=[];for(let h of u){let g=await i(h.scrollPos,h.cropData);f.push(g)}return f}function l(u,f){let h=Math.max(u.width,f.width),g=f.width,y=Math.max(u.height,f.height),T=f.height,R=Array.from({length:Math.ceil(h/g)},(v,I)=>({scrollX:Math.min(I*g,h-g),cropX:I*g-Math.min(I*g,h-g),cropW:g-(I*g-Math.min(I*g,h-g))})),b=Array.from({length:Math.ceil(y/T)},(v,I)=>({scrollY:Math.min(I*T,y-T),cropY:I*T-Math.min(I*T,y-T),cropH:T-(I*T-Math.min(I*T,y-T))}));return R.flatMap(v=>b.map(I=>({scrollPos:{x:v.scrollX,y:I.scrollY},cropData:{top:I.cropY,left:v.cropX,width:v.cropW,height:I.cropH}})))}async function c(u,f){let h=await t.getCurrentScrollPosition(),g=l(u,f),y=await a(g);return await t.scrollToPosition(h),FE(u,y)}let[d,m]=await Promise.all([t.getFullPageSize(),t.getViewportSize()]);return await c(d,m)}}});var ry,sy,Gi,Hi,ny=w(()=>{"use strict";ry=S(require("p-retry")),sy=S(require("semver"));F();j();cp();Xh();ty();we();Gi=C("tab-service"),Hi=class{constructor(e){this.driver=e;this.sessionTabs={};this._utils={};this.pendingTabs={};this.addedTabs={}}on(){}tabCount(e){if(this.sessionTabs[e])return this.sessionTabs[e].tabCount}getAllOpenTabIds(e){let t=this.getAllTabInfos(e);return Object.keys(t).filter(r=>!t[r].isClosed)}getActiveTabInfo(e){return this.sessionTabs[e].lastActiveTabInfo}getAllTabIds(e){return Object.keys(this.getAllTabInfos(e)).map(t=>t)}isSessionTab(e,t){return this.getAllTabIds(e).includes(t)}createSesion(e){this.sessionTabs[e]||(this.addedTabs[e]=new Set,this.sessionTabs[e]={pendingInfos:{},tabCount:0,tabInfos:{}})}setAddFrameHandlerCallBack(e){this.addFrameHandler=e}getAllTabInfoStrings(e){return this.getAllTabIds(e).map(r=>{let n=this.getTabInfo(e,r);return`tabId=${r}, url=${n.url}, order=${n.order}, isMain=${n.isMain}, openerStepId=${n.openerStepId}, isClosed=${n.isClosed}, currentUrl: ${n.currentUrl}, lastUpdatedUrl: ${n.lastUpdatedUrl}`})}getAllTabInfos(e){return this.sessionTabs[e].tabInfos}async addNewTab(e,t,r,n){if(!this.addedTabs[e].has(t))return this.addedTabs[e].add(t),Gi.info(`Adding a new tab sessionId: ${e}, tabId: ${t}, openerId: ${r}`),this.addTab(e,t,this.sessionTabs[e].tabCount++,r,n)}addOpenerStepId(e,t,r){this.sessionTabs[e].tabInfos[t].openerStepId=r}addOpenerStep(e,t,r){this.sessionTabs[e].tabInfos[t].openerStepId=r.id,this.sessionTabs[e].tabInfos[t].openerOriginalStepId=r.originalStepId}fixMissingMainTab(e){if(this.getMainTabInfo(e))return;let r=this.getAllTabInfos(e);Object.keys(r).length!==0&&(Object.values(this.getAllTabInfos(e))[0].isMain=!0)}async buildTabInfo(e,t,r,n,o={}){let i=await this.getTabDetails(t,e,o),a=se();function l(c){return o.checkForMainTab?i.isMainTab:!i.isMainTab||i.isMainTab==="unknown"?!c.getMainTabInfo(e):i.isMainTab}return this.sessionTabs[e].tabInfos[t]={infoId:a,url:i.url,title:i.title,favIconUrl:i.favIconUrl,order:r,from:this.getTabInfo(e,i.openerTabId),isMain:l(this),openerStepId:n},a}async addTab(e,t,r,n,o={}){let i=await this.buildTabInfo(e,t,r,n,o),a=new ys(t,this.driver);this._utils[i]={attachDebugger:()=>Promise.resolve(),detachDebugger:()=>Promise.resolve(),onDebuggerDetached:()=>{},tabId:t,domUtils:{getDOM:async()=>{}},windowUtils:a,imageCaptureUtils:new Vi(t,a,new Wi(t,this.driver,{takeScreenshots:o.takeScreenshots}))}}getTabUtilsByTabIdAndSessionId(e,t){let r=this.sessionTabs[e].tabInfos[t];return this._utils[r.infoId]}getTabUtilsByTabId(e){let t=Object.keys(this._utils).find(r=>this._utils[r].tabId===e);return this._utils[t]}getTabInfo(e,t){return this.sessionTabs[e].tabInfos[t]}getTabUtils(e,t){if(!t)return this.getMainTabUtils(e);if(this._utils[t.infoId])return this._utils[t.infoId];if(t.isMain)return this.getMainTabUtils(e);let r=this.getAllTabInfos(e),n=Object.keys(r).map(i=>r[i]).filter(i=>!i.isMain);if(n.length===1)return this._utils[n[0].infoId];let o=Object.keys(e).map(i=>e[i]).filter(i=>this.isSameTab(e,t,i));return o.length>0?this._utils[o[0].infoId]:this.getMainTabUtils(e)}exactUrlMatch(e,t,r){let n=r.filter(o=>o===t.url);return!!((e.url===t.url||e.currentUrl===t.url||e.currentUrl&&e.currentUrl===t.currentUrl)&&n.length===1)}singleExactMatchForParts(e,t,r,n){let{urlUtils:o}=Q(),i=o.urlBreaker(e.url||e.currentUrl),a=o.urlBreaker(t.url||t.currentUrl),l=n(i),c=n(a),d=r.map(m=>o.urlBreaker(m)).map(m=>n(m)).filter(m=>m===l);return l===c&&d.length===1}isSameTab(e,t,r){let{tabMatcher:n}=Q();if(n){let c=this.getAllTabInfos(e),d=Object.keys(c).map(m=>c[m]);return n.isSameTab(d,t,r)}if(t.isMain&&r.isMain||t.openerStepId&&r.openerStepId&&t.openerStepId===r.openerStepId)return!0;let o=this.getAllTabInfos(e),i=Object.keys(o).map(c=>o[c].url);if(this.exactUrlMatch(t,r,i))return!0;let a=c=>`${c.domain}/${c.path.join("/")}`;if(this.singleExactMatchForParts(t,r,i,a))return!0;let l=c=>`${c.domain}/${c.path.join("/")}#${c.hash}`;return!!(this.singleExactMatchForParts(t,r,i,l)||t.order===r.order)}getMainTabInfo(e){let t=this.getAllTabInfos(e);return Object.keys(t).map(r=>t[r]).find(r=>r.isMain)}getMainTabUtils(e){let t=this.getMainTabInfo(e);return t?this.getTabUtils(e,t):{}}removeTabInfo(e,t){let n=this.getAllTabInfos(e)[t];delete this.sessionTabs[e].tabInfos[t],delete this._utils[n.infoId],this.sessionTabs[e].tabCount--}getMainTabId(e){let t=this.getAllTabInfos(e);return Object.keys(t).find(r=>t[r].isMain)}async isMainTabExists(e){let t=this.getMainTabId(e);return Boolean(t)}clearAllTabs(e){let t=this.getAllTabInfos(e);this.sessionTabs[e].tabCount=0,Object.keys(t).forEach(r=>this.removeTabInfo(e,r))}clearNonMainTabs(e){let t=this.getAllTabInfos(e);Object.keys(t).filter(r=>!t[r].isMain).forEach(r=>this.removeTabInfo(e,r)),this.sessionTabs[e].tabCount=1}async switchTab(e,t,{forceSwitch:r=!1}={}){let n=this.sessionTabs[t]?this.sessionTabs[t].tabCount:1;if(typeof n=="number"&&n>1||r)return this.driver.switchTab(e)}async getTabDetails(e,t,r={}){try{if(await this.switchTab(e,t,r),r.skipLoadInfo)return{title:"",url:""};let n=Promise.resolve("unknown");r.checkForMainTab&&(n=this.driver.executeJS("return window.__isMainTestimTab").then(o=>o.value));try{let[o,i,a]=await Promise.all([this.driver.getTitle(),this.driver.getUrl(),n]);return{title:o,url:i,isMainTab:a}}catch(o){Gi.error("failed to get url or title",{err:o})}}catch(n){Gi.error("failed to switch to tab",{tabId:e,err:n})}return{title:"",url:""}}async getUnregisteredTabId(e){return(await this.driver.getTabIds()).find(r=>!this.getAllTabIds(e).includes(r))}async waitForTabToOpen(e){let t=await this.getUnregisteredTabId(e);return t||(await oe(500),await this.waitForTabToOpen(e))}async tryToAddTab(e){if(this.pendingTabs[e])return;let t=await this.getUnregisteredTabId(e);t&&(await this.addNewTab(e,t),await this.addFrameHandler(t),Object.assign(this.sessionTabs[e],{currentTab:null}))}async addNewPopup(e,t){let r=this.getAllTabInfos(e);if(Object.keys(r).find(i=>r[i].openerStepId===t))return;if(this.pendingTabs[e]){Gi.info(`overriding opener step id from ${this.pendingTabs[e]} to ${t}`),this.pendingTabs[e]=t;return}this.pendingTabs[e]=t;let o=await this.waitForTabToOpen(e);await this.addNewTab(e,o,this.pendingTabs[e]),this.addFrameHandler(o),delete this.pendingTabs[e],Object.assign(this.sessionTabs[e],{currentTab:null})}async waitToPendingTabs(e,t){if(t)return(0,ry.default)(()=>{if(this.pendingTabs[e]===t)throw new Error("awaiting pending tabs")},{retries:5,factor:1,minTimeout:500,maxTimeout:500}).catch(()=>{})}async isMainTabIncognito(){return!1}isInvalidStepVersion(e){let t=sy.lt(e._version||e.version,"1.2.0"),r=!!e.parameterValues,n=r&&e.parameterValues.some(o=>o.type==="locate"&&!o.frameLocators);return t&&(!r||n)}async getTabIdByTabInfo(e,t){var l,c;let{tabMatcher:r,commonConstants:n}=Q();if(this.isInvalidStepVersion(t))throw Object.assign(new Error(""),{success:!1,shouldRetry:!1,errorType:n.stepResult.INVALID_TEST_VERSION});if((l=t.useCurrentTab)!=null&&l.call(t)){let d=await this.driver.getCurrentTabId();if(d)return d;let m=this.getMainTabId(e);if(m)return m;throw new Error("Current tab not found")}let o=(c=t.tabInfo)==null?void 0:c.openerStepId;await this.waitToPendingTabs(e,o),await this.tryToAddTab(e);let i=this.getAllTabIds(e).map(d=>({...this.getTabInfo(e,d),tabId:d})).filter(d=>!d.isClosed),a=r.matchTabs(t,i);if(!a)throw new Error("No tab ID found");if(this.sessionTabs[e].currentTab===a)return a;try{return await this.switchTab(a,e),Object.assign(this.sessionTabs[e],{currentTab:a}),a}catch(d){let m=["no such window","no window found","the window could not be found"];if(d.message&&m.some(u=>d.message.toLowerCase().includes(u)))return this.sessionTabs[e].tabCount--,this.sessionTabs[e].tabInfos[a].isClosed=!0,this.getTabIdByTabInfo(e,t);throw d}}}});var mp,qi,fp=w(()=>{"use strict";mp=class{select(){return console.log(`
|
|
220
220
|
internal error - cant use port selector in selenium!!!!
|
|
221
221
|
`),Promise.reject({reason:"cant use port selector in selenium!"})}prepare(){}handleLegacyDataCaching(){}},qi=new mp});var Un,zi,Ki=w(()=>{"use strict";up();F();we();Un={8:"\uE008",9:"\uE004",13:"\uE007",27:"\uE00C",33:"\uE00E",34:"\uE00F",35:"\uE010",36:"\uE011",45:"\uE016",112:"\uE031",113:"\uE032",114:"\uE033",115:"\uE034",116:"\uE035",117:"\uE036",118:"\uE037",119:"\uE038",120:"\uE039",121:"\uE03A",122:"\uE03B",123:"\uE03C"},zi=class{constructor(e){this.driver=e;this._abortedSteps=[];this.unescapeHTML=zs;this.getLinksFromUnescapeHTML=Ks;this.cookieUtils=new bs(this.driver)}get sessionPlayerInit(){return Q()}resetAbort(){this._abortedSteps.length=0}abort(e){this._abortedSteps.push(e)}get abortedSteps(){return this._abortedSteps}getClickOffset(e,t){let{utils:r,positionUtils:n}=this.sessionPlayerInit,o=n.calculateElementMiddlePoint(t);return e&&r.isWithinBounds(t.left,t.left+t.width,e.x)&&r.isWithinBounds(t.top,t.top+t.height,e.y)?{x:e.x-o.x,y:e.y-o.y}:{x:0,y:0}}async executeInAut(e,t){let{value:r}=await this.driver.executeJS(t);return r}extractTargetText(e){return this.driver.getTargetText(e)}extractText(e){return this.driver.getElementTextJS(e)}async markDynamicParent(e,t){await this.driver.markDynamicParent(e,t)}getCookie(e){return this.cookieUtils.get({name:e})}setCookie(e){return this.cookieUtils.set(e)}async getNextDynamicParent(e,t){let r=this.sessionPlayerInit.codeSnippets.getNextDynamicParent(t),{value:n}=await this.driver.executeJS(`return (function() { ${r} })();`);return n}}});function iy(s){class e{constructor(r,n){this.frameManager=r;this.LocateElementPlayer=n;this._cache={}}cacheResults(r,n){this._cache[r]=n}getResultsFromCache(r){return this._cache[r]}cacheFrameLocateResults(r){if(r!=null&&r.seleniumFrameElement&&r.frameLocateResultUrl){let n=oy(r.seleniumFrameElement);n&&this.cacheResults(n,r.frameLocateResultUrl)}}async foundFrameCallback(r,n,o){let{frameOffset:i,locatedElement:a}=r,{locatorBuilderUtils:l}=Q();if(l.isEmptyResult(a)){let u="got empty result in frame result, not rejected from locate element player";throw $E.error(u),new Error(u)}let c=await s.switchToLocatedFrame(a),d=oy(c.value),m=this.getResultsFromCache(d);return{url:"",frameId:-1,frameOffset:i,tabInfo:n.tabInfo,tabId:n.tabId,testimFrameId:o,testimFullFrameId:`${this.currentFrameHandler.testimFullFrameId}-${o}`,seleniumFrameElement:c.value,frameLocateResultUrl:m}}async locate(r,n,o,i,a,l){let c=new this.LocateElementPlayer(i);r.targetId=`frameLocator_${n}`;let d=await c.locate(r,o,r.targetId);d.isVisible=!0;let m=await c.handleLocateResult(d,l,r).catch(()=>{throw new Error("")}),{locatedElement:u}=i.data[r.targetId],h=(await s.getElementLocationWithPadding(u)).value||{top:0,left:0};m.frameOffset={top:o.frameOffset.top+h.top,left:o.frameOffset.left+h.left},c.addFrameDataToContext&&c.addFrameDataToContext(m.targetId,m.locateResult);let g=await this.foundFrameCallback(m,a,r.testimFrameId);return this.currentFrameHandler=g,g}async findFrame(r,n,o,i){let a=L.flags.enableFrameSwitchOptimization.isEnabled(),c=o.playback.resultsHandler.resultsByChronologicOrder.at(-1),d=1,m=c&&c.stepId===r.id&&c.results.length>d;if(a&&!m&&this.currentFrameHandler){let y=n.findIndex(T=>T.testimFrameId===this.currentFrameHandler.testimFrameId);if(y>-1){let T=n.slice(y+1),R=0;for(let b of T)R++,this.currentFrameHandler=await this.locate(b,R,this.currentFrameHandler,o,i,r);return this.currentFrameHandler}}let u=await i.getTopFrameHandler();u.frameOffset={top:0,left:0},await(a&&this.currentFrameHandler===u?this.currentFrameHandler:s.switchToTopFrame()),this.cacheFrameLocateResults(this.currentFrameHandler),this.currentFrameHandler=u;let h=0,g=u;for(let y of n)h++,g=await this.locate(y,h,g,o,i,r);return g}}return e}var $E,WE,oy,ay=w(()=>{"use strict";j();pe();we();Mr();$E=C("frame-locator"),WE="ELEMENT",oy=s=>s?s[WE]||s[Kt]:null});var Ji,gp=w(()=>{"use strict";ue();Ji=()=>{try{if(od)return!1;if(require("inspector").url())return!0}catch{}return!1}});var V,le=w(()=>{"use strict";we();V=class{constructor(e,t,r,n={},o=void 0,i=void 0,a={}){this.step=e;this.context=t;this.frameHandler=r;this.exportsGlobal=n;this.stepActionUtils=o;this.locateElementPlayer=i;this.exportsTest=a;this.frameId=0}get driver(){return this.stepActionUtils.driver}get sessionPlayerInit(){return Q()}async performAction(){throw new Error("not implemented")}getTarget(){let e=this.step.targetId||"targetId";return this.context.data[e]}async execute(){try{return{success:!0,...await this.performAction()}}catch(e){let t=e==null?void 0:e.message,r=e==null?void 0:e.displayMessage;return{success:!1,reason:t,exception:e,errorType:this.sessionPlayerInit.commonConstants.stepResult.ACTION_EXCEPTION,resultInfo:{exception:`selenium exception: ${t}`,error:r||t}}}}}});function GE(s,e,t,r){return s.opacity===0||s.isShadowed?!1:e===void 0||t===void 0?!0:L.flags.useClickimVisibilityChecks.isEnabled()?!1:r.isSafari()?L.flags.useSafariWebdriverVisibilityChecks.isEnabled():!0}function HE(s){return{getFrameIdByTestimFrameId(){},async setElementResultDataOnContext(e){let t=await s.getElement(e.locatedElement);e.seleniumElement=t.value},getElementRectangle(e){return s.getElementRect(e)},async getOffsets(e){return[e.frameOffset||{}]},htmlStringToDom(e,t){let n=new cy.DOMParser().parseFromString("<html><body></body></html>","text/html");return n.body.outerHTML=e,Object.assign(n,{TESTIM_URL:t,parsedUsingLinkedom:!0})},async isVisible(e,t,r,n,o,i,a){let{locatorBuilderUtils:l,codeSnippets:c,visibilityUtils:d,positionUtils:m}=Q();if(GE(n,d,m,s))return s.isVisible(e.seleniumElement);if(!e.seleniumElement)return{visible:!1,invisibleReason:"element not found"};try{await s.isVisible(e.seleniumElement)}catch{}if(!t||l.isEmptyResult(t))return{visible:!1,invisibleReason:"element not found"};let h=[m.calculateElementMiddlePoint(r),m.calculateClickPoint(n.clickOffset,r)].filter(Boolean),g=c.getVisibilityCode.getCompoundVisibilityInfoCode(e.locatedElement,h,!1,n),y;try{y=await s.execute(`return ${g}`)}catch(I){throw kr.error("failed to execute getVisibilityCode",{err:I}),I}let{value:T}=y||{},R=T.elementVisibilityInfo||VE,[b,v]=T.elementsFromPointResults||[null,null];return d.checkElementVisibility(R,n,v,b,a,t,!1)},async scrollToElement(e,t){let{codeSnippets:{scrollToElement:r}}=Q();await s.execute(r(t))}}}var cy,kr,VE,Fn,ly=w(()=>{"use strict";le();j();pe();we();cy=require("linkedom"),kr=C("locate-step-action"),VE={opacity:1,clientRects:{}};Fn=class extends V{execute(){return this.driver.getHTML(this.step)}static getUtils(e){return HE(e)}static getFrameIdByTestimFrameId(){throw kr.warn("Unplanned access to getFrameIdByTestimFrameId()"),new Error("Use .getUtils() instead")}static setElementResultDataOnContext(){throw kr.warn("Unplanned access to setElementResultDataOnContext()"),new Error("Use .getUtils() instead")}static getElementRectangle(){throw kr.warn("Unplanned access to getElementRectangle()"),new Error("Use .getUtils() instead")}static getOffsets(){throw kr.warn("Unplanned access to getOffsets()"),new Error("Use .getUtils() instead")}static htmlStringToDom(){throw kr.warn("Unplanned access to htmlStringToDom()"),new Error("Use .getUtils() instead")}static isVisible(){throw kr.warn("Unplanned access to isVisible()"),new Error("Use .getUtils() instead")}}});var uy={};G(uy,{scroll:()=>qE});var qE,py=w(()=>{"use strict";qE=function(s,e,t,r,n,o,i,a){function l(R,b){if(!b)return{success:!1};elementScrollTo(b,R.x,R.y);let v=b.scrollLeft,I=b.scrollTop;return{success:Math.abs(I-R.y)<1&&Math.abs(v-R.x)<1,actualX:v,actualY:I}}function c(R,b){if(!t)return{x:n,y:o};let v=getLocatedElement(b);if(r&&!v)return{x:R.scrollWidth,y:R.scrollHeight};if(!v)throw new Error("could not find target element");let I=v.getBoundingClientRect(),x=0,O=0,W=Math.max(window.innerHeight-(I.height+10),0),A=Math.max(window.innerWidth-(I.width+10),0);return x=a?R.scrollTop+I.top-Math.min(o,W):R.scrollTop,O=i?R.scrollLeft+I.left-Math.min(n,A):R.scrollLeft,{x:Math.round(O),y:Math.round(x)}}let d=!s,m=d?document.scrollingElement||document.documentElement:getLocatedElement(s);if(!m)throw new Error("could not find target to scroll on");let u={top:m.scrollTop,left:m.scrollLeft},f=c(m,e),h=l(f,m);d&&!document.scrollingElement&&!h.success&&u.top===m.scrollTop&&u.left===m.scrollLeft&&(m=document.body,f=c(m,e),h=l(f,m));let g=h.actualX,y=h.actualY,T=getLocatedElement(e);if(t&&r&&!T)return{success:!1,expectedPosition:f};if(t){if(!T)throw new Error("could not find target to scroll to");let R=T.getBoundingClientRect();g=R.left,y=R.top}return{success:h.success,actualX:g,actualY:y}}});var Yi,dy=w(()=>{"use strict";le();Yi=class extends V{getFailureString(e,t,r,n,o){if(!e.isScrollToElement)return`Scrolling limit reached. Expected:(y: ${r}, x: ${t}); Actual:(y:${o}, x: ${n})`;let i="Scrolling limit reached";return e.shouldScrollTop&&(i+=`. Expected top margin: ${r}, actual: ${o}`),e.shouldScrollLeft&&(i+=`. Expected left margin: ${t}, actual: ${n}`),i}async scroll(e,t,r){let{codeSnippets:n,commonConstants:{stepResult:o}}=this.sessionPlayerInit,i=Math.round(Number(t.isScrollToElement?t.marginTop:t.y)),a=Math.round(Number(t.isScrollToElement?t.marginLeft:t.x)),l=this.driver.isFirefox()?function(m,u,f){m.scrollTo(u,f)}:function(m,u,f){m.scrollTop=f,m.scrollLeft=u},{scroll:c}=await Promise.resolve().then(()=>(py(),uy)),d=`
|
|
222
222
|
const getLocatedElement = ${n.getLocatedElementCode};
|