CINXE.COM

<!doctype html><html lang="en"><head><title data-rh="true">Decision guide for browser test tooling | New Work Development</title><meta data-rh="true" charset="utf-8"/><meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1"/><meta data-rh="true" name="theme-color" content="#000000"/><meta data-rh="true" name="twitter:app:name:iphone" content="Medium"/><meta data-rh="true" name="twitter:app:id:iphone" content="828256236"/><meta data-rh="true" property="al:ios:app_name" content="Medium"/><meta data-rh="true" property="al:ios:app_store_id" content="828256236"/><meta data-rh="true" property="al:android:package" content="com.medium.reader"/><meta data-rh="true" property="fb:app_id" content="542599432471018"/><meta data-rh="true" property="og:site_name" content="Medium"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="article:published_time" content="2022-12-06T16:33:15.919Z"/><meta data-rh="true" name="title" content="Decision guide for browser test tooling | New Work Development"/><meta data-rh="true" property="og:title" content="Decision guide for browser test tooling"/><meta data-rh="true" property="al:android:url" content="medium://p/cc9b3e9d16a"/><meta data-rh="true" property="al:ios:url" content="medium://p/cc9b3e9d16a"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="A guide for picking the right browser test automation tool for your project. Learn also about idiosyncrasies of browsers and the validity of the tools&#x27; test results."/><meta data-rh="true" property="og:description" content="At NEW WORK SE, every team is free to decide on the browser test automation tooling for their project. However, information from tooling…"/><meta data-rh="true" property="og:url" content="https://tech.new-work.se/decision-guide-for-browser-test-tooling-cc9b3e9d16a"/><meta data-rh="true" property="al:web:url" content="https://tech.new-work.se/decision-guide-for-browser-test-tooling-cc9b3e9d16a"/><meta data-rh="true" property="og:image" content="https://miro.medium.com/v2/resize:fit:1200/1*-FoOHdT_6yYrV2ZgCtOSaQ.png"/><meta data-rh="true" property="og:image:alt" content="A radar chart comparing Cypress, Playwright, Puppeteer, TestCafé and WebDriver at a glance"/><meta data-rh="true" property="article:author" content="https://medium.com/@marcus-noll"/><meta data-rh="true" name="author" content="Marcus Noll"/><meta data-rh="true" name="robots" content="index,noarchive,follow,max-image-preview:large"/><meta data-rh="true" name="referrer" content="unsafe-url"/><meta data-rh="true" property="twitter:title" content="Decision guide for browser test tooling"/><meta data-rh="true" name="twitter:site" content="@xingdevs"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/cc9b3e9d16a"/><meta data-rh="true" property="twitter:description" content="At NEW WORK SE, every team is free to decide on the browser test automation tooling for their project. However, information from tooling…"/><meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/v2/resize:fit:1200/1*-FoOHdT_6yYrV2ZgCtOSaQ.png"/><meta data-rh="true" name="twitter:image:alt" content="A radar chart comparing Cypress, Playwright, Puppeteer, TestCafé and WebDriver at a glance"/><meta data-rh="true" name="twitter:card" content="summary_large_image"/><meta data-rh="true" name="twitter:label1" content="Reading time"/><meta data-rh="true" name="twitter:data1" content="16 min read"/><link data-rh="true" rel="icon" href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19"/><link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml"/><link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://miro.medium.com/v2/resize:fill:240:240/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://miro.medium.com/v2/resize:fill:152:152/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://miro.medium.com/v2/resize:fill:120:120/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="mask-icon" href="https://miro.medium.com/v2/resize:fill:1000:1000/7*GAOKVe--MXbEJmV9230oOQ.png" color="#171717"/><link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" rel="author" href="https://medium.com/@marcus-noll"/><link data-rh="true" rel="canonical" href="https://tech.new-work.se/decision-guide-for-browser-test-tooling-cc9b3e9d16a"/><link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/cc9b3e9d16a"/><script data-rh="true" type="application/ld+json">{"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1200\u002F1*-FoOHdT_6yYrV2ZgCtOSaQ.png"],"url":"https:\u002F\u002Ftech.new-work.se\u002Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a","dateCreated":"2022-12-06T16:33:15.919Z","datePublished":"2022-12-06T16:33:15.919Z","dateModified":"2022-12-06T16:33:22.104Z","headline":"Decision guide for browser test tooling | New Work Development","name":"Decision guide for browser test tooling | New Work Development","description":"A guide for picking the right browser test automation tool for your project. Learn also about idiosyncrasies of browsers and the validity of the tools' test results.","identifier":"cc9b3e9d16a","author":{"@type":"Person","name":"Marcus Noll","url":"https:\u002F\u002Ftech.new-work.se\u002F@marcus-noll"},"creator":["Marcus Noll"],"publisher":{"@type":"Organization","name":"New Work Development","url":"tech.new-work.se","logo":{"@type":"ImageObject","width":272,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:544\u002F7*V1_7XP4snlmqrc_0Njontw.png"}},"mainEntityOfPage":"https:\u002F\u002Ftech.new-work.se\u002Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a"}</script><style type="text/css" data-fela-rehydration="553" data-fela-type="STATIC">html{box-sizing:border-box;-webkit-text-size-adjust:100%}*, *:before, *:after{box-sizing:inherit}body{margin:0;padding:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:rgba(0,0,0,0.8);position:relative;min-height:100vh}h1, h2, h3, h4, h5, h6, dl, dd, ol, ul, menu, figure, blockquote, p, pre, form{margin:0}menu, ol, ul{padding:0;list-style:none;list-style-image:none}main{display:block}a{color:inherit;text-decoration:none}a, button, input{-webkit-tap-highlight-color:transparent}img, svg{vertical-align:middle}button{background:transparent;overflow:visible}button, input, optgroup, select, textarea{margin:0}:root{--reach-tabs:1;--reach-menu-button:1}#speechify-root{font-family:Sohne, sans-serif}div[data-popper-reference-hidden="true"]{visibility:hidden;pointer-events:none}.grecaptcha-badge{visibility:hidden} /*XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>*/.hljs {background: #fff;color: black; }/* Gray DOCTYPE selectors like WebKit */ .xml .hljs-meta {color: #c0c0c0; }.hljs-comment, .hljs-quote {color: #007400; }.hljs-tag, .hljs-attribute, .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-name {color: #aa0d91; }.hljs-variable, .hljs-template-variable {color: #3F6E74; }.hljs-code, .hljs-string, .hljs-meta .hljs-string {color: #c41a16; }.hljs-regexp, .hljs-link {color: #0E0EFF; }.hljs-title, .hljs-symbol, .hljs-bullet, .hljs-number {color: #1c00cf; }.hljs-section, .hljs-meta {color: #643820; }.hljs-title.class_, .hljs-class .hljs-title, .hljs-type, .hljs-built_in, .hljs-params {color: #5c2699; }.hljs-attr {color: #836C28; }.hljs-subst {color: #000; }.hljs-formula {background-color: #eee;font-style: italic; }.hljs-addition {background-color: #baeeba; }.hljs-deletion {background-color: #ffc8bd; }.hljs-selector-id, .hljs-selector-class {color: #9b703f; }.hljs-doctag, .hljs-strong {font-weight: bold; }.hljs-emphasis {font-style: italic; } </style><style type="text/css" data-fela-rehydration="553" data-fela-type="KEYFRAME">@-webkit-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@-moz-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE">.a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{display:block}.m{position:sticky}.n{top:0}.o{z-index:500}.p{padding:0 24px}.q{align-items:center}.r{border-bottom:solid 1px #F2F2F2}.y{height:41px}.z{line-height:20px}.ab{display:flex}.ac{height:57px}.ae{flex:1 0 auto}.af{color:inherit}.ag{fill:inherit}.ah{font-size:inherit}.ai{border:inherit}.aj{font-family:inherit}.ak{letter-spacing:inherit}.al{font-weight:inherit}.am{padding:0}.an{margin:0}.ao{cursor:pointer}.ap:disabled{cursor:not-allowed}.aq:disabled{color:#6B6B6B}.ar:disabled{fill:#6B6B6B}.au{width:auto}.av path{fill:#242424}.aw{height:25px}.ax{margin-left:16px}.ay{border:none}.az{border-radius:20px}.ba{width:240px}.bb{background:#F9F9F9}.bc path{fill:#6B6B6B}.be{outline:none}.bf{font-family:sohne, "Helvetica Neue", Helvetica, Arial, sans-serif}.bg{font-size:14px}.bh{width:100%}.bi{padding:10px 20px 10px 0}.bj{background-color:transparent}.bk{color:#242424}.bl::placeholder{color:#6B6B6B}.bm{display:inline-block}.bn{margin-left:12px}.bo{margin-right:12px}.bp{border-radius:4px}.bq{margin-left:24px}.br{height:24px}.bx{background-color:#F9F9F9}.by{border-radius:50%}.bz{height:32px}.ca{width:32px}.cb{justify-content:center}.ch{max-width:680px}.ci{min-width:0}.cj{animation:k1 1.2s ease-in-out infinite}.ck{height:100vh}.cl{margin-bottom:16px}.cm{margin-top:48px}.cn{align-items:flex-start}.co{flex-direction:column}.cp{justify-content:space-between}.cq{margin-bottom:24px}.cw{width:80%}.cx{background-color:#F2F2F2}.dd{height:44px}.de{width:44px}.df{margin:auto 0}.dg{margin-bottom:4px}.dh{height:16px}.di{width:120px}.dj{width:80px}.dp{margin-bottom:8px}.dq{width:96%}.dr{width:98%}.ds{width:81%}.dt{margin-left:8px}.du{color:#6B6B6B}.dv{font-size:13px}.dw{height:100%}.ep{color:#FFFFFF}.eq{fill:#FFFFFF}.er{background:rgba(26, 137, 23, 1)}.es{border-color:rgba(26, 137, 23, 1)}.ew:disabled{cursor:inherit !important}.ex:disabled{opacity:0.3}.ey:disabled:hover{background:rgba(26, 137, 23, 1)}.ez:disabled:hover{border-color:rgba(26, 137, 23, 1)}.fa{border-radius:99em}.fb{border-width:1px}.fc{border-style:solid}.fd{box-sizing:border-box}.fe{text-decoration:none}.ff{text-align:center}.fi{margin-right:32px}.fj{position:relative}.fk{fill:#6B6B6B}.fn{background:transparent}.fo svg{margin-left:4px}.fp svg{fill:#6B6B6B}.fr{box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.05)}.fs{position:absolute}.fz{margin:0 24px}.gd{background:rgba(255, 255, 255, 1)}.ge{border:1px solid #F2F2F2}.gf{box-shadow:0 1px 4px #F2F2F2}.gg{max-height:100vh}.gh{overflow-y:auto}.gi{left:0}.gj{top:calc(100vh + 100px)}.gk{bottom:calc(100vh + 100px)}.gl{width:10px}.gm{pointer-events:none}.gn{word-break:break-word}.go{word-wrap:break-word}.gp:after{display:block}.gq:after{content:""}.gr:after{clear:both}.gs{line-height:1.23}.gt{letter-spacing:0}.gu{font-style:normal}.gv{font-weight:700}.ia{align-items:baseline}.ib{width:48px}.ic{height:48px}.id{border:2px solid rgba(255, 255, 255, 1)}.ie{z-index:0}.if{box-shadow:none}.ig{border:1px solid rgba(0, 0, 0, 0.05)}.ih{margin-left:-12px}.ii{width:28px}.ij{height:28px}.ik{z-index:1}.il{width:24px}.im{margin-bottom:2px}.in{flex-wrap:nowrap}.io{font-size:16px}.ip{line-height:24px}.ir{margin:0 8px}.is{display:inline}.it{color:rgba(26, 137, 23, 1)}.iu{fill:rgba(26, 137, 23, 1)}.ix{flex:0 0 auto}.ja{flex-wrap:wrap}.jb{white-space:pre-wrap}.jc{margin-right:4px}.jd{overflow:hidden}.je{max-height:20px}.jf{text-overflow:ellipsis}.jg{display:-webkit-box}.jh{-webkit-line-clamp:1}.ji{-webkit-box-orient:vertical}.jj{word-break:break-all}.jl{padding-left:8px}.jm{padding-right:8px}.kn> *{flex-shrink:0}.ko{overflow-x:scroll}.kp::-webkit-scrollbar{display:none}.kq{scrollbar-width:none}.kr{-ms-overflow-style:none}.ks{width:74px}.kt{flex-direction:row}.ku{z-index:2}.kx{-webkit-user-select:none}.ky{border:0}.kz{fill:rgba(117, 117, 117, 1)}.lc{outline:0}.ld{user-select:none}.le> svg{pointer-events:none}.ln{cursor:progress}.lo{opacity:1}.lp{padding:4px 0}.ls{margin-top:0px}.lt{width:16px}.lv{display:inline-flex}.mb{max-width:100%}.mc{padding:8px 2px}.md svg{color:#6B6B6B}.mu{line-height:1.58}.mv{letter-spacing:-0.004em}.mw{font-family:source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif}.nr{margin-bottom:-0.46em}.ns{text-decoration:underline}.nt{list-style-type:disc}.nu{margin-left:30px}.nv{padding-left:0px}.ob{margin-top:32px}.oc{margin-bottom:14px}.od{padding-top:24px}.oe{padding-bottom:10px}.of{background-color:#000000}.og{height:3px}.oh{width:3px}.oi{margin-right:20px}.oj{line-height:1.12}.ok{letter-spacing:-0.022em}.ol{font-weight:600}.pg{margin-bottom:-0.28em}.pm{line-height:1.18}.qa{margin-bottom:-0.31em}.qb{box-shadow:inset 3px 0 0 0 #242424}.qc{padding-left:23px}.qd{margin-left:-20px}.qe{font-style:italic}.qf{margin-left:auto}.qg{margin-right:auto}.qh{max-width:1892px}.qn{clear:both}.qp{cursor:zoom-in}.qq{z-index:auto}.qs{height:auto}.qt{margin-top:10px}.qu{max-width:728px}.qx{max-width:1888px}.qy{max-width:1886px}.qz{max-width:1326px}.ra{margin-bottom:26px}.rb{margin-top:6px}.rc{margin-top:8px}.rd{margin-right:8px}.re{padding:8px 16px}.rf{border-radius:100px}.rg{transition:background 300ms ease}.ri{white-space:nowrap}.rj{border-top:none}.rk{margin-bottom:50px}.rl{height:52px}.rm{max-height:52px}.rn{box-sizing:content-box}.ro{position:static}.rq{max-width:155px}.rw{margin-bottom:64px}.rx{margin-bottom:48px}.sl{border-radius:2px}.sn{height:64px}.so{width:64px}.sp{align-self:flex-end}.sq{color:rgba(255, 255, 255, 1)}.sr{fill:rgba(255, 255, 255, 1)}.ss{background:rgba(25, 25, 25, 1)}.st{border-color:rgba(25, 25, 25, 1)}.sw:disabled{opacity:0.1}.sx:disabled:hover{background:rgba(25, 25, 25, 1)}.sy:disabled:hover{border-color:rgba(25, 25, 25, 1)}.sz{flex:1 1 auto}.tf{padding-right:4px}.tg{font-weight:500}.tn{margin-top:16px}.to{margin-bottom:54px}.tp{height:0px}.tq{gap:18px}.tr{fill:rgba(61, 61, 61, 1)}.ud{border-bottom:solid 1px #E5E5E5}.ue{margin-top:72px}.uf{padding:24px 0}.ug{margin-bottom:0px}.uh{margin-right:16px}.as:hover:not(:disabled){color:rgba(25, 25, 25, 1)}.at:hover:not(:disabled){fill:rgba(25, 25, 25, 1)}.et:hover{background:rgba(15, 115, 12, 1)}.eu:hover{border-color:rgba(15, 115, 12, 1)}.ev:hover{cursor:pointer}.fl:hover{color:#242424}.fm:hover{fill:#242424}.fq:hover svg{fill:#242424}.ft:hover{background-color:rgba(0, 0, 0, 0.1)}.iq:hover{text-decoration:underline}.iv:hover:not(:disabled){color:rgba(15, 115, 12, 1)}.iw:hover:not(:disabled){fill:rgba(15, 115, 12, 1)}.lb:hover{fill:rgba(8, 8, 8, 1)}.lq:hover{fill:#000000}.lr:hover p{color:#000000}.lu:hover{color:#000000}.me:hover svg{color:#000000}.rh:hover{background-color:#F2F2F2}.sm:hover{background-color:none}.su:hover{background:#000000}.sv:hover{border-color:#242424}.ts:hover{fill:rgba(25, 25, 25, 1)}.bd:focus-within path{fill:#242424}.la:focus{fill:rgba(8, 8, 8, 1)}.mf:focus svg{color:#000000}.qr:focus{transform:scale(1.01)}.lf:active{border-style:none}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE" media="all and (min-width: 1080px)">.d{display:none}.bw{width:64px}.cg{margin:0 64px}.cv{height:48px}.dc{margin-bottom:52px}.do{margin-bottom:48px}.ef{font-size:14px}.eg{line-height:20px}.em{font-size:13px}.eo{padding:5px 12px}.fh{display:flex}.fy{margin-bottom:50px}.gc{max-width:680px}.hq{font-size:42px}.hr{margin-top:1.19em}.hs{margin-bottom:32px}.ht{line-height:52px}.hu{letter-spacing:-0.011em}.hz{align-items:center}.jz{border-top:solid 1px #F2F2F2}.ka{border-bottom:solid 1px #F2F2F2}.kb{margin:32px 0 0}.kc{padding:3px 8px}.kl> *{margin-right:24px}.km> :last-child{margin-right:0}.lm{margin-top:0px}.ma{margin:0}.nn{font-size:20px}.no{margin-top:2.14em}.np{line-height:32px}.nq{letter-spacing:-0.003em}.oa{margin-top:1.14em}.pc{font-size:24px}.pd{margin-top:1.25em}.pe{line-height:30px}.pf{letter-spacing:-0.016em}.pl{margin-top:0.94em}.px{margin-top:1.72em}.py{line-height:24px}.pz{letter-spacing:0}.qm{margin-top:56px}.rv{display:inline-block}.ry{flex-direction:row}.sb{margin-bottom:0}.sc{margin-right:20px}.ta{max-width:500px}.tx{margin:40px 0 0}.uc{padding-top:72px}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.ll{margin-top:0px}.qv{margin-left:auto}.qw{text-align:center}.ru{display:inline-block}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.lk{margin-top:0px}.rt{display:inline-block}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.li{margin-top:0px}.lj{margin-right:0px}.rs{display:inline-block}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE" media="all and (max-width: 551.98px)">.h{display:none}.s{display:flex}.t{justify-content:space-between}.bs{width:24px}.cc{margin:0 24px}.cr{height:40px}.cy{margin-bottom:44px}.dk{margin-bottom:32px}.dx{font-size:13px}.dy{line-height:20px}.eh{padding:0px 8px 1px}.fu{margin-bottom:2px}.gw{font-size:32px}.gx{margin-top:1.01em}.gy{margin-bottom:24px}.gz{line-height:38px}.ha{letter-spacing:-0.014em}.hv{align-items:flex-start}.iy{flex-direction:column}.jn{margin:24px -24px 0}.jo{padding:0}.kd> *{margin-right:8px}.ke> :last-child{margin-right:24px}.kv{margin-left:0px}.lg{margin-top:0px}.lh{margin-right:0px}.lw{margin:0}.mg{border:1px solid #F2F2F2}.mh{border-radius:99em}.mi{padding:0px 16px 0px 12px}.mj{height:38px}.mk{align-items:center}.mm svg{margin-right:8px}.mx{font-size:18px}.my{margin-top:1.56em}.mz{line-height:28px}.na{letter-spacing:-0.003em}.nw{margin-top:1.34em}.om{font-size:20px}.on{margin-top:0.93em}.oo{line-height:24px}.op{letter-spacing:0}.ph{margin-top:0.67em}.pn{font-size:16px}.po{margin-top:1.23em}.qi{margin-top:40px}.rr{display:inline-block}.sj{margin-bottom:20px}.sk{margin-right:0}.te{max-width:100%}.th{font-size:24px}.ti{line-height:30px}.tj{letter-spacing:-0.016em}.tt{margin:32px 0 0}.ty{padding-top:48px}.ml:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">.i{display:none}.bv{width:64px}.cf{margin:0 64px}.cu{height:48px}.db{margin-bottom:52px}.dn{margin-bottom:48px}.ed{font-size:14px}.ee{line-height:20px}.ek{font-size:13px}.el{padding:5px 12px}.fg{display:flex}.fx{margin-bottom:50px}.gb{max-width:680px}.hl{font-size:42px}.hm{margin-top:1.19em}.hn{margin-bottom:32px}.ho{line-height:52px}.hp{letter-spacing:-0.011em}.hy{align-items:center}.jv{border-top:solid 1px #F2F2F2}.jw{border-bottom:solid 1px #F2F2F2}.jx{margin:32px 0 0}.jy{padding:3px 8px}.kj> *{margin-right:24px}.kk> :last-child{margin-right:0}.lz{margin:0}.nj{font-size:20px}.nk{margin-top:2.14em}.nl{line-height:32px}.nm{letter-spacing:-0.003em}.nz{margin-top:1.14em}.oy{font-size:24px}.oz{margin-top:1.25em}.pa{line-height:30px}.pb{letter-spacing:-0.016em}.pk{margin-top:0.94em}.pu{margin-top:1.72em}.pv{line-height:24px}.pw{letter-spacing:0}.ql{margin-top:56px}.rz{flex-direction:row}.sd{margin-bottom:0}.se{margin-right:20px}.tb{max-width:500px}.tw{margin:40px 0 0}.ub{padding-top:72px}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">.j{display:none}.w{display:flex}.x{justify-content:space-between}.bu{width:64px}.ce{margin:0 48px}.ct{height:48px}.da{margin-bottom:52px}.dm{margin-bottom:48px}.eb{font-size:13px}.ec{line-height:20px}.ej{padding:0px 8px 1px}.fw{margin-bottom:50px}.ga{max-width:680px}.hg{font-size:42px}.hh{margin-top:1.19em}.hi{margin-bottom:32px}.hj{line-height:52px}.hk{letter-spacing:-0.011em}.hx{align-items:center}.jr{border-top:solid 1px #F2F2F2}.js{border-bottom:solid 1px #F2F2F2}.jt{margin:32px 0 0}.ju{padding:3px 8px}.kh> *{margin-right:24px}.ki> :last-child{margin-right:0}.ly{margin:0}.nf{font-size:20px}.ng{margin-top:2.14em}.nh{line-height:32px}.ni{letter-spacing:-0.003em}.ny{margin-top:1.14em}.ou{font-size:24px}.ov{margin-top:1.25em}.ow{line-height:30px}.ox{letter-spacing:-0.016em}.pj{margin-top:0.94em}.pr{margin-top:1.72em}.ps{line-height:24px}.pt{letter-spacing:0}.qk{margin-top:56px}.sa{flex-direction:row}.sf{margin-bottom:0}.sg{margin-right:20px}.tc{max-width:500px}.tv{margin:40px 0 0}.ua{padding-top:72px}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">.k{display:none}.u{display:flex}.v{justify-content:space-between}.bt{width:24px}.cd{margin:0 24px}.cs{height:40px}.cz{margin-bottom:44px}.dl{margin-bottom:32px}.dz{font-size:13px}.ea{line-height:20px}.ei{padding:0px 8px 1px}.fv{margin-bottom:2px}.hb{font-size:32px}.hc{margin-top:1.01em}.hd{margin-bottom:24px}.he{line-height:38px}.hf{letter-spacing:-0.014em}.hw{align-items:flex-start}.iz{flex-direction:column}.jp{margin:24px 0 0}.jq{padding:0}.kf> *{margin-right:8px}.kg> :last-child{margin-right:8px}.kw{margin-left:0px}.lx{margin:0}.mn{border:1px solid #F2F2F2}.mo{border-radius:99em}.mp{padding:0px 16px 0px 12px}.mq{height:38px}.mr{align-items:center}.mt svg{margin-right:8px}.nb{font-size:18px}.nc{margin-top:1.56em}.nd{line-height:28px}.ne{letter-spacing:-0.003em}.nx{margin-top:1.34em}.oq{font-size:20px}.or{margin-top:0.93em}.os{line-height:24px}.ot{letter-spacing:0}.pi{margin-top:0.67em}.pp{font-size:16px}.pq{margin-top:1.23em}.qj{margin-top:40px}.sh{margin-bottom:20px}.si{margin-right:0}.td{max-width:100%}.tk{font-size:24px}.tl{line-height:30px}.tm{letter-spacing:-0.016em}.tu{margin:32px 0 0}.tz{padding-top:48px}.ms:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE" media="print">.rp{display:none}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE" media="(orientation: landscape) and (max-width: 903.98px)">.jk{max-height:none}</style><style type="text/css" data-fela-rehydration="553" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">.qo{transition:transform 300ms cubic-bezier(0.2, 0, 0.2, 1)}</style></head><body><div id="root"><div class="a b c"><div class="d e f g h i j k"></div><script>document.domain = document.domain;</script><div class="l c"><div class="l m n o c"><div class="p q r s t u v w x i d y z"><a class="du ag dv bf ak b am an ao ap aq ar as at s u w i d q dw z" href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2Fcc9b3e9d16a&amp;%7Efeature=LoOpenInAppButton&amp;%7Echannel=ShowPostUnderCollection&amp;source=---top_nav_layout_nav-----------------------------------------" rel="noopener follow">Open in app<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="none" viewBox="0 0 10 10" class="dt"><path fill="currentColor" d="M.985 8.485a.375.375 0 1 0 .53.53zM8.75 1.25h.375A.375.375 0 0 0 8.75.875zM8.375 6.5a.375.375 0 1 0 .75 0zM3.5.875a.375.375 0 1 0 0 .75zm-1.985 8.14 7.5-7.5-.53-.53-7.5 7.5zm6.86-7.765V6.5h.75V1.25zM3.5 1.625h5.25v-.75H3.5z"></path></svg></a><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton" href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------" rel="noopener follow">Sign up</a></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" href="https://medium.com/m/signin?operation=login&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------" rel="noopener follow">Sign in</a></span></p></div></div></div><div class="p q r ab ac"><div class="ab q ae"><a class="af ag ah ai aj ak al am an ao ap aq ar as at ab" aria-label="Homepage" data-testid="headerMediumLogo" href="https://medium.com/?source=---top_nav_layout_nav-----------------------------------------" rel="noopener follow"><svg xmlns="http://www.w3.org/2000/svg" width="719" height="160" fill="none" viewBox="0 0 719 160" class="au av aw"><path fill="#242424" d="m174.104 9.734.215-.047V8.02H130.39L89.6 103.89 48.81 8.021H1.472v1.666l.212.047c8.018 1.81 12.09 4.509 12.09 14.242V137.93c0 9.734-4.087 12.433-12.106 14.243l-.212.047v1.671h32.118v-1.665l-.213-.048c-8.018-1.809-12.089-4.509-12.089-14.242V30.586l52.399 123.305h2.972l53.925-126.743V140.75c-.687 7.688-4.721 10.062-11.982 11.701l-.215.05v1.652h55.948v-1.652l-.215-.05c-7.269-1.639-11.4-4.013-12.087-11.701l-.037-116.774h.037c0-9.733 4.071-12.432 12.087-14.242m25.555 75.488c.915-20.474 8.268-35.252 20.606-35.507 3.806.063 6.998 1.312 9.479 3.714 5.272 5.118 7.751 15.812 7.368 31.793zm-.553 5.77h65.573v-.275c-.186-15.656-4.721-27.834-13.466-36.196-7.559-7.227-18.751-11.203-30.507-11.203h-.263c-6.101 0-13.584 1.48-18.909 4.16-6.061 2.807-11.407 7.003-15.855 12.511-7.161 8.874-11.499 20.866-12.554 34.343q-.05.606-.092 1.212a50 50 0 0 0-.065 1.151 85.807 85.807 0 0 0-.094 5.689c.71 30.524 17.198 54.917 46.483 54.917 25.705 0 40.675-18.791 44.407-44.013l-1.886-.664c-6.557 13.556-18.334 21.771-31.738 20.769-18.297-1.369-32.314-19.922-31.042-42.395m139.722 41.359c-2.151 5.101-6.639 7.908-12.653 7.908s-11.513-4.129-15.418-11.63c-4.197-8.053-6.405-19.436-6.405-32.92 0-28.067 8.729-46.22 22.24-46.22 5.657 0 10.111 2.807 12.236 7.704zm43.499 20.008c-8.019-1.897-12.089-4.722-12.089-14.951V1.309l-48.716 14.353v1.757l.299-.024c6.72-.543 11.278.386 13.925 2.83 2.072 1.915 3.082 4.853 3.082 8.987v18.66c-4.803-3.067-10.516-4.56-17.448-4.56-14.059 0-26.909 5.92-36.176 16.672-9.66 11.205-14.767 26.518-14.767 44.278-.003 31.72 15.612 53.039 38.851 53.039 13.595 0 24.533-7.449 29.54-20.013v16.865h43.711v-1.746zM424.1 19.819c0-9.904-7.468-17.374-17.375-17.374-9.859 0-17.573 7.632-17.573 17.374s7.721 17.374 17.573 17.374c9.907 0 17.375-7.47 17.375-17.374m11.499 132.546c-8.019-1.897-12.089-4.722-12.089-14.951h-.035V43.635l-43.714 12.551v1.705l.263.024c9.458.842 12.047 4.1 12.047 15.152v81.086h43.751v-1.746zm112.013 0c-8.018-1.897-12.089-4.722-12.089-14.951V43.635l-41.621 12.137v1.71l.246.026c7.733.813 9.967 4.257 9.967 15.36v59.279c-2.578 5.102-7.415 8.131-13.274 8.336-9.503 0-14.736-6.419-14.736-18.073V43.638l-43.714 12.55v1.703l.262.024c9.459.84 12.05 4.097 12.05 15.152v50.17a56.3 56.3 0 0 0 .91 10.444l.787 3.423c3.701 13.262 13.398 20.197 28.59 20.197 12.868 0 24.147-7.966 29.115-20.43v17.311h43.714v-1.747zm169.818 1.788v-1.749l-.213-.05c-8.7-2.006-12.089-5.789-12.089-13.49v-63.79c0-19.89-11.171-31.761-29.883-31.761-13.64 0-25.141 7.882-29.569 20.16-3.517-13.01-13.639-20.16-28.606-20.16-13.146 0-23.449 6.938-27.869 18.657V43.643L545.487 55.68v1.715l.263.024c9.345.829 12.047 4.181 12.047 14.95v81.784h40.787v-1.746l-.215-.053c-6.941-1.631-9.181-4.606-9.181-12.239V66.998c1.836-4.289 5.537-9.37 12.853-9.37 9.086 0 13.692 6.296 13.692 18.697v77.828h40.797v-1.746l-.215-.053c-6.94-1.631-9.18-4.606-9.18-12.239V75.066a42 42 0 0 0-.578-7.26c1.947-4.661 5.86-10.177 13.475-10.177 9.214 0 13.691 6.114 13.691 18.696v77.828z"></path></svg></a><div class="ax h"><div class="ab ay az ba bb q bc bd"><div class="bm" aria-hidden="false" aria-describedby="searchResults" aria-labelledby="searchResults"></div><div class="bn bo ab"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div><input role="combobox" aria-controls="searchResults" aria-expanded="false" aria-label="search" data-testid="headerSearchInput" tabindex="0" class="ay be bf bg z bh bi bj bk bl" placeholder="Search" value=""/></div></div></div><div class="h k w fg fh"><div class="fi ab"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerWriteButton" href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnew-story&amp;source=---top_nav_layout_nav-----------------------new_post_topnav------------------" rel="noopener follow"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Write"><path fill="currentColor" d="M14 4a.5.5 0 0 0 0-1zm7 6a.5.5 0 0 0-1 0zm-7-7H4v1h10zM3 4v16h1V4zm1 17h16v-1H4zm17-1V10h-1v10zm-1 1a1 1 0 0 0 1-1h-1zM3 20a1 1 0 0 0 1 1v-1zM4 3a1 1 0 0 0-1 1h1z"></path><path stroke="currentColor" d="m17.5 4.5-8.458 8.458a.25.25 0 0 0-.06.098l-.824 2.47a.25.25 0 0 0 .316.316l2.47-.823a.25.25 0 0 0 .098-.06L19.5 6.5m-2-2 2.323-2.323a.25.25 0 0 1 .354 0l1.646 1.646a.25.25 0 0 1 0 .354L19.5 6.5m-2-2 2 2"></path></svg><div class="dt l">Write</div></div></a></span></div></div><div class="k j i d"><div class="fi ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSearchButton" href="https://medium.com/search?source=---top_nav_layout_nav-----------------------------------------" rel="noopener follow"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Search"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div></a></div></div><div class="fi h k j"><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton" href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------" rel="noopener follow">Sign up</a></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" href="https://medium.com/m/signin?operation=login&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------" rel="noopener follow">Sign in</a></span></p></div></div></div><div class="l" aria-hidden="false"><button class="ay fn am ab q ao fo fp fq" aria-label="user options menu" data-testid="headerUserIcon"><div class="l fj"><img alt="" class="l fd by bz ca cx" src="https://miro.medium.com/v2/resize:fill:64:64/1*dmbNkD5D-u45r44go_cf0g.png" width="32" height="32" loading="lazy" role="presentation"/><div class="fr by l bz ca fs n ay ft"></div></div></button></div></div></div><div class="l"><div class="fu fv fw fx fy l"><div class="ab cb"><div class="ci bh fz ga gb gc"></div></div><article><div class="l"><div class="l"><span class="l"></span><section><div><div class="fs gi gj gk gl gm"></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><div><h1 id="f6ee" class="pw-post-title gs gt gu bf gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu bk" data-testid="storyTitle">Decision guide for browser test tooling</h1><div><div class="speechify-ignore ab cp"><div class="speechify-ignore bh l"><div class="hv hw hx hy hz ab"><div><div class="ab ia"><div><div class="bm" aria-hidden="false"><a href="https://medium.com/@marcus-noll?source=post_page---byline--cc9b3e9d16a---------------------------------------" rel="noopener follow"><div class="l ib ic by id ie"><div class="l fj"><img alt="Marcus Noll" class="l fd by dd de cx" src="https://miro.medium.com/v2/resize:fill:88:88/1*XZBpoNJ-t9PV_LFeKILt8Q.png" width="44" height="44" loading="lazy" data-testid="authorPhoto"/><div class="if by l dd de fs n ig ft"></div></div></div></a></div></div><div class="ih ab fj"><div><div class="bm" aria-hidden="false"><a href="https://tech.new-work.se/?source=post_page---byline--cc9b3e9d16a---------------------------------------" rel="noopener ugc nofollow"><div class="l ii ij by id ik"><div class="l fj"><img alt="New Work Development" class="l fd by br il cx" src="https://miro.medium.com/v2/resize:fill:48:48/1*B1MD9EGz7rhVkx3WE3Rkog.png" width="24" height="24" loading="lazy" data-testid="publicationPhoto"/><div class="if by l br il fs n ig ft"></div></div></div></a></div></div></div></div></div><div class="bn bh l"><div class="ab"><div style="flex:1"><span class="bf b bg z bk"><div class="im ab q"><div class="ab q in"><div class="ab q"><div><div class="bm" aria-hidden="false"><p class="bf b io ip bk"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" data-testid="authorName" href="https://medium.com/@marcus-noll?source=post_page---byline--cc9b3e9d16a---------------------------------------" rel="noopener follow">Marcus Noll</a></p></div></div></div><span class="ir is" aria-hidden="true"><span class="bf b bg z du">·</span></span><p class="bf b io ip du"><span><a class="it iu ah ai aj ak al am an ao ap aq ar ex iv iw" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2Ff12092972d20&amp;operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;user=Marcus+Noll&amp;userId=f12092972d20&amp;source=post_page-f12092972d20--byline--cc9b3e9d16a---------------------post_header------------------" rel="noopener follow">Follow</a></span></p></div></div></span></div></div><div class="l ix"><span class="bf b bg z du"><div class="ab cn iy iz ja"><div class="fu fv ab"><div class="bf b bg z du ab jb"><span class="jc l ix">Published in</span><div><div class="l" aria-hidden="false"><a class="af ag ah ai aj ak al am an ao ap aq ar iq ab q" data-testid="publicationName" href="https://tech.new-work.se/?source=post_page---byline--cc9b3e9d16a---------------------------------------" rel="noopener ugc nofollow"><p class="bf b bg z jd je jf jg jh ji jj jk bk">New Work Development</p></a></div></div></div><div class="h k"><span class="ir is" aria-hidden="true"><span class="bf b bg z du">·</span></span></div></div><span class="bf b bg z du"><div class="ab ae"><span data-testid="storyReadTime">16 min read</span><div class="jl jm l" aria-hidden="true"><span class="l" aria-hidden="true"><span class="bf b bg z du">·</span></span></div><span data-testid="storyPublishDate">Dec 6, 2022</span></div></span></div></span></div></div></div><div class="ab cp jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc"><div class="h k w fg fh q"><div class="ks l"><div class="ab q kt ku"><div class="pw-multi-vote-icon fj jc kv kw kx"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerClapButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fxing-engineering%2Fcc9b3e9d16a&amp;operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;user=Marcus+Noll&amp;userId=f12092972d20&amp;source=---header_actions--cc9b3e9d16a---------------------clap_footer------------------" rel="noopener follow"><div><div class="bm" aria-hidden="false"><div class="ky ao kz la lb lc am ld le lf kx"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lg lh li lj lk ll lm"><p class="bf b dv z du"><span class="ln">--</span></p></div></div></div><div><div class="bm" aria-hidden="false"><button class="ao ky lo lp ab q fk lq lr" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="ls"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg></button></div></div></div><div class="ab q kd ke kf kg kh ki kj kk kl km kn ko kp kq kr"><div class="lt k j i d"></div><div class="h k"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerBookmarkButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2Fcc9b3e9d16a&amp;operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;source=---header_actions--cc9b3e9d16a---------------------bookmark_footer------------------" rel="noopener follow"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lu" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="fd lv cn"><div class="l ae"><div class="ab cb"><div class="lw lx ly lz ma mb ci bh"><div class="ab"><div class="bm" aria-hidden="false"><div><div class="bm" aria-hidden="false"><button aria-label="Listen" data-testid="audioPlayButton" class="af fk ah ai aj ak al mc an ao ap ex md me lr mf mg mh mi mj s mk ml mm mn mo mp mq u mr ms mt"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m3.376 10.416-4.599 3.066a.5.5 0 0 1-.777-.416V8.934a.5.5 0 0 1 .777-.416l4.599 3.066a.5.5 0 0 1 0 .832" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Listen</p></div></button></div></div></div></div></div></div></div></div><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="headerSocialShareButton" class="af fk ah ai aj ak al mc an ao ap ex md me lr mf mg mh mi mj s mk ml mm mn mo mp mq u mr ms mt"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Share</p></div></button></div></div></div></div></div></div></div></div></div><p id="6029" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">At NEW WORK SE, every team is free to decide on the browser test automation tooling for their project. However, information from tooling vendors and other parties (e.g. blog posts) is often not detailed enough and also misleading. To fill the gaps, I decided to compile the knowledge that I gathered during daily business and <a class="af ns" href="https://medium.com/xing-hackweek" rel="noopener">Hackweek</a> research.</p><p id="3380" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">This document is for you if you have to decide upon which tooling to use for running automated browser tests in your project. But this is not your usual browser test tooling shootout, discussing which tool provides the best API or the coolest new feature. No, this guide is different. Next to the tools, it also discusses idiosyncrasies of browsers, the validity of the tools’ test results and, last but not least, the requirements of your project.</p><p id="2717" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">These are the three main sections of the document:</p><ul class=""><li id="16b3" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk"><strong class="mw gv">Browsers</strong>, which discusses basics, compatibility and common gotchas related to testing</li><li id="bc06" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Browser test tools</strong>, which provides an overview and discusses important differences and takeaways in more depth</li><li id="ee17" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Your project’s characteristics</strong>, giving some hints on which project characteristics may have an influence on your browser test tool decision</li></ul><p id="2a59" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">In case you do not want to read through everything in all detail, just skip to the conclusion at the end of the document.</p></div></div></div><div class="ab cb ob oc od oe" role="separator"><span class="of by bm og oh oi"></span><span class="of by bm og oh oi"></span><span class="of by bm og oh"></span></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><h1 id="48b7" class="oj ok gu bf ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg bk">Browsers</h1><p id="f689" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">First, we need to talk about browsers. Because a) that is what your customers are using to interact with your web application. And b) it is browsers that you aim to automate your tests in.</p><h2 id="8699" class="pm ok gu bf ol pn po dy op pp pq ea ot nf pr ps pt nj pu pv pw nn px py pz qa bk"><strong class="al">The basics</strong></h2><p id="187f" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">At time of writing, the following browsers are the most well-known: Chrome, Edge, Firefox, Safari. There are also a lot of others, like Opera, Brave, Samsung Internet, or UC Browser.</p><p id="a3b2" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">One can say that the majority of websites gets rendered by one of these three rendering engines:</p><ul class=""><li id="7633" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk"><a class="af ns" href="https://en.wikipedia.org/wiki/Blink_(browser_engine" rel="noopener ugc nofollow" target="_blank">Blink</a>, which powers Chrome, Edge, Samsung Internet Browser, Opera and others</li><li id="2b76" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://en.wikipedia.org/wiki/Gecko_(software)" rel="noopener ugc nofollow" target="_blank">Gecko</a>, which powers Firefox</li><li id="2916" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://en.wikipedia.org/wiki/WebKit" rel="noopener ugc nofollow" target="_blank">WebKit</a>, which powers Safari (macOS/iOS) and any browser running on iOS devices</li></ul><h2 id="3604" class="pm ok gu bf ol pn po dy op pp pq ea ot nf pr ps pt nj pu pv pw nn px py pz qa bk"><strong class="al">Browser compatibility and interoperability</strong></h2><p id="2b16" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">Each browser should follow <a class="af ns" href="https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/The_web_and_web_standards#web_standards" rel="noopener ugc nofollow" target="_blank">web standards</a>. Some browsers adhere well to those standards, some not so well.</p><p id="d829" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">For Chrome, Edge, Firefox and Safari, the <a class="af ns" href="https://web-platform-tests.org/index.html" rel="noopener ugc nofollow" target="_blank">Web Platform Tests project</a> provides <a class="af ns" href="https://wpt.fyi/results" rel="noopener ugc nofollow" target="_blank"><strong class="mw gv">empirical</strong> evidence of how well they do</a>. But there is also a lot of (albeit <strong class="mw gv">anecdotal</strong>, still large scale) evidence out there.</p><p id="ebee" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Examples:</strong></p><ul class=""><li id="b375" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk"><a class="af ns" href="https://github.com/adobe/react-spectrum/wiki/Tracker-for-External-Browser-Bugs,-Library-Bugs,-and-Features" rel="noopener ugc nofollow" target="_blank">Browser bugs filed</a> by the <a class="af ns" href="https://react-spectrum.adobe.com" rel="noopener ugc nofollow" target="_blank">React Spectrum</a> team at Adobe (as of September 2022, <a class="af ns" href="https://twitter.com/devongovett/status/1565764062054494208" rel="noopener ugc nofollow" target="_blank">“almost 60% are WebKit. ~25% Chrome, ~16% Firefox”</a>)</li><li id="ffc7" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">Browser vendors themselves acknowledge the problem and decided to act upon it in the <a class="af ns" href="https://web.dev/interop-2022" rel="noopener ugc nofollow" target="_blank">Interop 2022 initiative</a></li><li id="b1b1" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://insights.developer.mozilla.org/reports/mdn-browser-compatibility-report-2020.html#findings-browsers" rel="noopener ugc nofollow" target="_blank">Developer quotes</a> from the MDN Browser Compatibility Report 2020</li></ul><h2 id="0e6c" class="pm ok gu bf ol pn po dy op pp pq ea ot nf pr ps pt nj pu pv pw nn px py pz qa bk"><strong class="al">Common gotchas related to testing</strong></h2><p id="89cd" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">Diverging behavior between browsers is (sadly) pretty normal. But apart from diverging behavior between browser A and browser B, there may even be differences between browsers of the same name (e.g. Safari macOS and Safari iOS) or even between browsers that are using the exact same build (e.g. headless and headed instances). Some of these differences are well-known, some of them not.</p><p id="6c88" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Safari macOS ain’t Safari iOS</strong></p><p id="3d1c" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Even when the Safari version is identical on macOS and iOS, you may encounter differences between both. One possible reason for this is that the WebKit version used in Safari is not guaranteed to be the same across iOS and macOS (see <a class="af ns" href="https://en.wikipedia.org/wiki/Safari_version_history" rel="noopener ugc nofollow" target="_blank">Safari version history on Wikipedia</a>).</p><p id="1743" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">There could be other reasons that are hard to pinpoint, probably due to macOS/iOS specifics. Whatever the reason, developers experience these differences in the wild. The <a class="af ns" href="https://insights.developer.mozilla.org/reports/mdn-browser-compatibility-report-2020.html#findings-browsers" rel="noopener ugc nofollow" target="_blank">MDN Browser Compatibility Report 2020</a> contains a number of developer quotes revolving around the topic¹.</p><p id="0ea1" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Chrome iOS ain’t Chrome</strong></p><p id="0159" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Any web browser app running on iOS (be it Chrome iOS, Firefox iOS, Edge iOS or else) has to use the WebKit rendering engine. This is because Apple mandates it. <a class="af ns" href="https://developer.apple.com/app-store/review/guidelines/#software-requirements" rel="noopener ugc nofollow" target="_blank">Apple’s App Store Review Guidelines</a> as of September 2022:</p><blockquote class="qb qc qd"><p id="4802" class="mu mv qe mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">“Apps that browse the web must use the appropriate WebKit framework and WebKit Javascript.”</p></blockquote><p id="9d5c" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">But even when the same rendering engine is used, we have seen differences in browser behavior. For example, the browser chrome (the UI elements of the browser, e.g. the address field, bookmark buttons) can behave differently, i.e. collapse/expand in different ways or take up more space on the screen, reducing the viewport size.</p><p id="9763" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">WebKit ain’t Safari</strong></p><p id="fc7e" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">It is not safe to say that a WebKit build behaves the same as the Safari binary shipped with iOS or macOS. <a class="af ns" href="https://stackoverflow.com/questions/67046548/a-link-that-receives-pointer-events-after-animating-isnt-clickable-in-safari" rel="noopener ugc nofollow" target="_blank">Here is an anecdotal example of some test passing in a WebKit build, but failing in Safari</a>. However, this example does not provide enough information in order to make a clear statement: It neither mentions the WebKit version nor the Safari version and there are no statements by WebKit or Apple engineers. Maybe there are no differences if you compare a WebKit build’s behavior with Safari that uses the exact same WebKit version.</p><p id="3ab4" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">What is safe to say</strong>, though, is that you <strong class="mw gv">could</strong> get different results if the versions of your WebKit build and the WebKit version in your customer’s Safari browser do not match. Imagine for example you are testing your application in the latest WebKit build that contains a new feature. Your customer’s Safari browser may not use the latest WebKit version, so it lacks that new WebKit feature. In this scenario, your test passes in WebKit, but fails in Safari used by your customer.</p><p id="3adc" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">This of course applies to other constellations of “open-source builds vs. commercial builds” as well, e.g. Chromium vs. Chrome, or even constellations of nightly vs. stable channels (mentioned further down below).</p><p id="c639" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Headless ain’t headed</strong></p><p id="2f7a" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Headless browsers show different behavior in certain areas when compared to a headed instance. We are aware of the following examples:</p><ul class=""><li id="ce6f" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk"><a class="af ns" href="https://marcusnoll.de/Browser+automation/Browser-specific+gotchas#Accept-Language+header+not+set+as+expected" rel="noopener ugc nofollow" target="_blank">‘Accept-Language’ header not set as expected</a></li><li id="cbfc" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://marcusnoll.de/Browser+automation/Browser-specific+gotchas#Viewport+height+is+greater+in+headless+mode" rel="noopener ugc nofollow" target="_blank">Viewport height is greater in headless mode</a></li><li id="8401" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">Intersection observer may behave differently in headless browsers</li><li id="dd8b" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">In Chrome, not all code paths may be executed when running the browser in headless mode (<a class="af ns" href="https://groups.google.com/g/chromedriver-users/c/XclDou5fS6s/m/WMRM2S7WBAAJ" rel="noopener ugc nofollow" target="_blank">“headless is a different browser”</a>)</li></ul><p id="e917" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Nightly/beta channel ain’t stable channel</strong></p><p id="c5cc" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">This should be obvious. A pre-release channel may contain bugs, but it is also probable that a feature shipped in a pre-release channel is not available in the stable release channel yet. In other words: If you run your tests in a pre-release channel and see them pass, it could be that the same tests fail when run in the stable channel, or vice versa.</p><p id="de8b" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Mobile browser emulation ain’t an actual mobile browser</strong></p><p id="995a" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Similar to the previous section, this should be obvious as well. Sadly, browser test tool vendors’ marketing is often misleading and we observed people falling for it.</p><p id="03a5" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">To make it clear: If you emulate an iPhone e.g. in your Chrome’s Devtools running on a desktop device, this only sets certain parameters (such as device pixel ratio, viewport size, touch events and more). This setup cannot magically reproduce a proper Safari browser on a proper iPhone. Because after all, the iPhone browser is emulated in a Chrome browser powered by the Blink engine and not by WebKit.</p></div></div></div><div class="ab cb ob oc od oe" role="separator"><span class="of by bm og oh oi"></span><span class="of by bm og oh oi"></span><span class="of by bm og oh"></span></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><h1 id="d8fa" class="oj ok gu bf ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg bk">Browser test tools</h1><p id="3cf1" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">Every browser test tool has its purpose, its own strengths and deficits. Thus, comparing them is hard and in some aspects unfair. But for the sake of an overview, we provide comparison tables, clustered in separate sections to make the information digestible. After that, we discuss notable differences in more detail.</p><h2 id="adca" class="pm ok gu bf ol pn po dy op pp pq ea ot nf pr ps pt nj pu pv pw nn px py pz qa bk">Browser test tool overview</h2><p id="0a49" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">All information is split as follows:</p><ul class=""><li id="3bc6" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk"><strong class="mw gv">Basic information:</strong> Purpose, licence, year of release, architecture and more</li><li id="9459" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Browser support:</strong> Which (mobile) browsers the tool supports</li><li id="03c4" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Validity of test results:</strong> How close the test results are to real life conditions</li><li id="f1b8" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Feature set:</strong> Every tool we discuss in this document is able to do what you can expect from a browser automation tool: Navigate to URLs, find elements, click, type, drag/drop, read/create cookies, wait for conditions, start headless browsers, create screenshots, run tests/browsers in parallel etc. This section lists features that are not supported equally well across tools.</li><li id="5b71" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Developer experience:</strong> How easy it is to set up, to write and debug tests, how good the documentation is, etc.</li><li id="f014" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Key strengths and limitations:</strong> What the tools are exceptionally good or bad at</li></ul><p id="c8f8" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">One word about WebDriver: The comparison tables do not list specific WebDriver-based tools. This is because the overview would become too loaded.</p><p id="454d" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Basic information</strong></p><figure class="qi qj qk ql qm qn qf qg paragraph-image"><div role="button" tabindex="0" class="qo qp fj qq bh qr"><div class="qf qg qh"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*Jwac8jId7lcZ0pkftBxsVg.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*Jwac8jId7lcZ0pkftBxsVg.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*Jwac8jId7lcZ0pkftBxsVg.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*Jwac8jId7lcZ0pkftBxsVg.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*Jwac8jId7lcZ0pkftBxsVg.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Jwac8jId7lcZ0pkftBxsVg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*Jwac8jId7lcZ0pkftBxsVg.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*Jwac8jId7lcZ0pkftBxsVg.png 640w, https://miro.medium.com/v2/resize:fit:720/1*Jwac8jId7lcZ0pkftBxsVg.png 720w, https://miro.medium.com/v2/resize:fit:750/1*Jwac8jId7lcZ0pkftBxsVg.png 750w, https://miro.medium.com/v2/resize:fit:786/1*Jwac8jId7lcZ0pkftBxsVg.png 786w, https://miro.medium.com/v2/resize:fit:828/1*Jwac8jId7lcZ0pkftBxsVg.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*Jwac8jId7lcZ0pkftBxsVg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*Jwac8jId7lcZ0pkftBxsVg.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="A table showing basic information for each tool. A markdown version of the table is available at https://gist.github.com/systemboogie/7ce00ac06b933d12521a0281b005551c" class="bh mb qs c" width="700" height="447" loading="lazy"/></picture></div></div><figcaption class="qt ff qu qf qg qv qw bf b bg z du">Click <a class="af ns" href="https://gist.github.com/systemboogie/7ce00ac06b933d12521a0281b005551c" rel="noopener ugc nofollow" target="_blank">here</a> for a markdown version of the table</figcaption></figure><p id="cdb7" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Browser support</strong></p><figure class="qi qj qk ql qm qn qf qg paragraph-image"><div role="button" tabindex="0" class="qo qp fj qq bh qr"><div class="qf qg qx"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*YhG2fAxGS9WUbatOnhONVQ.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*YhG2fAxGS9WUbatOnhONVQ.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*YhG2fAxGS9WUbatOnhONVQ.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*YhG2fAxGS9WUbatOnhONVQ.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*YhG2fAxGS9WUbatOnhONVQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*YhG2fAxGS9WUbatOnhONVQ.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*YhG2fAxGS9WUbatOnhONVQ.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*YhG2fAxGS9WUbatOnhONVQ.png 640w, https://miro.medium.com/v2/resize:fit:720/1*YhG2fAxGS9WUbatOnhONVQ.png 720w, https://miro.medium.com/v2/resize:fit:750/1*YhG2fAxGS9WUbatOnhONVQ.png 750w, https://miro.medium.com/v2/resize:fit:786/1*YhG2fAxGS9WUbatOnhONVQ.png 786w, https://miro.medium.com/v2/resize:fit:828/1*YhG2fAxGS9WUbatOnhONVQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*YhG2fAxGS9WUbatOnhONVQ.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*YhG2fAxGS9WUbatOnhONVQ.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="A table comparing browser support of each tool. A markdown version of the table is available at https://gist.github.com/systemboogie/5a59f7293cf6372339fcb0f5b5536e6d" class="bh mb qs c" width="700" height="316" loading="lazy"/></picture></div></div><figcaption class="qt ff qu qf qg qv qw bf b bg z du">Click <a class="af ns" href="https://gist.github.com/systemboogie/5a59f7293cf6372339fcb0f5b5536e6d" rel="noopener ugc nofollow" target="_blank">here</a> for a markdown version of the table</figcaption></figure><p id="84bb" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Validity of test results</strong></p><figure class="qi qj qk ql qm qn qf qg paragraph-image"><div role="button" tabindex="0" class="qo qp fj qq bh qr"><div class="qf qg qh"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*6iZ4j3hB2uCALHWqE9QTWg.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*6iZ4j3hB2uCALHWqE9QTWg.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*6iZ4j3hB2uCALHWqE9QTWg.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*6iZ4j3hB2uCALHWqE9QTWg.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*6iZ4j3hB2uCALHWqE9QTWg.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*6iZ4j3hB2uCALHWqE9QTWg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*6iZ4j3hB2uCALHWqE9QTWg.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*6iZ4j3hB2uCALHWqE9QTWg.png 640w, https://miro.medium.com/v2/resize:fit:720/1*6iZ4j3hB2uCALHWqE9QTWg.png 720w, https://miro.medium.com/v2/resize:fit:750/1*6iZ4j3hB2uCALHWqE9QTWg.png 750w, https://miro.medium.com/v2/resize:fit:786/1*6iZ4j3hB2uCALHWqE9QTWg.png 786w, https://miro.medium.com/v2/resize:fit:828/1*6iZ4j3hB2uCALHWqE9QTWg.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*6iZ4j3hB2uCALHWqE9QTWg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*6iZ4j3hB2uCALHWqE9QTWg.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="A table comparing the tools in terms of validity of test results. A markdown version of the table is available at https://gist.github.com/systemboogie/41fd47cd373db31e58a1c81dd3249ab6" class="bh mb qs c" width="700" height="103" loading="lazy"/></picture></div></div><figcaption class="qt ff qu qf qg qv qw bf b bg z du">Click <a class="af ns" href="https://gist.github.com/systemboogie/41fd47cd373db31e58a1c81dd3249ab6" rel="noopener ugc nofollow" target="_blank">here</a> for a markdown version of the table</figcaption></figure><p id="a543" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Feature set</strong></p><figure class="qi qj qk ql qm qn qf qg paragraph-image"><div role="button" tabindex="0" class="qo qp fj qq bh qr"><div class="qf qg qx"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*F3QunvGxLDxVyLbdvlyMZQ.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*F3QunvGxLDxVyLbdvlyMZQ.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*F3QunvGxLDxVyLbdvlyMZQ.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*F3QunvGxLDxVyLbdvlyMZQ.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*F3QunvGxLDxVyLbdvlyMZQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*F3QunvGxLDxVyLbdvlyMZQ.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*F3QunvGxLDxVyLbdvlyMZQ.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*F3QunvGxLDxVyLbdvlyMZQ.png 640w, https://miro.medium.com/v2/resize:fit:720/1*F3QunvGxLDxVyLbdvlyMZQ.png 720w, https://miro.medium.com/v2/resize:fit:750/1*F3QunvGxLDxVyLbdvlyMZQ.png 750w, https://miro.medium.com/v2/resize:fit:786/1*F3QunvGxLDxVyLbdvlyMZQ.png 786w, https://miro.medium.com/v2/resize:fit:828/1*F3QunvGxLDxVyLbdvlyMZQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*F3QunvGxLDxVyLbdvlyMZQ.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*F3QunvGxLDxVyLbdvlyMZQ.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="A table comparing the the tools in terms of feature set. A markdown version of the table is available at https://gist.github.com/systemboogie/e7a90eb953b80f9669ef5f06c7eb87c6" class="bh mb qs c" width="700" height="385" loading="lazy"/></picture></div></div><figcaption class="qt ff qu qf qg qv qw bf b bg z du">Click <a class="af ns" href="https://gist.github.com/systemboogie/e7a90eb953b80f9669ef5f06c7eb87c6" rel="noopener ugc nofollow" target="_blank">here</a> for a markdown version of the table</figcaption></figure><ul class=""><li id="c843" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk"><strong class="mw gv">Automatic wait on elements:</strong> The tool tries to automatically wait for an element before interacting with it. This eliminates a lot explicit wait commands in the test code</li><li id="f871" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Remote execution:</strong> The support running browsers on a remote machine (not on the machine that executes the test code)</li><li id="903c" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Video recordings:</strong> The tool can create a video recording of what happened in the browser during the test run</li><li id="c4af" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Switch tabs:</strong> The tool supports creating tabs in a browser instance</li><li id="c4f2" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">iFrame support:</strong> The tool supports switching between iFrames</li><li id="9df6" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Shadow DOM support:</strong> The tool works with Shadow DOM elements without extra effort</li><li id="5893" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Network inspection/interception/mocking:</strong> The tool is able to “look” into what is happening in the network. Therefore, blocking or mocking network requests is also possible</li><li id="649e" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Browser console inspection:</strong> The tool is able to “look” into the browser console</li><li id="8b0f" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Test recorder:</strong> The tool is able to record interaction with the UI of an app and create test code from that</li><li id="4a4a" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Test script debugger:</strong> The tool supports replaying a test in the browser, allowing the engineer to inspect what exactly was going on</li><li id="295f" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Component testing:</strong> The tool supports testing of UI components in isolation (like it is often done with JSDOM)</li></ul><p id="aec9" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Developer experience</strong></p><figure class="qi qj qk ql qm qn qf qg paragraph-image"><div role="button" tabindex="0" class="qo qp fj qq bh qr"><div class="qf qg qy"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*aD5haot4PndaWnY5E3qoGg.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*aD5haot4PndaWnY5E3qoGg.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*aD5haot4PndaWnY5E3qoGg.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*aD5haot4PndaWnY5E3qoGg.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*aD5haot4PndaWnY5E3qoGg.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*aD5haot4PndaWnY5E3qoGg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*aD5haot4PndaWnY5E3qoGg.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*aD5haot4PndaWnY5E3qoGg.png 640w, https://miro.medium.com/v2/resize:fit:720/1*aD5haot4PndaWnY5E3qoGg.png 720w, https://miro.medium.com/v2/resize:fit:750/1*aD5haot4PndaWnY5E3qoGg.png 750w, https://miro.medium.com/v2/resize:fit:786/1*aD5haot4PndaWnY5E3qoGg.png 786w, https://miro.medium.com/v2/resize:fit:828/1*aD5haot4PndaWnY5E3qoGg.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*aD5haot4PndaWnY5E3qoGg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*aD5haot4PndaWnY5E3qoGg.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="A table comparing the developer experience of each tool. A markdown version of the table is available at https://gist.github.com/systemboogie/5aeb41c9f872451fd15d865890103634" class="bh mb qs c" width="700" height="196" loading="lazy"/></picture></div></div><figcaption class="qt ff qu qf qg qv qw bf b bg z du">Click <a class="af ns" href="https://gist.github.com/systemboogie/5aeb41c9f872451fd15d865890103634" rel="noopener ugc nofollow" target="_blank">here</a> for a markdown version of the table</figcaption></figure><p id="95ac" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Key strengths and limitations</strong></p><figure class="qi qj qk ql qm qn qf qg paragraph-image"><div role="button" tabindex="0" class="qo qp fj qq bh qr"><div class="qf qg qy"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*X9_HlQE8vY2XWMWGdh_pbw.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*X9_HlQE8vY2XWMWGdh_pbw.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*X9_HlQE8vY2XWMWGdh_pbw.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*X9_HlQE8vY2XWMWGdh_pbw.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*X9_HlQE8vY2XWMWGdh_pbw.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*X9_HlQE8vY2XWMWGdh_pbw.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*X9_HlQE8vY2XWMWGdh_pbw.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*X9_HlQE8vY2XWMWGdh_pbw.png 640w, https://miro.medium.com/v2/resize:fit:720/1*X9_HlQE8vY2XWMWGdh_pbw.png 720w, https://miro.medium.com/v2/resize:fit:750/1*X9_HlQE8vY2XWMWGdh_pbw.png 750w, https://miro.medium.com/v2/resize:fit:786/1*X9_HlQE8vY2XWMWGdh_pbw.png 786w, https://miro.medium.com/v2/resize:fit:828/1*X9_HlQE8vY2XWMWGdh_pbw.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*X9_HlQE8vY2XWMWGdh_pbw.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*X9_HlQE8vY2XWMWGdh_pbw.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="A table comparing key strengths and limitations. A markdown version of the table is available at https://gist.github.com/systemboogie/3dc07a64a849507ac296ce6f07926379" class="bh mb qs c" width="700" height="452" loading="lazy"/></picture></div></div><figcaption class="qt ff qu qf qg qv qw bf b bg z du">Click <a class="af ns" href="https://gist.github.com/systemboogie/3dc07a64a849507ac296ce6f07926379" rel="noopener ugc nofollow" target="_blank">here</a> for a markdown version of the table</figcaption></figure><h2 id="57f6" class="pm ok gu bf ol pn po dy op pp pq ea ot nf pr ps pt nj pu pv pw nn px py pz qa bk">Important differences and takeaways</h2><p id="d7a2" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">Certain differences between the tools are worth discussing in more detail.</p><p id="e139" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Different interpretations of “cross-browser”</strong></p><p id="06df" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">All of the above-listed tools except for Puppeteer can claim that they support “cross-browser” testing. This is because they support running tests in more than one browser. Right? Well… technically, yes. But there are some things to keep in mind.</p><ul class=""><li id="b64b" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk">Cypress and Playwright do not support Safari: Instead, they support WebKit. We already discussed above that WebKit ain’t Safari</li><li id="122c" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">Cypress and Playwright do not offer testing on real mobile browsers: Instead, they rely on mobile emulation in the browser’s dev tools. We already discussed that mobile browser emulation ain’t an actual mobile browser</li><li id="5a0b" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">Puppeteer and Playwright <a class="af ns" href="https://playwright.dev/docs/browsers" rel="noopener ugc nofollow" target="_blank">couple browser versions to the version of the tool</a>. The browsers installed by Playwright and Puppeteer are always a little ahead of the current stable browser versions. For example, if you upgrade Playwright, you get a new set of browser versions. If you do not upgrade Playwright for a longer time, the browser versions covered in your tests lag behind the real world</li></ul><p id="a2eb" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Native vs. synthetic events</strong></p><p id="9aa9" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Let’s talk about user events emulated by the browser test tools, for example <a class="af ns" href="https://developer.mozilla.org/en-US/docs/Web/API/Element#mouse_events" rel="noopener ugc nofollow" target="_blank">mouse events</a> and <a class="af ns" href="https://developer.mozilla.org/en-US/docs/Web/API/Element#keyboard_events" rel="noopener ugc nofollow" target="_blank">keyboard events</a>.</p><p id="7943" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Playwright, Puppeteer and all WebDriver-based tools emulate “native events”. This is the type of events a real user creates when they interact with the browser. Native events are received by the browser from the operating system (OS).</p><p id="386d" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Cypress and TestCafé on the other hand produce “synthetic events”. These events are produced by executing JavaScript directly in the browser, no OS-level events are involved.</p><p id="ac9f" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">It is important to understand that an application-under-test may behave differently, depending on whether it receives a native event or a synthetic event. To illustrate the difference by example of a mouse click, imagine a button that is covered by a transparent element. For a real user, the button would be visible, but not clickable — the transparent element would receive the click instead of the button. An automation tool producing a native click event would yield the same result. However, with a synthetic click event, the button would still receive the click.</p><p id="e6a0" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">For context, resorting to synthetic click events in WebDriver is considered a bad practice since a very long time. You can find discussions about the topic dating back to the pre-Cypress, pre-TestCafé era (example <a class="af ns" href="https://stackoverflow.com/questions/24571048/selenium-webelement-click-vs-javascript-click-event" rel="noopener ugc nofollow" target="_blank">from 2014</a> and <a class="af ns" href="https://stackoverflow.com/questions/34562061/webdriver-click-vs-javascript-click" rel="noopener ugc nofollow" target="_blank">from 2016</a>).</p><p id="d062" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">But there is more to it. Certain browser features just cannot be automated <strong class="mw gv">at all</strong> without native events. Some examples are: Sending keys to the page (tab key for accessibility testing), file upload or <a class="af ns" href="https://stackoverflow.com/questions/61880487/testcafe-unable-to-click-on-a-button" rel="noopener ugc nofollow" target="_blank">full-screen mode</a>.</p><p id="5cbd" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Feature set comparison</strong></p><p id="099f" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Cypress, Playwright and TestCafé set the benchmark when it comes to the feature set. For example, all four tools allow for…</p><ul class=""><li id="ecd7" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk">… network inspection/interception/mocking</li><li id="5ee5" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">… browser console inspection</li><li id="7f96" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">… automatic waiting on elements</li><li id="e11a" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">… point-and-click recording of test steps</li><li id="04b0" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">… debugging test scripts</li><li id="fc0b" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">… recording video and screenshots of the executed test</li></ul><p id="fb3f" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Anything based on WebDriver has to start at a lower plateau. Some WebDriver-based tools implement certain features where possible (e.g. automatic waiting for elements), but they cannot implement features when constrained by WebDriver (e.g. browser console inspection). Third-party services like Browserstack and Sauce Labs can fill that gap, but not across all browsers.</p><p id="0155" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Ease of use and developer experience</strong></p><p id="f15c" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Cypress, Playwright and TestCafé lead the pack in terms of ease of use. They come bundled with everything required to write browser tests, are easy to learn, offer great features for debugging tests and offer comprehensive documentation.</p><p id="e157" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Puppeteer and WebDriver-based tools do not shine here. However, to be fair with regards to WebDriver, there are differences between tools created by the <a class="af ns" href="https://www.selenium.dev/" rel="noopener ugc nofollow" target="_blank">Selenium project</a> versus tools created by other maintainers. For example, <a class="af ns" href="https://webdriver.io/" rel="noopener ugc nofollow" target="_blank">WebdriverIO</a> does not have that steep of a learning curve, has debugging functionality and comprehensive documentation.</p><p id="7990" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk"><strong class="mw gv">Ownership, maintenance and governance</strong></p><p id="343e" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">WebDriver as a W3C standard is part of the Selenium project, which is open-source with the <a class="af ns" href="https://sfconservancy.org/projects/current/" rel="noopener ugc nofollow" target="_blank">Software Freedom Conservancy</a> as copyright holder. There are tools built upon WebDriver that follow a similar approach. One example is WebdriverIO, which is backed by the <a class="af ns" href="https://openjsf.org/" rel="noopener ugc nofollow" target="_blank">OpenJS Foundation</a>.</p><p id="9746" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Cypress, Playwright, Puppeteer and TestCafé are all in some way backed or maintained by a company. This may also apply to WebDriver-based tools. There is, for example, Nightwatch.js with Browserstack as copyright holder. Keep in mind that such companies may discontinue working on their tool at any time. One famous example for that is <a class="af ns" href="https://github.com/angular/protractor/issues/5502" rel="noopener ugc nofollow" target="_blank">Angular/Google announcing in 2021 to pull the plug from Protractor (a WebDriver-based tool)</a>.</p></div></div></div><div class="ab cb ob oc od oe" role="separator"><span class="of by bm og oh oi"></span><span class="of by bm og oh oi"></span><span class="of by bm og oh"></span></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><h1 id="29d0" class="oj ok gu bf ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg bk"><strong class="al">Your project’s characteristics</strong></h1><p id="78b4" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">All of the above information should help you getting a decent understanding of browsers and browser automation tools. However, you cannot make a decision without taking some of your project’s characteristics into account. The most important seem to be browser support and certain team characteristics.</p><h2 id="9126" class="pm ok gu bf ol pn po dy op pp pq ea ot nf pr ps pt nj pu pv pw nn px py pz qa bk"><strong class="al">Which browsers do you have to support?</strong></h2><p id="8886" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">This is informed by several aspects. Here are some examples.</p><ul class=""><li id="05f6" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk">The type of application you are building: Desktop-only or both, desktop and mobile</li><li id="1915" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">The targeted region(s): At NEW WORK SE, this is usually <a class="af ns" href="https://en.wikipedia.org/wiki/Geographical_distribution_of_German_speakers#German-speaking_Europe" rel="noopener ugc nofollow" target="_blank">DACH</a>. If you target more/other regions, keep in mind that browser/device market share can be quite different there</li><li id="cf03" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">The size of your userbase: More users means more diversity in browsers and devices. Also, if you have many users on your page, a small relative browser usage number may translate into a quite large absolute number</li><li id="6563" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">The targeted customers: In a B2B project, your customers may work on administered desktop machines that only allow certain browsers or browser versions. For example, larger companies only allow their employees to use the <a class="af ns" href="https://support.mozilla.org/en-US/kb/choosing-firefox-update-channel" rel="noopener ugc nofollow" target="_blank">Firefox Extended Support Release (ESR) channel</a> instead of the latest stable Firefox channel</li></ul><p id="95fc" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">If you need inspiration with regards to browser share numbers, have a look at the reports of your tracking suite. Alternatively, explore the data available on the <a class="af ns" href="https://gs.statcounter.com/" rel="noopener ugc nofollow" target="_blank">Statcounter browser market share overview</a>.</p><h2 id="cc0c" class="pm ok gu bf ol pn po dy op pp pq ea ot nf pr ps pt nj pu pv pw nn px py pz qa bk"><strong class="al">What are your team’s characteristics?</strong></h2><p id="fad4" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">Think about the characteristics of your team that may have an influence on your tool decision. Here are some examples.</p><ul class=""><li id="66dc" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk">Who will write the browser tests most of the time: Our suggestion is that frontend engineers do it, directly when working on the app. This most probably makes JavaScript a default as the programming language, but maybe you have someone “full-stack” on your team who prefers a different language</li><li id="7590" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">Expertise in browser automation tools: If you have never written automated browser tests (or not even any other code) before, the learning curve can be quite steep and you may want to start off with a tool that is easier to set up and learn</li></ul></div></div></div><div class="ab cb ob oc od oe" role="separator"><span class="of by bm og oh oi"></span><span class="of by bm og oh oi"></span><span class="of by bm og oh"></span></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><h1 id="c00a" class="oj ok gu bf ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg bk"><strong class="al">Conclusion</strong></h1><h2 id="3397" class="pm ok gu bf ol pn po dy op pp pq ea ot nf pr ps pt nj pu pv pw nn px py pz qa bk"><strong class="al">Trade-offs everywhere</strong></h2><p id="6306" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">It should be no surprise with all the things discussed above: None of the browser test tools mentioned in this document is a universal fit for any kind of project. There is no clear winner, no one tool to rule ’em all:</p><ul class=""><li id="4611" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk">Playwright and Puppeteer do not offer great/any cross-browser support</li><li id="69bc" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">Cypress, Playwright and Puppeteer do not offer mobile browser support</li><li id="ce5c" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">Cypress and TestCafé do not provide 100% valid test results</li><li id="6ce3" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">WebDriver-based solutions lack ease of use and good developer experience</li></ul><p id="43d8" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">This means that your path to a browser test tool decision will be paved with trade-offs. And after you arrived at a decision, brace yourself to also feel the trade-offs in your daily business.</p><h2 id="ff86" class="pm ok gu bf ol pn po dy op pp pq ea ot nf pr ps pt nj pu pv pw nn px py pz qa bk"><strong class="al">Two types of tools</strong></h2><p id="69b4" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">As of 2022, you can basically decide between two types of tools: The first type offers great features and developer experience (they satisfy engineer’s needs). The second type provides great support for off-the-shelf browsers and validity of test results (they satisfy your customer’s needs).</p><ul class=""><li id="8354" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk">First type: Cypress, TestCafé</li><li id="381b" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">Somehow both, first and second type: Playwright</li><li id="aec8" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">Second type: WebDriver-based tools</li></ul><p id="89b4" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Cypress and TestCafé are at home in the first category. Cypress has defined what can be expected from a browser test tool in terms of feature set, debuggability and developer experience. TestCafé is also a great tool in these categories. However, the lack of native events in both tools and some more limitations in Cypress (no iFrame support, no tab support, …) make them less attractive.</p><p id="3344" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Playwright is somehow at home in both categories. It provides great developer experience and also validity of test results, but it comes with one caveat: It has very limited browser support. It could be a good fit if your applicaton is desktop-only and only supports Chrome and Firefox. If you are able to manage browser versions (i.e. always be a little behind Playwright’s official releases), then this could work for you.</p><p id="0035" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">WebDriver-based tools are at home in the second category. WebDriver is <a class="af ns" href="https://boringtechnology.club/" rel="noopener ugc nofollow" target="_blank">boring technology</a> in the best sense of the word. And it does a very good job at being where your customers are. Some tools built upon WebDriver offer an okay-ish developer experience and they are quick in picking up the latest WebDriver features. Good examples are WebdriverIO and Nightwatch.js.</p><h2 id="d106" class="pm ok gu bf ol pn po dy op pp pq ea ot nf pr ps pt nj pu pv pw nn px py pz qa bk"><strong class="al">A nuanced comparison</strong></h2><p id="d4ad" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">Of course it is a bit unfair to paint a black and white picture. So let’s compare the discussed tools in a nuanced manner, focusing on the following properties:</p><ul class=""><li id="f849" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk"><strong class="mw gv">Browser support:</strong> How broad the browser support is and how close to real life conditions</li><li id="7198" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Validity of test results:</strong> How close the test results are to real life conditions</li><li id="b0ef" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Feature set:</strong> Number and type of features</li><li id="ff47" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Developer experience:</strong> Ease of use, debuggability, etc</li><li id="dc25" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><strong class="mw gv">Ownership, maintenance and governance: </strong>How independent the tool is from the favor of a company, how many maintainers it has, how independent it is in terms of governance</li></ul><figure class="qi qj qk ql qm qn qf qg paragraph-image"><div role="button" tabindex="0" class="qo qp fj qq bh qr"><div class="qf qg qz"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 640w, https://miro.medium.com/v2/resize:fit:720/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 720w, https://miro.medium.com/v2/resize:fit:750/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 750w, https://miro.medium.com/v2/resize:fit:786/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 786w, https://miro.medium.com/v2/resize:fit:828/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*-FoOHdT_6yYrV2ZgCtOSaQ.png 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="A radar chart comparing Cypress, Playwright, Puppeteer, TestCafé and WebDriver at a glance" class="bh mb qs c" width="700" height="396" loading="lazy"/></picture></div></div></figure></div></div></div><div class="ab cb ob oc od oe" role="separator"><span class="of by bm og oh oi"></span><span class="of by bm og oh oi"></span><span class="of by bm og oh"></span></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><h2 id="18b8" class="pm ok gu bf ol pn po dy op pp pq ea ot nf pr ps pt nj pu pv pw nn px py pz qa bk"><strong class="al">Our recommendation</strong></h2><p id="b50f" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">As mentioned in the introduction, this comparison of browser test tools is different, and here is why: We want to bring the customer perspective to the table. That may sound strange at first, since your customers do not pick your test tool and they <strong class="mw gv">do not know</strong> which tool you are using. But it’s them who <strong class="mw gv">feel the consequences</strong> if you miss bugs.</p><p id="b317" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Ideally, your testing happens in a stable-channel off-the-shelf browser, because that is what your customers are using. And ideally, your testing happens with native OS-level events, because that is what your customers are producing when working with your app. So, in light of that, the two best options are currently:</p><ul class=""><li id="96d1" class="mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr nt nu nv bk">Any WebDriver-based tool that provides good developer experience</li><li id="e204" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk">Playwright in case your app is desktop-only and Chrome/Firefox-only</li></ul><p id="9221" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">But after all, you have to decide yourself of course. We would be glad if this document helps you on your way to an informed decision. Have fun building great apps for your customers. Good luck!</p><p id="75e6" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">Thanks to Björn Brauer, Markus Wolf, Amilcar Gomes and Daniel Lauschke for reviewing this document!</p></div></div></div><div class="ab cb ob oc od oe" role="separator"><span class="of by bm og oh oi"></span><span class="of by bm og oh oi"></span><span class="of by bm og oh"></span></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><h1 id="ce6d" class="oj ok gu bf ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg bk"><strong class="al">Remarks</strong></h1><p id="0f9d" class="pw-post-body-paragraph mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr gn bk">[1]: Developer quotes from the MDN Browser Compatibility Report 2020:</p><blockquote class="qb qc qd"><p id="ad2f" class="mu mv qe mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">“Safari desktop does not support type=”date” on the `&lt;input&gt;` element on desktop though Safari iOS has support for this attribute.”</p><p id="5395" class="mu mv qe mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">“So the scroll worked fine in Chrome in iOS, in Chrome and Safari on macOS. But in Safari for iOS there was somewhere where that scroll was interfering with our scroll.”</p><p id="edb9" class="mu mv qe mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">“With iOS 13 they changed something and now scrolling works like garbage on iOS, especially on older devices such as an iPhone SE or older iPads. All the animations are broken and it doesn’t feel natural if you’re swiping through this gallery. Now I’ve used this in 5 or 6 projects, and something that used to work fine is now broken.”</p></blockquote><p id="3d7e" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">[2]: Tools built on top of WebDriver may have a different license</p><p id="bac9" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">[3]: Chromium is also possible</p><p id="20e6" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">[4]: Every given Playwright version supports: Chromium (current Chrome version + 1), Chrome/Edge current stable and beta, Firefox current stable, WebKit current trunk build</p><p id="5397" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">[5]: Depends on which tool you are using. For example, WebdriverIO ships with “automatic waits”</p><p id="2bb5" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">[6]: Depends on which tool you are using. WebdriverIO features a plugin that converts Chrome DevTools Recorder scripts to WebdriverIO test code</p><p id="b9fb" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">[7]: Depends on which tool you are using. Nightwatch.js supports component tests for Vue and React components</p><p id="0452" class="pw-post-body-paragraph mu mv gu mw b mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr gn bk">[8]: Depends on which tool you are using. Time to first test and debuggability is quite good with WebdriverIO, but not so much with the bare <a class="af ns" href="https://www.npmjs.com/package/selenium-webdriver" rel="noopener ugc nofollow" target="_blank">selenium-webdriver NPM package</a></p></div></div></div><div class="ab cb ob oc od oe" role="separator"><span class="of by bm og oh oi"></span><span class="of by bm og oh oi"></span><span class="of by bm og oh"></span></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><h1 id="843e" class="oj ok gu bf ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg bk">Further reading</h1><ul class=""><li id="c8cb" class="mu mv gu mw b mx ph mz na nb pi nd ne nf pj nh ni nj pk nl nm nn pl np nq nr nt nu nv bk"><a class="af ns" href="https://docs.cypress.io/guides/overview/why-cypress" rel="noopener ugc nofollow" target="_blank">Cypress docs</a></li><li id="18cf" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://github.com/cypress-io/cypress/issues/311" rel="noopener ugc nofollow" target="_blank">No support for native browser events in Cypress</a></li><li id="36ff" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://github.com/cypress-io/cypress/issues/136" rel="noopener ugc nofollow" target="_blank">No iFrame support in Cypress</a></li><li id="4fee" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://playwright.dev/docs/intro" rel="noopener ugc nofollow" target="_blank">Playwright docs</a></li><li id="a29c" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://applitools.com/blog/top-playwright-questions-answered/" rel="noopener ugc nofollow" target="_blank">Your Favorite Questions about Playwright, Answered From The Applitools Team</a></li><li id="0278" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://pptr.dev/" rel="noopener ugc nofollow" target="_blank">Puppeteer docs</a></li><li id="b4c3" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://testcafe.io/documentation/402635/getting-started" rel="noopener ugc nofollow" target="_blank">TestCafé docs</a></li><li id="d9ff" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://www.selenium.dev/documentation/webdriver/" rel="noopener ugc nofollow" target="_blank">WebDriver docs</a></li><li id="591d" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://webdriver.io/docs/gettingstarted" rel="noopener ugc nofollow" target="_blank">WebdriverIO docs</a></li><li id="d5d2" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://nightwatchjs.org/guide/overview/what-is-nightwatch.html" rel="noopener ugc nofollow" target="_blank">Nightwatch.js docs</a></li><li id="a5fe" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://marcusnoll.de/%2BDigital+garden/Browser+compatibility+and+interoperability" rel="noopener ugc nofollow" target="_blank">Link collection on the topic of browser compatibility and interoperability</a></li><li id="47ed" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://xenovation.com/blog/software-testing/cypress-vs-selenium#maturity-of-cypress" rel="noopener ugc nofollow" target="_blank">Cypress vs Selenium</a></li><li id="d1aa" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://www.browserstack.com/guide/cypress-vs-selenium" rel="noopener ugc nofollow" target="_blank">Cypress vs Selenium: Key Differences</a></li><li id="3c5c" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://applitools.com/blog/playwright-vs-selenium/" rel="noopener ugc nofollow" target="_blank">Playwright vs Selenium: What are the Main Differences and Which is Better?</a></li><li id="a44a" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://cathalmacdonnacha.com/cypress-vs-playwright-which-is-best-for-e2e-testing" rel="noopener ugc nofollow" target="_blank">Cypress vs Playwright: Which is best for E2E testing?</a></li><li id="ec96" class="mu mv gu mw b mx nw mz na nb nx nd ne nf ny nh ni nj nz nl nm nn oa np nq nr nt nu nv bk"><a class="af ns" href="https://youtu.be/cCOL7MC4Pl0?t=1794" rel="noopener ugc nofollow" target="_blank">Jake Archibald on native vs. JavaScript clicks</a> (excerpt from his talk “In The Loop - setTimeout, micro tasks, requestAnimationFrame, requestIdleCallback, …”) and <a class="af ns" href="https://twitter.com/egilhansen/status/1059861917995556872" rel="noopener ugc nofollow" target="_blank">thread about consequences for browser test tools on Twitter</a></li></ul></div></div></div></div></section></div></div></article></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ra rb ab ja"><div class="rc ab"><a class="rd ay am ao" href="https://medium.com/tag/browser-testing-tool?source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><div class="re fj cx rf ge rg rh bf b bg z bk ri">Browser Testing Tool</div></a></div><div class="rc ab"><a class="rd ay am ao" href="https://medium.com/tag/cross-browser-testing?source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><div class="re fj cx rf ge rg rh bf b bg z bk ri">Cross Browser Testing</div></a></div><div class="rc ab"><a class="rd ay am ao" href="https://medium.com/tag/browser-automation?source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><div class="re fj cx rf ge rg rh bf b bg z bk ri">Browser Automation</div></a></div></div></div></div><div class="l"></div><footer class="rj rk rl rm rn ab q ro ik c"><div class="l ae"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab cp rp"><div class="ab q kt"><div class="rq l"><span class="l rr rs rt e d"><div class="ab q kt ku"><div class="pw-multi-vote-icon fj jc kv kw kx"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fxing-engineering%2Fcc9b3e9d16a&amp;operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;user=Marcus+Noll&amp;userId=f12092972d20&amp;source=---footer_actions--cc9b3e9d16a---------------------clap_footer------------------" rel="noopener follow"><div><div class="bm" aria-hidden="false"><div class="ky ao kz la lb lc am ld le lf kx"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lg lh li lj lk ll lm"><p class="bf b dv z du"><span class="ln">--</span></p></div></div></span><span class="l h g f ru rv"><div class="ab q kt ku"><div class="pw-multi-vote-icon fj jc kv kw kx"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fxing-engineering%2Fcc9b3e9d16a&amp;operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;user=Marcus+Noll&amp;userId=f12092972d20&amp;source=---footer_actions--cc9b3e9d16a---------------------clap_footer------------------" rel="noopener follow"><div><div class="bm" aria-hidden="false"><div class="ky ao kz la lb lc am ld le lf kx"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lg lh li lj lk ll lm"><p class="bf b dv z du"><span class="ln">--</span></p></div></div></span></div><div class="bq ab"><div><div class="bm" aria-hidden="false"><button class="ao ky lo lp ab q fk lq lr" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="ls"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg></button></div></div></div></div><div class="ab q"><div class="oi l ix"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerBookmarkButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2Fcc9b3e9d16a&amp;operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;source=---footer_actions--cc9b3e9d16a---------------------bookmark_footer------------------" rel="noopener follow"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du lu" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="oi l ix"><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="footerSocialShareButton" class="af fk ah ai aj ak al mc an ao ap ex md me lr mf"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg></button></div></div></div></div></div></div></div></div></div></footer><div class="rw l"><div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="rx l"><div class="ab ry rz sa iz iy"><div class="sb sc sd se sf sg sh si sj sk ab cp"><div class="h k"><a href="https://tech.new-work.se/?source=post_page---post_publication_info--cc9b3e9d16a---------------------------------------" rel="noopener follow"><div class="fj ab"><img alt="New Work Development" class="sl ib ic cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*B1MD9EGz7rhVkx3WE3Rkog.png" width="48" height="48" loading="lazy"/><div class="sl l ic ib fs n fr sm"></div></div></a></div><div class="j i d"><a href="https://tech.new-work.se/?source=post_page---post_publication_info--cc9b3e9d16a---------------------------------------" rel="noopener follow"><div class="fj ab"><img alt="New Work Development" class="sl so sn cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*B1MD9EGz7rhVkx3WE3Rkog.png" width="64" height="64" loading="lazy"/><div class="sl l sn so fs n fr sm"></div></div></a></div><div class="j i d sp ix"><div class="ab"><span><a class="bf b bg z sq re sr ss st su sv ev ew sw sx sy fa fb fc fd bm fe ff" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fcollection%2Fxing-engineering&amp;operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;collection=New+Work+Development&amp;collectionId=35cb8c78d3cf&amp;source=post_page---post_publication_info--cc9b3e9d16a---------------------follow_profile------------------" rel="noopener follow">Follow</a></span></div></div></div><div class="ab co sz"><div class="ta tb tc td te l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" href="https://tech.new-work.se/?source=post_page---post_publication_info--cc9b3e9d16a---------------------------------------" rel="noopener follow"><h2 class="pw-author-name bf tg th ti tj tk tl tm nf ps pt nj pv pw nn py pz bk"><span class="gn tf">Published in <!-- -->New Work Development</span></h2></a><div class="rc ab ia"><div class="l ix"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/followers?source=post_page---post_publication_info--cc9b3e9d16a---------------------------------------">1K Followers</a></span></div><div class="bf b bg z du ab jb"><span class="ir l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar iq" rel="noopener follow" href="/protecting-sensitive-data-in-elixir-genservers-fac4a8b0ae15?source=post_page---post_publication_info--cc9b3e9d16a---------------------------------------">Last published <span>Nov 27, 2023</span></a></div></div><div class="tn l"><p class="bf b bg z bk"><span class="gn">Stories about building a better working world</span></p></div></div></div><div class="h k"><div class="ab"><span><a class="bf b bg z sq re sr ss st su sv ev ew sw sx sy fa fb fc fd bm fe ff" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fcollection%2Fxing-engineering&amp;operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;collection=New+Work+Development&amp;collectionId=35cb8c78d3cf&amp;source=post_page---post_publication_info--cc9b3e9d16a---------------------follow_profile------------------" rel="noopener follow">Follow</a></span></div></div></div></div><div class="ab ry rz sa iz iy"><div class="sb sc sd se sf sg sh si sj sk ab cp"><div class="h k"><a tabindex="0" href="https://medium.com/@marcus-noll?source=post_page---post_author_info--cc9b3e9d16a---------------------------------------" rel="noopener follow"><div class="l fj"><img alt="Marcus Noll" class="l fd by ic ib cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*XZBpoNJ-t9PV_LFeKILt8Q.png" width="48" height="48" loading="lazy"/><div class="fr by l ic ib fs n ay sm"></div></div></a></div><div class="j i d"><a tabindex="0" href="https://medium.com/@marcus-noll?source=post_page---post_author_info--cc9b3e9d16a---------------------------------------" rel="noopener follow"><div class="l fj"><img alt="Marcus Noll" class="l fd by sn so cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*XZBpoNJ-t9PV_LFeKILt8Q.png" width="64" height="64" loading="lazy"/><div class="fr by l sn so fs n ay sm"></div></div></a></div><div class="j i d sp ix"><div class="ab"><span><a class="bf b bg z sq re sr ss st su sv ev ew sw sx sy fa fb fc fd bm fe ff" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2Ff12092972d20&amp;operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;user=Marcus+Noll&amp;userId=f12092972d20&amp;source=post_page-f12092972d20--post_author_info--cc9b3e9d16a---------------------follow_profile------------------" rel="noopener follow">Follow</a></span></div></div></div><div class="ab co sz"><div class="ta tb tc td te l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" href="https://medium.com/@marcus-noll?source=post_page---post_author_info--cc9b3e9d16a---------------------------------------" rel="noopener follow"><h2 class="pw-author-name bf tg th ti tj tk tl tm nf ps pt nj pv pw nn py pz bk"><span class="gn tf">Written by <!-- -->Marcus Noll</span></h2></a><div class="rc ab ia"><div class="l ix"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar iq" href="https://medium.com/@marcus-noll/followers?source=post_page---post_author_info--cc9b3e9d16a---------------------------------------" rel="noopener follow">1 Follower</a></span></div><div class="bf b bg z du ab jb"><span class="ir l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar iq" href="https://medium.com/@marcus-noll/following?source=post_page---post_author_info--cc9b3e9d16a---------------------------------------" rel="noopener follow">2 Following</a></div></div><div class="tn l"><p class="bf b bg z bk"><span class="gn">Senior Software Engineer at NEW WORK SE; focused on topics related to testing and QA</span></p></div></div></div><div class="h k"><div class="ab"><span><a class="bf b bg z sq re sr ss st su sv ev ew sw sx sy fa fb fc fd bm fe ff" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2Ff12092972d20&amp;operation=register&amp;redirect=https%3A%2F%2Ftech.new-work.se%2Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a&amp;user=Marcus+Noll&amp;userId=f12092972d20&amp;source=post_page-f12092972d20--post_author_info--cc9b3e9d16a---------------------follow_profile------------------" rel="noopener follow">Follow</a></span></div></div></div></div></div></div></div><div class="to l"><div class="tp bh r rw"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab q cp"><h2 class="bf tg om oo op oq os ot ou ow ox oy pa pb pc pe pf bk">No responses yet</h2><div class="ab tq"><div><div class="bm" aria-hidden="false"><a class="tr ts" href="https://policy.medium.com/medium-rules-30e5502c4eb4?source=post_page---post_responses--cc9b3e9d16a---------------------------------------" rel="noopener follow" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 25 25"><path fill-rule="evenodd" d="M11.987 5.036a.754.754 0 0 1 .914-.01c.972.721 1.767 1.218 2.6 1.543.828.322 1.719.485 2.887.505a.755.755 0 0 1 .741.757c-.018 3.623-.43 6.256-1.449 8.21-1.034 1.984-2.662 3.209-4.966 4.083a.75.75 0 0 1-.537-.003c-2.243-.874-3.858-2.095-4.897-4.074-1.024-1.951-1.457-4.583-1.476-8.216a.755.755 0 0 1 .741-.757c1.195-.02 2.1-.182 2.923-.503.827-.322 1.6-.815 2.519-1.535m.468.903c-.897.69-1.717 1.21-2.623 1.564-.898.35-1.856.527-3.026.565.037 3.45.469 5.817 1.36 7.515.884 1.684 2.25 2.762 4.284 3.571 2.092-.81 3.465-1.89 4.344-3.575.886-1.698 1.299-4.065 1.334-7.512-1.149-.039-2.091-.217-2.99-.567-.906-.353-1.745-.873-2.683-1.561m-.009 9.155a2.672 2.672 0 1 0 0-5.344 2.672 2.672 0 0 0 0 5.344m0 1a3.672 3.672 0 1 0 0-7.344 3.672 3.672 0 0 0 0 7.344m-1.813-3.777.525-.526.916.917 1.623-1.625.526.526-2.149 2.152z" clip-rule="evenodd"></path></svg></a></div></div></div></div><div class="tt tu tv tw tx l"></div></div></div></div><div class="ty tz ua ub uc l bx"><div class="h k j"><div class="tp bh ud ue"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="uf ab kt ja"><div class="ug uh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://help.medium.com/hc/en-us?source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Help</p></a></div><div class="ug uh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.statuspage.io/?source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Status</p></a></div><div class="ug uh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.com/about?autoplay=1&amp;source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">About</p></a></div><div class="ug uh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.com/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Careers</p></a></div><div class="ug uh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="mailto:pressinquiries@medium.com" rel="noopener follow"><p class="bf b dv z du">Press</p></a></div><div class="ug uh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://blog.medium.com/?source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Blog</p></a></div><div class="ug uh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Privacy</p></a></div><div class="ug uh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Terms</p></a></div><div class="ug uh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://speechify.com/medium?source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Text to speech</p></a></div><div class="ug l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.com/business?source=post_page-----cc9b3e9d16a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Teams</p></a></div></div></div></div></div></div></div></div></div></div><script>window.__BUILD_ID__="main-20250218-205731-de7dfb1539"</script><script>window.__GRAPHQL_URI__ = "https://tech.new-work.se/_/graphql"</script><script>window.__PRELOADED_STATE__ = {"algolia":{"queries":{}},"cache":{"experimentGroupSet":true,"reason":"This request is not using the cache middleware worker","group":"disabled","tags":["group-edgeCachePosts","post-cc9b3e9d16a","user-f12092972d20","collection-35cb8c78d3cf"],"serverVariantState":"","middlewareEnabled":false,"cacheStatus":"DYNAMIC","shouldUseCache":false,"vary":[],"pubFeaturingPostPageLabelEnabled":false},"client":{"hydrated":false,"isUs":false,"isNativeMedium":false,"isSafariMobile":false,"isSafari":false,"isFirefox":false,"routingEntity":{"type":"COLLECTION","id":"35cb8c78d3cf","explicit":true},"viewerIsBot":false},"debug":{"requestId":"d9dfe395-f38f-4887-acad-f95af8c271d2","requestTag":"","hybridDevServices":[],"originalSpanCarrier":{"traceparent":"00-2fca51fa1b61bb7b040dea6b5c9c3195-689c84c646404889-01"}},"multiVote":{"clapsPerPost":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Ftech.new-work.se\u002Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a","host":"tech.new-work.se","hostname":"tech.new-work.se","referrer":"","hasSetReferrer":false,"susiModal":{"step":null,"operation":"register"},"postRead":false,"partnerProgram":{"selectedCountryCode":null},"queryString":"?source=collection_home---5------16-----------------------"},"config":{"nodeEnv":"production","version":"main-20250218-205731-de7dfb1539","target":"production","productName":"Medium","publicUrl":"https:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","recaptchaEnterpriseKeyId":"6Le-uGgpAAAAAPprRaokM8AKthQ9KNGdoxaGUvVp","datadog":{"applicationId":"6702d87d-a7e0-42fe-bbcb-95b469547ea0","clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","rumToken":"pubf9cc52896502b9413b68ba36fc0c7162","context":{"deployment":{"target":"production","tag":"main-20250218-205731-de7dfb1539","commit":"de7dfb1539a8aa3ebd71d4b126e524952d1301af"}},"datacenter":"us"},"googleAnalyticsCode":"G-7JY7T788PK","googlePay":{"apiVersion":"2","apiVersionMinor":"0","merchantId":"BCR2DN6TV7EMTGBM","merchantName":"Medium","instanceMerchantId":"13685562959212738550"},"applePay":{"version":3},"signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumMastodonDomainName":"me.dm","mediumOwnedAndOperatedCollectionIds":["8a9336e5bb4","b7e45b22fec3","193b68bd4fba","8d6b8a439e32","54c98c43354d","3f6ecf56618","d944778ce714","92d2092dc598","ae2a65f35510","1285ba81cada","544c7006046e","fc8964313712","40187e704f1c","88d9857e584e","7b6769f2748b","bcc38c8f6edf","cef6983b292","cb8577c9149e","444d13b52878","713d7dbc99b0","ef8e90590e66","191186aaafa0","55760f21cdc5","9dc80918cc93","bdc4052bbdba","8ccfed20cbb2"],"tierOneDomains":["medium.com","thebolditalic.com","arcdigital.media","towardsdatascience.com","uxdesign.cc","codeburst.io","psiloveyou.xyz","writingcooperative.com","entrepreneurshandbook.co","prototypr.io","betterhumans.coach.me","theascent.pub"],"topicsToFollow":["d61cf867d93f","8a146bc21b28","1eca0103fff3","4d562ee63426","aef1078a3ef5","e15e46793f8d","6158eb913466","55f1c20aba7a","3d18b94f6858","4861fee224fd","63c6f1f93ee","1d98b3a9a871","decb52b64abf","ae5d4995e225","830cded25262"],"topicToTagMappings":{"accessibility":"accessibility","addiction":"addiction","android-development":"android-development","art":"art","artificial-intelligence":"artificial-intelligence","astrology":"astrology","basic-income":"basic-income","beauty":"beauty","biotech":"biotech","blockchain":"blockchain","books":"books","business":"business","cannabis":"cannabis","cities":"cities","climate-change":"climate-change","comics":"comics","coronavirus":"coronavirus","creativity":"creativity","cryptocurrency":"cryptocurrency","culture":"culture","cybersecurity":"cybersecurity","data-science":"data-science","design":"design","digital-life":"digital-life","disability":"disability","economy":"economy","education":"education","equality":"equality","family":"family","feminism":"feminism","fiction":"fiction","film":"film","fitness":"fitness","food":"food","freelancing":"freelancing","future":"future","gadgets":"gadgets","gaming":"gaming","gun-control":"gun-control","health":"health","history":"history","humor":"humor","immigration":"immigration","ios-development":"ios-development","javascript":"javascript","justice":"justice","language":"language","leadership":"leadership","lgbtqia":"lgbtqia","lifestyle":"lifestyle","machine-learning":"machine-learning","makers":"makers","marketing":"marketing","math":"math","media":"media","mental-health":"mental-health","mindfulness":"mindfulness","money":"money","music":"music","neuroscience":"neuroscience","nonfiction":"nonfiction","outdoors":"outdoors","parenting":"parenting","pets":"pets","philosophy":"philosophy","photography":"photography","podcasts":"podcast","poetry":"poetry","politics":"politics","privacy":"privacy","product-management":"product-management","productivity":"productivity","programming":"programming","psychedelics":"psychedelics","psychology":"psychology","race":"race","relationships":"relationships","religion":"religion","remote-work":"remote-work","san-francisco":"san-francisco","science":"science","self":"self","self-driving-cars":"self-driving-cars","sexuality":"sexuality","social-media":"social-media","society":"society","software-engineering":"software-engineering","space":"space","spirituality":"spirituality","sports":"sports","startups":"startup","style":"style","technology":"technology","transportation":"transportation","travel":"travel","true-crime":"true-crime","tv":"tv","ux":"ux","venture-capital":"venture-capital","visual-design":"visual-design","work":"work","world":"world","writing":"writing"},"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"7*V1_7XP4snlmqrc_0Njontw.png","height":110,"width":500},"postLogo":{"imageId":"bd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7","height":810,"width":1440},"postPreviewImage":{"imageId":"1*hn4v1tCaJy7cWMyb0bpNpQ.png","height":386,"width":579}},"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*9ygdqoKprhwuTVKUM0DLPA@2x.png","width":980,"height":159}}},"3f6ecf56618":{"name":"Forge","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*uULpIlImcO5TDuBZ6lm7Lg@2x.png","width":596,"height":183}}},"ae2a65f35510":{"name":"GEN","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*haCUs0wF6TgOOvfoY-jEoQ@2x.png","width":383,"height":92}}},"444d13b52878":{"name":"OneZero","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png","width":540,"height":106}}}},"embeddedPostIds":{"coronavirus":"cd3010f9d81f"},"sharedCdcMessaging":{"COVID_APPLICABLE_TAG_SLUGS":[],"COVID_APPLICABLE_TOPIC_NAMES":[],"COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE":[],"COVID_MESSAGES":{"tierA":{"text":"For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":66,"end":73,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"tierB":{"text":"Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.","markups":[{"start":37,"end":45,"href":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety"},{"start":125,"end":132,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"paywall":{"text":"This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":56,"end":70,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":138,"end":145,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"unbound":{"text":"This article is free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":45,"end":59,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":127,"end":134,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]}},"COVID_BANNER_POST_ID_OVERRIDE_WHITELIST":["3b31a67bff4a"]},"sharedVoteMessaging":{"TAGS":["politics","election-2020","government","us-politics","election","2020-presidential-race","trump","donald-trump","democrats","republicans","congress","republican-party","democratic-party","biden","joe-biden","maga"],"TOPICS":["politics","election"],"MESSAGE":{"text":"Find out more about the U.S. election results here.","markups":[{"start":46,"end":50,"href":"https:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker"}]},"EXCLUDE_POSTS":["397ef29e3ca5"]},"embedPostRules":[],"recircOptions":{"v1":{"limit":3},"v2":{"limit":8}},"braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","braintree":{"enabled":true,"merchantId":"m56f8fqpf7ngnrd4","merchantAccountId":{"usd":"AMediumCorporation_instant","eur":"amediumcorporation_EUR","cad":"amediumcorporation_CAD"},"publicKey":"ds2nn34bg2z7j5gd","braintreeEnvironment":"production","dashboardUrl":"https:\u002F\u002Fwww.braintreegateway.com\u002Fmerchants","gracePeriodDurationInDays":14,"mediumMembershipPlanId":{"monthly":"ce105f8c57a3","monthlyV2":"e8a5e126-792b-4ee6-8fba-d574c1b02fc5","monthlyWithTrial":"d5ee3dbe3db8","monthlyPremium":"fa741a9b47a2","yearly":"a40ad4a43185","yearlyV2":"3815d7d6-b8ca-4224-9b8c-182f9047866e","yearlyStaff":"d74fb811198a","yearlyWithTrial":"b3bc7350e5c7","yearlyPremium":"e21bd2c12166","monthlyOneYearFree":"e6c0637a-2bad-4171-ab4f-3c268633d83c","monthly25PercentOffFirstYear":"235ecc62-0cdb-49ae-9378-726cd21c504b","monthly20PercentOffFirstYear":"ba518864-9c13-4a99-91ca-411bf0cac756","monthly15PercentOffFirstYear":"594c029b-9f89-43d5-88f8-8173af4e070e","monthly10PercentOffFirstYear":"c6c7bc9a-40f2-4b51-8126-e28511d5bdb0","monthlyForStudents":"629ebe51-da7d-41fd-8293-34cd2f2030a8","yearlyOneYearFree":"78ba7be9-0d9f-4ece-aa3e-b54b826f2bf1","yearly25PercentOffFirstYear":"2dbb010d-bb8f-4eeb-ad5c-a08509f42d34","yearly20PercentOffFirstYear":"47565488-435b-47f8-bf93-40d5fbe0ebc8","yearly15PercentOffFirstYear":"8259809b-0881-47d9-acf7-6c001c7f720f","yearly10PercentOffFirstYear":"9dd694fb-96e1-472c-8d9e-3c868d5c1506","yearlyForStudents":"e29345ef-ab1c-4234-95c5-70e50fe6bc23","monthlyCad":"p52orjkaceei","yearlyCad":"h4q9g2up9ktt"},"braintreeDiscountId":{"oneMonthFree":"MONTHS_FREE_01","threeMonthsFree":"MONTHS_FREE_03","sixMonthsFree":"MONTHS_FREE_06","fiftyPercentOffOneYear":"FIFTY_PERCENT_OFF_ONE_YEAR"},"3DSecureVersion":"2","defaultCurrency":"usd","providerPlanIdCurrency":{"4ycw":"usd","rz3b":"usd","3kqm":"usd","jzw6":"usd","c2q2":"usd","nnsw":"usd","q8qw":"usd","d9y6":"usd","fx7w":"cad","nwf2":"cad"}},"paypalClientId":"AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v","paypal":{"host":"https:\u002F\u002Fapi.paypal.com:443","clientMode":"production","serverMode":"live","webhookId":"4G466076A0294510S","monthlyPlan":{"planId":"P-9WR0658853113943TMU5FDQA","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlan":{"planId":"P-7N8963881P8875835MU5JOPQ","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oneYearGift":{"name":"Medium Membership (1 Year, Digital Gift Code)","description":"Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com\u002Fredeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"},"oldMonthlyPlan":{"planId":"P-96U02458LM656772MJZUVH2Y","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlan":{"planId":"P-59P80963JF186412JJZU3SMI","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"monthlyPlanWithTrial":{"planId":"P-66C21969LR178604GJPVKUKY","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlanWithTrial":{"planId":"P-6XW32684EX226940VKCT2MFA","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oldMonthlyPlanNoSetupFee":{"planId":"P-4N046520HR188054PCJC7LJI","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlanNoSetupFee":{"planId":"P-7A4913502Y5181304CJEJMXQ","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"sdkUrl":"https:\u002F\u002Fwww.paypal.com\u002Fsdk\u002Fjs"},"stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","log":{"json":true,"level":"info"},"imageUploadMaxSizeMb":25,"staffPicks":{"title":"Staff Picks","catalogId":"c7bc6e1ee00f"}},"session":{"xsrf":""}}</script><script>window.__APOLLO_STATE__ = {"ROOT_QUERY":{"__typename":"Query","viewer":null,"variantFlags":[{"__typename":"VariantFlag","name":"enable_moc_load_processor_all_recs_surfaces","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ml_rank_rex_anno","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tag_recs","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_creator_welcome_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_plans_page_payment_form","valueType":{"__typename":"VariantFlagString","value":"group_1"}},{"__typename":"VariantFlag","name":"enable_post_bottom_responses_input","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tick_landing_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"get_highlights_from_engagement","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"onboarding_tags_from_top_views","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_cache_less_following_feed","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"redefined_top_posts","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_recirc_model","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_apple_webhook","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ios_dynamic_paywall_aspiriational","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_social_share_sheet","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_sprig","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_mastodon_for_members_username_selection","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"allow_signup","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_cancellation_discount_v1_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_update_explore_wtf","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_enable_friend_links_postpage_banners","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"rex_enable_presentation_filtering_v2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"allow_test_auth","valueType":{"__typename":"VariantFlagString","value":"disallow"}},{"__typename":"VariantFlag","name":"enable_maim_the_meter","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"allow_access","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_post_publish_permission_check","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"can_receive_tips_v0","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_deprecate_legacy_providers_v3","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_marketing_emails","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_pub_featuring_stats","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_home_post_menu","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_remove_twitter_onboarding_step","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_rating_prompt_stories_read_threshold","valueType":{"__typename":"VariantFlagNumber","value":2}},{"__typename":"VariantFlag","name":"enable_eventstats_event_processing","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_footer_app_buttons","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ios_easy_resubscribe","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lo_homepage","valueType":{"__typename":"VariantFlagString","value":"control"}},{"__typename":"VariantFlag","name":"android_enable_topic_portals","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"reengagement_notification_duration","valueType":{"__typename":"VariantFlagNumber","value":3}},{"__typename":"VariantFlag","name":"enable_lite_server_upstream_deadlines","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_susi_redesign_android","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tribute_landing_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"signin_services","valueType":{"__typename":"VariantFlagString","value":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple"}},{"__typename":"VariantFlag","name":"enable_android_dynamic_programming_paywall","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_rito_upstream_deadlines","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_branch_io","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_new_manage_membership_flow","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"coronavirus_topic_recirc","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_hybrid_ranking_model","valueType":{"__typename":"VariantFlagString","value":"experiment"}},{"__typename":"VariantFlag","name":"limit_post_referrers","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_android_dynamic_aspirational_paywall","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_boost_nia_v01","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_integration","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_recommended_publishers_query","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_bg_post_post","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_android_offline_reading","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_response_markup","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"available_monthly_plan","valueType":{"__typename":"VariantFlagString","value":"60e220181034"}},{"__typename":"VariantFlag","name":"enable_apple_sign_in","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_recaptcha_enterprise","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_switch_plan_premium_tier","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_google_one_tap","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_sharer_validate_post_share_key","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_medium2_kbfd","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_members_only_audio","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_pp_v4","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_sharer_create_post_share_key","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_group_gifting","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_apple_pay","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_in_app_free_trial","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_auto_follow_on_subscribe","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_pub_featuring","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"reader_fair_distribution_non_qp","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_abandoned_paywall_promotion_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_cleansweep_shadow_cache","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_trial_membership","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"disable_partner_program_enrollment","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_moc_load_processor_first_story","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"mobile_custom_app_icon","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_rex_aggregator_v2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_abandoned_cart_promotion_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_client","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_conversion_model_v2","valueType":{"__typename":"VariantFlagString","value":"group_2"}},{"__typename":"VariantFlag","name":"enable_pp_country_expansion","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_premium_tier","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_updated_pub_recs_ui","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_friend_links_postpage_banners","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_abandoned_paywall_email_experiment","valueType":{"__typename":"VariantFlagString","value":"experiment"}},{"__typename":"VariantFlag","name":"enable_configure_pronouns","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_medium_com_canonical_urls","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_rex_new_push_notification_endpoint","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_speechify_ios","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_continue_this_thread","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_new_stripe_customers","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"goliath_externalsearch_enable_comment_deindexation","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"available_annual_premium_plan","valueType":{"__typename":"VariantFlagString","value":"4a442ace1476"}},{"__typename":"VariantFlag","name":"enable_pill_based_home_feed","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_enable_friend_links_creation","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_enable_syntax_highlight","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_android_verified_author","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_entities_to_follow_v2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_intrinsic_automatic_actions","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_enable_editor_new_publishing_flow","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_friend_links_creation","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_webhook","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ios_dynamic_paywall_programming","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_custom_moc_preview_for_google_referrer","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_google_webhook","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_pub_featuring_post_page_label","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_rex_reading_history","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tipping_v0_ios","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_paypal","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_newsletter_lo_flow_custom_domains","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_display_paywall_after_onboarding","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_author_cards_byline","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_mastodon_for_members","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"signup_services","valueType":{"__typename":"VariantFlagString","value":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple"}},{"__typename":"VariantFlag","name":"enable_boost_experiment","valueType":{"__typename":"VariantFlagString","value":"control"}},{"__typename":"VariantFlag","name":"enable_moc_load_processor_c","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_post_bottom_responses","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_speechify_widget","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_susi_redesign_ios","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"textshots_userid","valueType":{"__typename":"VariantFlagString","value":""}},{"__typename":"VariantFlag","name":"enable_diversification_rex","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_iceland_forced_android","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_seamless_social_sharing","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tipping_v0_android","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_conversion_ranker_v2","valueType":{"__typename":"VariantFlagString","value":"control"}},{"__typename":"VariantFlag","name":"can_send_tips_v0","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_simplified_digest_v2_b","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"rex_generator_max_candidates","valueType":{"__typename":"VariantFlagNumber","value":1000}},{"__typename":"VariantFlag","name":"android_enable_lists_v2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_lock_responses","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_iceland_nux","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"browsable_stream_config_bucket","valueType":{"__typename":"VariantFlagString","value":"curated-topics"}},{"__typename":"VariantFlag","name":"enable_see_pronouns","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_import","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ios_autorefresh","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_post_bottom_responses_native","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_pre_pp_v4","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ios_offline_reading","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"num_post_bottom_responses_to_show","valueType":{"__typename":"VariantFlagNumber","value":3}},{"__typename":"VariantFlag","name":"enable_android_miro_v2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_aurora_pub_follower_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_automod","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_google_pay","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"limit_user_follows","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"available_monthly_premium_plan","valueType":{"__typename":"VariantFlagString","value":"12a660186432"}},{"__typename":"VariantFlag","name":"enable_plans_page_branding_v2","valueType":{"__typename":"VariantFlagString","value":"control"}},{"__typename":"VariantFlag","name":"enable_update_topic_portals_wtf","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_author_cards","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_cancellation_discount_v1_1","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_engagement_service_publish_response","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"skip_fs_cache_user_vals","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"price_smoke_test_monthly","valueType":{"__typename":"VariantFlagString","value":""}},{"__typename":"VariantFlag","name":"android_enable_image_sharer","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_winback_promotion_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_trust_service_recaptcha","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_verified_book_author","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"available_annual_plan","valueType":{"__typename":"VariantFlagString","value":"2c754bcc2995"}},{"__typename":"VariantFlag","name":"enable_lite_archive_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"price_smoke_test_yearly","valueType":{"__typename":"VariantFlagString","value":""}},{"__typename":"VariantFlag","name":"android_two_hour_refresh","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ranker_v10","valueType":{"__typename":"VariantFlagString","value":"control"}},{"__typename":"VariantFlag","name":"glyph_font_set","valueType":{"__typename":"VariantFlagString","value":"m2-unbound-source-serif-pro"}},{"__typename":"VariantFlag","name":"enable_app_flirty_thirty","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_deviant_get_variant_flag_from_medium2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_mastodon_avatar_upload","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_starspace","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"disable_rex_pub_featuring_recirc","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_premium_tier_badge","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_homepage","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_legacy_feed_in_iceland","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_verifications_service","valueType":{"__typename":"VariantFlagBoolean","value":true}}],"collectionByDomainOrSlug({\"domainOrSlug\":\"tech.new-work.se\"})":{"__ref":"Collection:35cb8c78d3cf"},"postResult({\"id\":\"cc9b3e9d16a\"})":{"__ref":"Post:cc9b3e9d16a"}},"ImageMetadata:":{"__typename":"ImageMetadata","id":"","originalWidth":0,"originalHeight":0},"Collection:35cb8c78d3cf":{"__typename":"Collection","id":"35cb8c78d3cf","favicon":{"__ref":"ImageMetadata:"},"customStyleSheet":null,"colorPalette":{"__typename":"ColorPalette","highlightSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FFFFFFFF","point":0},{"__typename":"ColorPoint","color":"#FFE8F3E8","point":0.1},{"__typename":"ColorPoint","color":"#FFE8F3E8","point":0.2},{"__typename":"ColorPoint","color":"#FFD1E7D1","point":0.6},{"__typename":"ColorPoint","color":"#FFA3D0A2","point":1}]},"defaultBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FF1A8917","point":0},{"__typename":"ColorPoint","color":"#FF11800E","point":0.1},{"__typename":"ColorPoint","color":"#FF0F730C","point":0.2},{"__typename":"ColorPoint","color":"#FF095407","point":1}]},"tintBackgroundSpectrum":null},"domain":"tech.new-work.se","slug":"xing-engineering","googleAnalyticsId":null,"name":"New Work Development","avatar":{"__ref":"ImageMetadata:1*B1MD9EGz7rhVkx3WE3Rkog.png"},"description":"Stories about building a better working world","subscriberCount":1029,"latestPostsConnection({\"paging\":{\"limit\":1}})":{"__typename":"PostConnection","posts":[{"__ref":"Post:fac4a8b0ae15"}]},"isAuroraVisible":false,"tintColor":null,"newsletterV3":null,"viewerEdge":{"__ref":"CollectionViewerEdge:collectionId:35cb8c78d3cf-viewerId:lo_5c312e933cdf"},"twitterUsername":"xingdevs","facebookPageId":null,"logo":{"__ref":"ImageMetadata:"}},"ImageMetadata:1*B1MD9EGz7rhVkx3WE3Rkog.png":{"__typename":"ImageMetadata","id":"1*B1MD9EGz7rhVkx3WE3Rkog.png"},"User:6ca9d8d9fad3":{"__typename":"User","id":"6ca9d8d9fad3","customDomainState":null,"hasSubdomain":false,"username":"gabrielpedepera"},"Post:fac4a8b0ae15":{"__typename":"Post","id":"fac4a8b0ae15","firstPublishedAt":1701045261726,"creator":{"__ref":"User:6ca9d8d9fad3"},"collection":{"__ref":"Collection:35cb8c78d3cf"},"isSeries":false,"mediumUrl":"https:\u002F\u002Ftech.new-work.se\u002Fprotecting-sensitive-data-in-elixir-genservers-fac4a8b0ae15","sequence":null,"uniqueSlug":"protecting-sensitive-data-in-elixir-genservers-fac4a8b0ae15"},"LinkedAccounts:f12092972d20":{"__typename":"LinkedAccounts","mastodon":null,"id":"f12092972d20"},"User:f12092972d20":{"__typename":"User","id":"f12092972d20","linkedAccounts":{"__ref":"LinkedAccounts:f12092972d20"},"isSuspended":false,"name":"Marcus Noll","imageId":"1*XZBpoNJ-t9PV_LFeKILt8Q.png","customDomainState":null,"hasSubdomain":false,"username":"marcus-noll","verifications":{"__typename":"VerifiedInfo","isBookAuthor":false},"socialStats":{"__typename":"SocialStats","followerCount":1,"followingCount":2,"collectionFollowingCount":0},"bio":"Senior Software Engineer at NEW WORK SE; focused on topics related to testing and QA","membership":null,"allowNotes":true,"viewerEdge":{"__ref":"UserViewerEdge:userId:f12092972d20-viewerId:lo_5c312e933cdf"},"twitterScreenName":""},"Paragraph:60f9299035bc_0":{"__typename":"Paragraph","id":"60f9299035bc_0","name":"f6ee","type":"H3","href":null,"layout":null,"metadata":null,"text":"Decision guide for browser test tooling","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_1":{"__typename":"Paragraph","id":"60f9299035bc_1","name":"6029","type":"P","href":null,"layout":null,"metadata":null,"text":"At NEW WORK SE, every team is free to decide on the browser test automation tooling for their project. However, information from tooling vendors and other parties (e.g. blog posts) is often not detailed enough and also misleading. To fill the gaps, I decided to compile the knowledge that I gathered during daily business and Hackweek research.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":326,"end":334,"href":"https:\u002F\u002Fmedium.com\u002Fxing-hackweek","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_2":{"__typename":"Paragraph","id":"60f9299035bc_2","name":"3380","type":"P","href":null,"layout":null,"metadata":null,"text":"This document is for you if you have to decide upon which tooling to use for running automated browser tests in your project. But this is not your usual browser test tooling shootout, discussing which tool provides the best API or the coolest new feature. No, this guide is different. Next to the tools, it also discusses idiosyncrasies of browsers, the validity of the tools’ test results and, last but not least, the requirements of your project.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_3":{"__typename":"Paragraph","id":"60f9299035bc_3","name":"2717","type":"P","href":null,"layout":null,"metadata":null,"text":"These are the three main sections of the document:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_4":{"__typename":"Paragraph","id":"60f9299035bc_4","name":"16b3","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Browsers, which discusses basics, compatibility and common gotchas related to testing","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":8,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_5":{"__typename":"Paragraph","id":"60f9299035bc_5","name":"bc06","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Browser test tools, which provides an overview and discusses important differences and takeaways in more depth","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":18,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_6":{"__typename":"Paragraph","id":"60f9299035bc_6","name":"ee17","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Your project’s characteristics, giving some hints on which project characteristics may have an influence on your browser test tool decision","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":30,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_7":{"__typename":"Paragraph","id":"60f9299035bc_7","name":"2a59","type":"P","href":null,"layout":null,"metadata":null,"text":"In case you do not want to read through everything in all detail, just skip to the conclusion at the end of the document.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_8":{"__typename":"Paragraph","id":"60f9299035bc_8","name":"48b7","type":"H3","href":null,"layout":null,"metadata":null,"text":"Browsers","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_9":{"__typename":"Paragraph","id":"60f9299035bc_9","name":"f689","type":"P","href":null,"layout":null,"metadata":null,"text":"First, we need to talk about browsers. Because a) that is what your customers are using to interact with your web application. And b) it is browsers that you aim to automate your tests in.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_10":{"__typename":"Paragraph","id":"60f9299035bc_10","name":"8699","type":"H4","href":null,"layout":null,"metadata":null,"text":"The basics","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":10,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_11":{"__typename":"Paragraph","id":"60f9299035bc_11","name":"187f","type":"P","href":null,"layout":null,"metadata":null,"text":"At time of writing, the following browsers are the most well-known: Chrome, Edge, Firefox, Safari. There are also a lot of others, like Opera, Brave, Samsung Internet, or UC Browser.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_12":{"__typename":"Paragraph","id":"60f9299035bc_12","name":"a3b2","type":"P","href":null,"layout":null,"metadata":null,"text":"One can say that the majority of websites gets rendered by one of these three rendering engines:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_13":{"__typename":"Paragraph","id":"60f9299035bc_13","name":"7633","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Blink, which powers Chrome, Edge, Samsung Internet Browser, Opera and others","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":5,"href":"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBlink_(browser_engine","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_14":{"__typename":"Paragraph","id":"60f9299035bc_14","name":"2b76","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Gecko, which powers Firefox","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":5,"href":"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGecko_(software)","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_15":{"__typename":"Paragraph","id":"60f9299035bc_15","name":"2916","type":"ULI","href":null,"layout":null,"metadata":null,"text":"WebKit, which powers Safari (macOS\u002FiOS) and any browser running on iOS devices","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":6,"href":"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebKit","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_16":{"__typename":"Paragraph","id":"60f9299035bc_16","name":"3604","type":"H4","href":null,"layout":null,"metadata":null,"text":"Browser compatibility and interoperability","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":42,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_17":{"__typename":"Paragraph","id":"60f9299035bc_17","name":"2b16","type":"P","href":null,"layout":null,"metadata":null,"text":"Each browser should follow web standards. Some browsers adhere well to those standards, some not so well.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":27,"end":40,"href":"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FLearn\u002FGetting_started_with_the_web\u002FThe_web_and_web_standards#web_standards","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_18":{"__typename":"Paragraph","id":"60f9299035bc_18","name":"d829","type":"P","href":null,"layout":null,"metadata":null,"text":"For Chrome, Edge, Firefox and Safari, the Web Platform Tests project provides empirical evidence of how well they do. But there is also a lot of (albeit anecdotal, still large scale) evidence out there.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":42,"end":68,"href":"https:\u002F\u002Fweb-platform-tests.org\u002Findex.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":78,"end":116,"href":"https:\u002F\u002Fwpt.fyi\u002Fresults","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":78,"end":87,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":153,"end":162,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_19":{"__typename":"Paragraph","id":"60f9299035bc_19","name":"ebee","type":"P","href":null,"layout":null,"metadata":null,"text":"Examples:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":9,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_20":{"__typename":"Paragraph","id":"60f9299035bc_20","name":"b375","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Browser bugs filed by the React Spectrum team at Adobe (as of September 2022, “almost 60% are WebKit. ~25% Chrome, ~16% Firefox”)","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":18,"href":"https:\u002F\u002Fgithub.com\u002Fadobe\u002Freact-spectrum\u002Fwiki\u002FTracker-for-External-Browser-Bugs,-Library-Bugs,-and-Features","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":26,"end":40,"href":"https:\u002F\u002Freact-spectrum.adobe.com","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":78,"end":128,"href":"https:\u002F\u002Ftwitter.com\u002Fdevongovett\u002Fstatus\u002F1565764062054494208","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_21":{"__typename":"Paragraph","id":"60f9299035bc_21","name":"ffc7","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Browser vendors themselves acknowledge the problem and decided to act upon it in the Interop 2022 initiative","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":85,"end":108,"href":"https:\u002F\u002Fweb.dev\u002Finterop-2022","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_22":{"__typename":"Paragraph","id":"60f9299035bc_22","name":"b1b1","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Developer quotes from the MDN Browser Compatibility Report 2020","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":16,"href":"https:\u002F\u002Finsights.developer.mozilla.org\u002Freports\u002Fmdn-browser-compatibility-report-2020.html#findings-browsers","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_23":{"__typename":"Paragraph","id":"60f9299035bc_23","name":"0e6c","type":"H4","href":null,"layout":null,"metadata":null,"text":"Common gotchas related to testing","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":33,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_24":{"__typename":"Paragraph","id":"60f9299035bc_24","name":"89cd","type":"P","href":null,"layout":null,"metadata":null,"text":"Diverging behavior between browsers is (sadly) pretty normal. But apart from diverging behavior between browser A and browser B, there may even be differences between browsers of the same name (e.g. Safari macOS and Safari iOS) or even between browsers that are using the exact same build (e.g. headless and headed instances). Some of these differences are well-known, some of them not.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_25":{"__typename":"Paragraph","id":"60f9299035bc_25","name":"6c88","type":"P","href":null,"layout":null,"metadata":null,"text":"Safari macOS ain’t Safari iOS","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":29,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_26":{"__typename":"Paragraph","id":"60f9299035bc_26","name":"3d1c","type":"P","href":null,"layout":null,"metadata":null,"text":"Even when the Safari version is identical on macOS and iOS, you may encounter differences between both. One possible reason for this is that the WebKit version used in Safari is not guaranteed to be the same across iOS and macOS (see Safari version history on Wikipedia).","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":234,"end":269,"href":"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSafari_version_history","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_27":{"__typename":"Paragraph","id":"60f9299035bc_27","name":"1743","type":"P","href":null,"layout":null,"metadata":null,"text":"There could be other reasons that are hard to pinpoint, probably due to macOS\u002FiOS specifics. Whatever the reason, developers experience these differences in the wild. The MDN Browser Compatibility Report 2020 contains a number of developer quotes revolving around the topic¹.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":171,"end":208,"href":"https:\u002F\u002Finsights.developer.mozilla.org\u002Freports\u002Fmdn-browser-compatibility-report-2020.html#findings-browsers","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_28":{"__typename":"Paragraph","id":"60f9299035bc_28","name":"0ea1","type":"P","href":null,"layout":null,"metadata":null,"text":"Chrome iOS ain’t Chrome","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":23,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_29":{"__typename":"Paragraph","id":"60f9299035bc_29","name":"0159","type":"P","href":null,"layout":null,"metadata":null,"text":"Any web browser app running on iOS (be it Chrome iOS, Firefox iOS, Edge iOS or else) has to use the WebKit rendering engine. This is because Apple mandates it. Apple’s App Store Review Guidelines as of September 2022:","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":160,"end":195,"href":"https:\u002F\u002Fdeveloper.apple.com\u002Fapp-store\u002Freview\u002Fguidelines\u002F#software-requirements","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_30":{"__typename":"Paragraph","id":"60f9299035bc_30","name":"4802","type":"BQ","href":null,"layout":null,"metadata":null,"text":"“Apps that browse the web must use the appropriate WebKit framework and WebKit Javascript.”","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_31":{"__typename":"Paragraph","id":"60f9299035bc_31","name":"9d5c","type":"P","href":null,"layout":null,"metadata":null,"text":"But even when the same rendering engine is used, we have seen differences in browser behavior. For example, the browser chrome (the UI elements of the browser, e.g. the address field, bookmark buttons) can behave differently, i.e. collapse\u002Fexpand in different ways or take up more space on the screen, reducing the viewport size.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_32":{"__typename":"Paragraph","id":"60f9299035bc_32","name":"9763","type":"P","href":null,"layout":null,"metadata":null,"text":"WebKit ain’t Safari","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":19,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_33":{"__typename":"Paragraph","id":"60f9299035bc_33","name":"fc7e","type":"P","href":null,"layout":null,"metadata":null,"text":"It is not safe to say that a WebKit build behaves the same as the Safari binary shipped with iOS or macOS. Here is an anecdotal example of some test passing in a WebKit build, but failing in Safari. However, this example does not provide enough information in order to make a clear statement: It neither mentions the WebKit version nor the Safari version and there are no statements by WebKit or Apple engineers. Maybe there are no differences if you compare a WebKit build’s behavior with Safari that uses the exact same WebKit version.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":107,"end":197,"href":"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F67046548\u002Fa-link-that-receives-pointer-events-after-animating-isnt-clickable-in-safari","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_34":{"__typename":"Paragraph","id":"60f9299035bc_34","name":"3ab4","type":"P","href":null,"layout":null,"metadata":null,"text":"What is safe to say, though, is that you could get different results if the versions of your WebKit build and the WebKit version in your customer’s Safari browser do not match. Imagine for example you are testing your application in the latest WebKit build that contains a new feature. Your customer’s Safari browser may not use the latest WebKit version, so it lacks that new WebKit feature. In this scenario, your test passes in WebKit, but fails in Safari used by your customer.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":19,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":41,"end":46,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_35":{"__typename":"Paragraph","id":"60f9299035bc_35","name":"3adc","type":"P","href":null,"layout":null,"metadata":null,"text":"This of course applies to other constellations of “open-source builds vs. commercial builds” as well, e.g. Chromium vs. Chrome, or even constellations of nightly vs. stable channels (mentioned further down below).","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_36":{"__typename":"Paragraph","id":"60f9299035bc_36","name":"c639","type":"P","href":null,"layout":null,"metadata":null,"text":"Headless ain’t headed","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":21,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_37":{"__typename":"Paragraph","id":"60f9299035bc_37","name":"2f7a","type":"P","href":null,"layout":null,"metadata":null,"text":"Headless browsers show different behavior in certain areas when compared to a headed instance. We are aware of the following examples:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_38":{"__typename":"Paragraph","id":"60f9299035bc_38","name":"ce6f","type":"ULI","href":null,"layout":null,"metadata":null,"text":"‘Accept-Language’ header not set as expected","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":44,"href":"https:\u002F\u002Fmarcusnoll.de\u002FBrowser+automation\u002FBrowser-specific+gotchas#Accept-Language+header+not+set+as+expected","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_39":{"__typename":"Paragraph","id":"60f9299035bc_39","name":"cbfc","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Viewport height is greater in headless mode","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":43,"href":"https:\u002F\u002Fmarcusnoll.de\u002FBrowser+automation\u002FBrowser-specific+gotchas#Viewport+height+is+greater+in+headless+mode","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_40":{"__typename":"Paragraph","id":"60f9299035bc_40","name":"8401","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Intersection observer may behave differently in headless browsers","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_41":{"__typename":"Paragraph","id":"60f9299035bc_41","name":"dd8b","type":"ULI","href":null,"layout":null,"metadata":null,"text":"In Chrome, not all code paths may be executed when running the browser in headless mode (“headless is a different browser”)","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":89,"end":122,"href":"https:\u002F\u002Fgroups.google.com\u002Fg\u002Fchromedriver-users\u002Fc\u002FXclDou5fS6s\u002Fm\u002FWMRM2S7WBAAJ","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_42":{"__typename":"Paragraph","id":"60f9299035bc_42","name":"e917","type":"P","href":null,"layout":null,"metadata":null,"text":"Nightly\u002Fbeta channel ain’t stable channel","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":41,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_43":{"__typename":"Paragraph","id":"60f9299035bc_43","name":"c5cc","type":"P","href":null,"layout":null,"metadata":null,"text":"This should be obvious. A pre-release channel may contain bugs, but it is also probable that a feature shipped in a pre-release channel is not available in the stable release channel yet. In other words: If you run your tests in a pre-release channel and see them pass, it could be that the same tests fail when run in the stable channel, or vice versa.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_44":{"__typename":"Paragraph","id":"60f9299035bc_44","name":"de8b","type":"P","href":null,"layout":null,"metadata":null,"text":"Mobile browser emulation ain’t an actual mobile browser","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":55,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_45":{"__typename":"Paragraph","id":"60f9299035bc_45","name":"995a","type":"P","href":null,"layout":null,"metadata":null,"text":"Similar to the previous section, this should be obvious as well. Sadly, browser test tool vendors’ marketing is often misleading and we observed people falling for it.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_46":{"__typename":"Paragraph","id":"60f9299035bc_46","name":"03a5","type":"P","href":null,"layout":null,"metadata":null,"text":"To make it clear: If you emulate an iPhone e.g. in your Chrome’s Devtools running on a desktop device, this only sets certain parameters (such as device pixel ratio, viewport size, touch events and more). This setup cannot magically reproduce a proper Safari browser on a proper iPhone. Because after all, the iPhone browser is emulated in a Chrome browser powered by the Blink engine and not by WebKit.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_47":{"__typename":"Paragraph","id":"60f9299035bc_47","name":"d8fa","type":"H3","href":null,"layout":null,"metadata":null,"text":"Browser test tools","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_48":{"__typename":"Paragraph","id":"60f9299035bc_48","name":"3cf1","type":"P","href":null,"layout":null,"metadata":null,"text":"Every browser test tool has its purpose, its own strengths and deficits. Thus, comparing them is hard and in some aspects unfair. But for the sake of an overview, we provide comparison tables, clustered in separate sections to make the information digestible. After that, we discuss notable differences in more detail.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_49":{"__typename":"Paragraph","id":"60f9299035bc_49","name":"adca","type":"H4","href":null,"layout":null,"metadata":null,"text":"Browser test tool overview","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_50":{"__typename":"Paragraph","id":"60f9299035bc_50","name":"0a49","type":"P","href":null,"layout":null,"metadata":null,"text":"All information is split as follows:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_51":{"__typename":"Paragraph","id":"60f9299035bc_51","name":"3bc6","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Basic information: Purpose, licence, year of release, architecture and more","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":18,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_52":{"__typename":"Paragraph","id":"60f9299035bc_52","name":"9459","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Browser support: Which (mobile) browsers the tool supports","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":16,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_53":{"__typename":"Paragraph","id":"60f9299035bc_53","name":"03c4","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Validity of test results: How close the test results are to real life conditions","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":25,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_54":{"__typename":"Paragraph","id":"60f9299035bc_54","name":"f1b8","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Feature set: Every tool we discuss in this document is able to do what you can expect from a browser automation tool: Navigate to URLs, find elements, click, type, drag\u002Fdrop, read\u002Fcreate cookies, wait for conditions, start headless browsers, create screenshots, run tests\u002Fbrowsers in parallel etc. This section lists features that are not supported equally well across tools.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":12,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_55":{"__typename":"Paragraph","id":"60f9299035bc_55","name":"5b71","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Developer experience: How easy it is to set up, to write and debug tests, how good the documentation is, etc.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":21,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_56":{"__typename":"Paragraph","id":"60f9299035bc_56","name":"f014","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Key strengths and limitations: What the tools are exceptionally good or bad at","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":30,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_57":{"__typename":"Paragraph","id":"60f9299035bc_57","name":"c8f8","type":"P","href":null,"layout":null,"metadata":null,"text":"One word about WebDriver: The comparison tables do not list specific WebDriver-based tools. This is because the overview would become too loaded.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_58":{"__typename":"Paragraph","id":"60f9299035bc_58","name":"454d","type":"P","href":null,"layout":null,"metadata":null,"text":"Basic information","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":17,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*Jwac8jId7lcZ0pkftBxsVg.png":{"__typename":"ImageMetadata","id":"1*Jwac8jId7lcZ0pkftBxsVg.png","originalHeight":1206,"originalWidth":1892,"focusPercentX":null,"focusPercentY":null,"alt":"A table showing basic information for each tool. A markdown version of the table is available at https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002F7ce00ac06b933d12521a0281b005551c"},"Paragraph:60f9299035bc_59":{"__typename":"Paragraph","id":"60f9299035bc_59","name":"53a7","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*Jwac8jId7lcZ0pkftBxsVg.png"},"text":"Click here for a markdown version of the table","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":6,"end":10,"href":"https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002F7ce00ac06b933d12521a0281b005551c","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_60":{"__typename":"Paragraph","id":"60f9299035bc_60","name":"cdb7","type":"P","href":null,"layout":null,"metadata":null,"text":"Browser support","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":15,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*YhG2fAxGS9WUbatOnhONVQ.png":{"__typename":"ImageMetadata","id":"1*YhG2fAxGS9WUbatOnhONVQ.png","originalHeight":852,"originalWidth":1888,"focusPercentX":null,"focusPercentY":null,"alt":"A table comparing browser support of each tool. A markdown version of the table is available at https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002F5a59f7293cf6372339fcb0f5b5536e6d"},"Paragraph:60f9299035bc_61":{"__typename":"Paragraph","id":"60f9299035bc_61","name":"e2b7","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*YhG2fAxGS9WUbatOnhONVQ.png"},"text":"Click here for a markdown version of the table","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":6,"end":10,"href":"https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002F5a59f7293cf6372339fcb0f5b5536e6d","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_62":{"__typename":"Paragraph","id":"60f9299035bc_62","name":"84bb","type":"P","href":null,"layout":null,"metadata":null,"text":"Validity of test results","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":24,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*6iZ4j3hB2uCALHWqE9QTWg.png":{"__typename":"ImageMetadata","id":"1*6iZ4j3hB2uCALHWqE9QTWg.png","originalHeight":278,"originalWidth":1892,"focusPercentX":null,"focusPercentY":null,"alt":"A table comparing the tools in terms of validity of test results. A markdown version of the table is available at https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002F41fd47cd373db31e58a1c81dd3249ab6"},"Paragraph:60f9299035bc_63":{"__typename":"Paragraph","id":"60f9299035bc_63","name":"9072","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*6iZ4j3hB2uCALHWqE9QTWg.png"},"text":"Click here for a markdown version of the table","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":6,"end":10,"href":"https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002F41fd47cd373db31e58a1c81dd3249ab6","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_64":{"__typename":"Paragraph","id":"60f9299035bc_64","name":"a543","type":"P","href":null,"layout":null,"metadata":null,"text":"Feature set","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":11,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*F3QunvGxLDxVyLbdvlyMZQ.png":{"__typename":"ImageMetadata","id":"1*F3QunvGxLDxVyLbdvlyMZQ.png","originalHeight":1036,"originalWidth":1888,"focusPercentX":null,"focusPercentY":null,"alt":"A table comparing the the tools in terms of feature set. A markdown version of the table is available at https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002Fe7a90eb953b80f9669ef5f06c7eb87c6"},"Paragraph:60f9299035bc_65":{"__typename":"Paragraph","id":"60f9299035bc_65","name":"73e0","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*F3QunvGxLDxVyLbdvlyMZQ.png"},"text":"Click here for a markdown version of the table","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":6,"end":10,"href":"https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002Fe7a90eb953b80f9669ef5f06c7eb87c6","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_66":{"__typename":"Paragraph","id":"60f9299035bc_66","name":"c843","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Automatic wait on elements: The tool tries to automatically wait for an element before interacting with it. This eliminates a lot explicit wait commands in the test code","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":27,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_67":{"__typename":"Paragraph","id":"60f9299035bc_67","name":"f871","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Remote execution: The support running browsers on a remote machine (not on the machine that executes the test code)","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":17,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_68":{"__typename":"Paragraph","id":"60f9299035bc_68","name":"903c","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Video recordings: The tool can create a video recording of what happened in the browser during the test run","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":17,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_69":{"__typename":"Paragraph","id":"60f9299035bc_69","name":"c4af","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Switch tabs: The tool supports creating tabs in a browser instance","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":12,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_70":{"__typename":"Paragraph","id":"60f9299035bc_70","name":"c4f2","type":"ULI","href":null,"layout":null,"metadata":null,"text":"iFrame support: The tool supports switching between iFrames","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":15,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_71":{"__typename":"Paragraph","id":"60f9299035bc_71","name":"9df6","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Shadow DOM support: The tool works with Shadow DOM elements without extra effort","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":19,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_72":{"__typename":"Paragraph","id":"60f9299035bc_72","name":"5893","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Network inspection\u002Finterception\u002Fmocking: The tool is able to “look” into what is happening in the network. Therefore, blocking or mocking network requests is also possible","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":40,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_73":{"__typename":"Paragraph","id":"60f9299035bc_73","name":"649e","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Browser console inspection: The tool is able to “look” into the browser console","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":27,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_74":{"__typename":"Paragraph","id":"60f9299035bc_74","name":"8b0f","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Test recorder: The tool is able to record interaction with the UI of an app and create test code from that","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":14,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_75":{"__typename":"Paragraph","id":"60f9299035bc_75","name":"4a4a","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Test script debugger: The tool supports replaying a test in the browser, allowing the engineer to inspect what exactly was going on","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":21,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_76":{"__typename":"Paragraph","id":"60f9299035bc_76","name":"295f","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Component testing: The tool supports testing of UI components in isolation (like it is often done with JSDOM)","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":18,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_77":{"__typename":"Paragraph","id":"60f9299035bc_77","name":"aec9","type":"P","href":null,"layout":null,"metadata":null,"text":"Developer experience","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":20,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*aD5haot4PndaWnY5E3qoGg.png":{"__typename":"ImageMetadata","id":"1*aD5haot4PndaWnY5E3qoGg.png","originalHeight":528,"originalWidth":1886,"focusPercentX":null,"focusPercentY":null,"alt":"A table comparing the developer experience of each tool. A markdown version of the table is available at https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002F5aeb41c9f872451fd15d865890103634"},"Paragraph:60f9299035bc_78":{"__typename":"Paragraph","id":"60f9299035bc_78","name":"3120","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*aD5haot4PndaWnY5E3qoGg.png"},"text":"Click here for a markdown version of the table","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":6,"end":10,"href":"https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002F5aeb41c9f872451fd15d865890103634","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_79":{"__typename":"Paragraph","id":"60f9299035bc_79","name":"95ac","type":"P","href":null,"layout":null,"metadata":null,"text":"Key strengths and limitations","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":29,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*X9_HlQE8vY2XWMWGdh_pbw.png":{"__typename":"ImageMetadata","id":"1*X9_HlQE8vY2XWMWGdh_pbw.png","originalHeight":1216,"originalWidth":1886,"focusPercentX":null,"focusPercentY":null,"alt":"A table comparing key strengths and limitations. A markdown version of the table is available at https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002F3dc07a64a849507ac296ce6f07926379"},"Paragraph:60f9299035bc_80":{"__typename":"Paragraph","id":"60f9299035bc_80","name":"fffa","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*X9_HlQE8vY2XWMWGdh_pbw.png"},"text":"Click here for a markdown version of the table","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":6,"end":10,"href":"https:\u002F\u002Fgist.github.com\u002Fsystemboogie\u002F3dc07a64a849507ac296ce6f07926379","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_81":{"__typename":"Paragraph","id":"60f9299035bc_81","name":"57f6","type":"H4","href":null,"layout":null,"metadata":null,"text":"Important differences and takeaways","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_82":{"__typename":"Paragraph","id":"60f9299035bc_82","name":"d7a2","type":"P","href":null,"layout":null,"metadata":null,"text":"Certain differences between the tools are worth discussing in more detail.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_83":{"__typename":"Paragraph","id":"60f9299035bc_83","name":"e139","type":"P","href":null,"layout":null,"metadata":null,"text":"Different interpretations of “cross-browser”","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":44,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_84":{"__typename":"Paragraph","id":"60f9299035bc_84","name":"06df","type":"P","href":null,"layout":null,"metadata":null,"text":"All of the above-listed tools except for Puppeteer can claim that they support “cross-browser” testing. This is because they support running tests in more than one browser. Right? Well… technically, yes. But there are some things to keep in mind.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_85":{"__typename":"Paragraph","id":"60f9299035bc_85","name":"b64b","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Cypress and Playwright do not support Safari: Instead, they support WebKit. We already discussed above that WebKit ain’t Safari","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_86":{"__typename":"Paragraph","id":"60f9299035bc_86","name":"122c","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Cypress and Playwright do not offer testing on real mobile browsers: Instead, they rely on mobile emulation in the browser’s dev tools. We already discussed that mobile browser emulation ain’t an actual mobile browser","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_87":{"__typename":"Paragraph","id":"60f9299035bc_87","name":"5a0b","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Puppeteer and Playwright couple browser versions to the version of the tool. The browsers installed by Playwright and Puppeteer are always a little ahead of the current stable browser versions. For example, if you upgrade Playwright, you get a new set of browser versions. If you do not upgrade Playwright for a longer time, the browser versions covered in your tests lag behind the real world","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":25,"end":75,"href":"https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fbrowsers","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_88":{"__typename":"Paragraph","id":"60f9299035bc_88","name":"a2eb","type":"P","href":null,"layout":null,"metadata":null,"text":"Native vs. synthetic events","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":27,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_89":{"__typename":"Paragraph","id":"60f9299035bc_89","name":"9aa9","type":"P","href":null,"layout":null,"metadata":null,"text":"Let’s talk about user events emulated by the browser test tools, for example mouse events and keyboard events.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":77,"end":89,"href":"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FElement#mouse_events","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":94,"end":109,"href":"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FElement#keyboard_events","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_90":{"__typename":"Paragraph","id":"60f9299035bc_90","name":"7943","type":"P","href":null,"layout":null,"metadata":null,"text":"Playwright, Puppeteer and all WebDriver-based tools emulate “native events”. This is the type of events a real user creates when they interact with the browser. Native events are received by the browser from the operating system (OS).","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_91":{"__typename":"Paragraph","id":"60f9299035bc_91","name":"386d","type":"P","href":null,"layout":null,"metadata":null,"text":"Cypress and TestCafé on the other hand produce “synthetic events”. These events are produced by executing JavaScript directly in the browser, no OS-level events are involved.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_92":{"__typename":"Paragraph","id":"60f9299035bc_92","name":"ac9f","type":"P","href":null,"layout":null,"metadata":null,"text":"It is important to understand that an application-under-test may behave differently, depending on whether it receives a native event or a synthetic event. To illustrate the difference by example of a mouse click, imagine a button that is covered by a transparent element. For a real user, the button would be visible, but not clickable — the transparent element would receive the click instead of the button. An automation tool producing a native click event would yield the same result. However, with a synthetic click event, the button would still receive the click.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_93":{"__typename":"Paragraph","id":"60f9299035bc_93","name":"e6a0","type":"P","href":null,"layout":null,"metadata":null,"text":"For context, resorting to synthetic click events in WebDriver is considered a bad practice since a very long time. You can find discussions about the topic dating back to the pre-Cypress, pre-TestCafé era (example from 2014 and from 2016).","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":214,"end":223,"href":"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F24571048\u002Fselenium-webelement-click-vs-javascript-click-event","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":228,"end":237,"href":"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F34562061\u002Fwebdriver-click-vs-javascript-click","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_94":{"__typename":"Paragraph","id":"60f9299035bc_94","name":"d062","type":"P","href":null,"layout":null,"metadata":null,"text":"But there is more to it. Certain browser features just cannot be automated at all without native events. Some examples are: Sending keys to the page (tab key for accessibility testing), file upload or full-screen mode.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":201,"end":217,"href":"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F61880487\u002Ftestcafe-unable-to-click-on-a-button","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":75,"end":81,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_95":{"__typename":"Paragraph","id":"60f9299035bc_95","name":"5cbd","type":"P","href":null,"layout":null,"metadata":null,"text":"Feature set comparison","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":22,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_96":{"__typename":"Paragraph","id":"60f9299035bc_96","name":"099f","type":"P","href":null,"layout":null,"metadata":null,"text":"Cypress, Playwright and TestCafé set the benchmark when it comes to the feature set. For example, all four tools allow for…","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_97":{"__typename":"Paragraph","id":"60f9299035bc_97","name":"ecd7","type":"ULI","href":null,"layout":null,"metadata":null,"text":"… network inspection\u002Finterception\u002Fmocking","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_98":{"__typename":"Paragraph","id":"60f9299035bc_98","name":"5ee5","type":"ULI","href":null,"layout":null,"metadata":null,"text":"… browser console inspection","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_99":{"__typename":"Paragraph","id":"60f9299035bc_99","name":"7f96","type":"ULI","href":null,"layout":null,"metadata":null,"text":"… automatic waiting on elements","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_100":{"__typename":"Paragraph","id":"60f9299035bc_100","name":"e11a","type":"ULI","href":null,"layout":null,"metadata":null,"text":"… point-and-click recording of test steps","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_101":{"__typename":"Paragraph","id":"60f9299035bc_101","name":"04b0","type":"ULI","href":null,"layout":null,"metadata":null,"text":"… debugging test scripts","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_102":{"__typename":"Paragraph","id":"60f9299035bc_102","name":"fc0b","type":"ULI","href":null,"layout":null,"metadata":null,"text":"… recording video and screenshots of the executed test","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_103":{"__typename":"Paragraph","id":"60f9299035bc_103","name":"fb3f","type":"P","href":null,"layout":null,"metadata":null,"text":"Anything based on WebDriver has to start at a lower plateau. Some WebDriver-based tools implement certain features where possible (e.g. automatic waiting for elements), but they cannot implement features when constrained by WebDriver (e.g. browser console inspection). Third-party services like Browserstack and Sauce Labs can fill that gap, but not across all browsers.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_104":{"__typename":"Paragraph","id":"60f9299035bc_104","name":"0155","type":"P","href":null,"layout":null,"metadata":null,"text":"Ease of use and developer experience","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":36,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_105":{"__typename":"Paragraph","id":"60f9299035bc_105","name":"f15c","type":"P","href":null,"layout":null,"metadata":null,"text":"Cypress, Playwright and TestCafé lead the pack in terms of ease of use. They come bundled with everything required to write browser tests, are easy to learn, offer great features for debugging tests and offer comprehensive documentation.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_106":{"__typename":"Paragraph","id":"60f9299035bc_106","name":"e157","type":"P","href":null,"layout":null,"metadata":null,"text":"Puppeteer and WebDriver-based tools do not shine here. However, to be fair with regards to WebDriver, there are differences between tools created by the Selenium project versus tools created by other maintainers. For example, WebdriverIO does not have that steep of a learning curve, has debugging functionality and comprehensive documentation.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":153,"end":169,"href":"https:\u002F\u002Fwww.selenium.dev\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":226,"end":237,"href":"https:\u002F\u002Fwebdriver.io\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_107":{"__typename":"Paragraph","id":"60f9299035bc_107","name":"7990","type":"P","href":null,"layout":null,"metadata":null,"text":"Ownership, maintenance and governance","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":37,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_108":{"__typename":"Paragraph","id":"60f9299035bc_108","name":"343e","type":"P","href":null,"layout":null,"metadata":null,"text":"WebDriver as a W3C standard is part of the Selenium project, which is open-source with the Software Freedom Conservancy as copyright holder. There are tools built upon WebDriver that follow a similar approach. One example is WebdriverIO, which is backed by the OpenJS Foundation.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":91,"end":119,"href":"https:\u002F\u002Fsfconservancy.org\u002Fprojects\u002Fcurrent\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":261,"end":278,"href":"https:\u002F\u002Fopenjsf.org\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_109":{"__typename":"Paragraph","id":"60f9299035bc_109","name":"9746","type":"P","href":null,"layout":null,"metadata":null,"text":"Cypress, Playwright, Puppeteer and TestCafé are all in some way backed or maintained by a company. This may also apply to WebDriver-based tools. There is, for example, Nightwatch.js with Browserstack as copyright holder. Keep in mind that such companies may discontinue working on their tool at any time. One famous example for that is Angular\u002FGoogle announcing in 2021 to pull the plug from Protractor (a WebDriver-based tool).","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":336,"end":427,"href":"https:\u002F\u002Fgithub.com\u002Fangular\u002Fprotractor\u002Fissues\u002F5502","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_110":{"__typename":"Paragraph","id":"60f9299035bc_110","name":"29d0","type":"H3","href":null,"layout":null,"metadata":null,"text":"Your project’s characteristics","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":30,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_111":{"__typename":"Paragraph","id":"60f9299035bc_111","name":"78b4","type":"P","href":null,"layout":null,"metadata":null,"text":"All of the above information should help you getting a decent understanding of browsers and browser automation tools. However, you cannot make a decision without taking some of your project’s characteristics into account. The most important seem to be browser support and certain team characteristics.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_112":{"__typename":"Paragraph","id":"60f9299035bc_112","name":"9126","type":"H4","href":null,"layout":null,"metadata":null,"text":"Which browsers do you have to support?","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":38,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_113":{"__typename":"Paragraph","id":"60f9299035bc_113","name":"8886","type":"P","href":null,"layout":null,"metadata":null,"text":"This is informed by several aspects. Here are some examples.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_114":{"__typename":"Paragraph","id":"60f9299035bc_114","name":"05f6","type":"ULI","href":null,"layout":null,"metadata":null,"text":"The type of application you are building: Desktop-only or both, desktop and mobile","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_115":{"__typename":"Paragraph","id":"60f9299035bc_115","name":"1915","type":"ULI","href":null,"layout":null,"metadata":null,"text":"The targeted region(s): At NEW WORK SE, this is usually DACH. If you target more\u002Fother regions, keep in mind that browser\u002Fdevice market share can be quite different there","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":56,"end":60,"href":"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeographical_distribution_of_German_speakers#German-speaking_Europe","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_116":{"__typename":"Paragraph","id":"60f9299035bc_116","name":"cf03","type":"ULI","href":null,"layout":null,"metadata":null,"text":"The size of your userbase: More users means more diversity in browsers and devices. Also, if you have many users on your page, a small relative browser usage number may translate into a quite large absolute number","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_117":{"__typename":"Paragraph","id":"60f9299035bc_117","name":"6563","type":"ULI","href":null,"layout":null,"metadata":null,"text":"The targeted customers: In a B2B project, your customers may work on administered desktop machines that only allow certain browsers or browser versions. For example, larger companies only allow their employees to use the Firefox Extended Support Release (ESR) channel instead of the latest stable Firefox channel","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":221,"end":267,"href":"https:\u002F\u002Fsupport.mozilla.org\u002Fen-US\u002Fkb\u002Fchoosing-firefox-update-channel","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_118":{"__typename":"Paragraph","id":"60f9299035bc_118","name":"95fc","type":"P","href":null,"layout":null,"metadata":null,"text":"If you need inspiration with regards to browser share numbers, have a look at the reports of your tracking suite. Alternatively, explore the data available on the Statcounter browser market share overview.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":163,"end":204,"href":"https:\u002F\u002Fgs.statcounter.com\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_119":{"__typename":"Paragraph","id":"60f9299035bc_119","name":"cc0c","type":"H4","href":null,"layout":null,"metadata":null,"text":"What are your team’s characteristics?","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":37,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_120":{"__typename":"Paragraph","id":"60f9299035bc_120","name":"fad4","type":"P","href":null,"layout":null,"metadata":null,"text":"Think about the characteristics of your team that may have an influence on your tool decision. Here are some examples.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_121":{"__typename":"Paragraph","id":"60f9299035bc_121","name":"66dc","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Who will write the browser tests most of the time: Our suggestion is that frontend engineers do it, directly when working on the app. This most probably makes JavaScript a default as the programming language, but maybe you have someone “full-stack” on your team who prefers a different language","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_122":{"__typename":"Paragraph","id":"60f9299035bc_122","name":"7590","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Expertise in browser automation tools: If you have never written automated browser tests (or not even any other code) before, the learning curve can be quite steep and you may want to start off with a tool that is easier to set up and learn","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_123":{"__typename":"Paragraph","id":"60f9299035bc_123","name":"c00a","type":"H3","href":null,"layout":null,"metadata":null,"text":"Conclusion","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":10,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_124":{"__typename":"Paragraph","id":"60f9299035bc_124","name":"3397","type":"H4","href":null,"layout":null,"metadata":null,"text":"Trade-offs everywhere","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":21,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_125":{"__typename":"Paragraph","id":"60f9299035bc_125","name":"6306","type":"P","href":null,"layout":null,"metadata":null,"text":"It should be no surprise with all the things discussed above: None of the browser test tools mentioned in this document is a universal fit for any kind of project. There is no clear winner, no one tool to rule ’em all:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_126":{"__typename":"Paragraph","id":"60f9299035bc_126","name":"4611","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Playwright and Puppeteer do not offer great\u002Fany cross-browser support","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_127":{"__typename":"Paragraph","id":"60f9299035bc_127","name":"69bc","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Cypress, Playwright and Puppeteer do not offer mobile browser support","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_128":{"__typename":"Paragraph","id":"60f9299035bc_128","name":"ce5c","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Cypress and TestCafé do not provide 100% valid test results","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_129":{"__typename":"Paragraph","id":"60f9299035bc_129","name":"6ce3","type":"ULI","href":null,"layout":null,"metadata":null,"text":"WebDriver-based solutions lack ease of use and good developer experience","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_130":{"__typename":"Paragraph","id":"60f9299035bc_130","name":"43d8","type":"P","href":null,"layout":null,"metadata":null,"text":"This means that your path to a browser test tool decision will be paved with trade-offs. And after you arrived at a decision, brace yourself to also feel the trade-offs in your daily business.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_131":{"__typename":"Paragraph","id":"60f9299035bc_131","name":"ff86","type":"H4","href":null,"layout":null,"metadata":null,"text":"Two types of tools","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":18,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_132":{"__typename":"Paragraph","id":"60f9299035bc_132","name":"69b4","type":"P","href":null,"layout":null,"metadata":null,"text":"As of 2022, you can basically decide between two types of tools: The first type offers great features and developer experience (they satisfy engineer’s needs). The second type provides great support for off-the-shelf browsers and validity of test results (they satisfy your customer’s needs).","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_133":{"__typename":"Paragraph","id":"60f9299035bc_133","name":"8354","type":"ULI","href":null,"layout":null,"metadata":null,"text":"First type: Cypress, TestCafé","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_134":{"__typename":"Paragraph","id":"60f9299035bc_134","name":"381b","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Somehow both, first and second type: Playwright","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_135":{"__typename":"Paragraph","id":"60f9299035bc_135","name":"aec8","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Second type: WebDriver-based tools","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_136":{"__typename":"Paragraph","id":"60f9299035bc_136","name":"89b4","type":"P","href":null,"layout":null,"metadata":null,"text":"Cypress and TestCafé are at home in the first category. Cypress has defined what can be expected from a browser test tool in terms of feature set, debuggability and developer experience. TestCafé is also a great tool in these categories. However, the lack of native events in both tools and some more limitations in Cypress (no iFrame support, no tab support, …) make them less attractive.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_137":{"__typename":"Paragraph","id":"60f9299035bc_137","name":"3344","type":"P","href":null,"layout":null,"metadata":null,"text":"Playwright is somehow at home in both categories. It provides great developer experience and also validity of test results, but it comes with one caveat: It has very limited browser support. It could be a good fit if your applicaton is desktop-only and only supports Chrome and Firefox. If you are able to manage browser versions (i.e. always be a little behind Playwright’s official releases), then this could work for you.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_138":{"__typename":"Paragraph","id":"60f9299035bc_138","name":"0035","type":"P","href":null,"layout":null,"metadata":null,"text":"WebDriver-based tools are at home in the second category. WebDriver is boring technology in the best sense of the word. And it does a very good job at being where your customers are. Some tools built upon WebDriver offer an okay-ish developer experience and they are quick in picking up the latest WebDriver features. Good examples are WebdriverIO and Nightwatch.js.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":71,"end":88,"href":"https:\u002F\u002Fboringtechnology.club\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_139":{"__typename":"Paragraph","id":"60f9299035bc_139","name":"d106","type":"H4","href":null,"layout":null,"metadata":null,"text":"A nuanced comparison","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":20,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_140":{"__typename":"Paragraph","id":"60f9299035bc_140","name":"d4ad","type":"P","href":null,"layout":null,"metadata":null,"text":"Of course it is a bit unfair to paint a black and white picture. So let’s compare the discussed tools in a nuanced manner, focusing on the following properties:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_141":{"__typename":"Paragraph","id":"60f9299035bc_141","name":"f849","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Browser support: How broad the browser support is and how close to real life conditions","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":16,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_142":{"__typename":"Paragraph","id":"60f9299035bc_142","name":"7198","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Validity of test results: How close the test results are to real life conditions","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":25,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_143":{"__typename":"Paragraph","id":"60f9299035bc_143","name":"b0ef","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Feature set: Number and type of features","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":12,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_144":{"__typename":"Paragraph","id":"60f9299035bc_144","name":"ff47","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Developer experience: Ease of use, debuggability, etc","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":21,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_145":{"__typename":"Paragraph","id":"60f9299035bc_145","name":"dc25","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Ownership, maintenance and governance: How independent the tool is from the favor of a company, how many maintainers it has, how independent it is in terms of governance","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":39,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:1*-FoOHdT_6yYrV2ZgCtOSaQ.png":{"__typename":"ImageMetadata","id":"1*-FoOHdT_6yYrV2ZgCtOSaQ.png","originalHeight":750,"originalWidth":1326,"focusPercentX":null,"focusPercentY":null,"alt":"A radar chart comparing Cypress, Playwright, Puppeteer, TestCafé and WebDriver at a glance"},"Paragraph:60f9299035bc_146":{"__typename":"Paragraph","id":"60f9299035bc_146","name":"eabb","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:1*-FoOHdT_6yYrV2ZgCtOSaQ.png"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_147":{"__typename":"Paragraph","id":"60f9299035bc_147","name":"18b8","type":"H4","href":null,"layout":null,"metadata":null,"text":"Our recommendation","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":18,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_148":{"__typename":"Paragraph","id":"60f9299035bc_148","name":"b50f","type":"P","href":null,"layout":null,"metadata":null,"text":"As mentioned in the introduction, this comparison of browser test tools is different, and here is why: We want to bring the customer perspective to the table. That may sound strange at first, since your customers do not pick your test tool and they do not know which tool you are using. But it’s them who feel the consequences if you miss bugs.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":249,"end":260,"href":null,"anchorType":null,"userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":305,"end":326,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_149":{"__typename":"Paragraph","id":"60f9299035bc_149","name":"b317","type":"P","href":null,"layout":null,"metadata":null,"text":"Ideally, your testing happens in a stable-channel off-the-shelf browser, because that is what your customers are using. And ideally, your testing happens with native OS-level events, because that is what your customers are producing when working with your app. So, in light of that, the two best options are currently:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_150":{"__typename":"Paragraph","id":"60f9299035bc_150","name":"96d1","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Any WebDriver-based tool that provides good developer experience","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_151":{"__typename":"Paragraph","id":"60f9299035bc_151","name":"e204","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Playwright in case your app is desktop-only and Chrome\u002FFirefox-only","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_152":{"__typename":"Paragraph","id":"60f9299035bc_152","name":"9221","type":"P","href":null,"layout":null,"metadata":null,"text":"But after all, you have to decide yourself of course. We would be glad if this document helps you on your way to an informed decision. Have fun building great apps for your customers. Good luck!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_153":{"__typename":"Paragraph","id":"60f9299035bc_153","name":"75e6","type":"P","href":null,"layout":null,"metadata":null,"text":"Thanks to Björn Brauer, Markus Wolf, Amilcar Gomes and Daniel Lauschke for reviewing this document!","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_154":{"__typename":"Paragraph","id":"60f9299035bc_154","name":"ce6d","type":"H3","href":null,"layout":null,"metadata":null,"text":"Remarks","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":7,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_155":{"__typename":"Paragraph","id":"60f9299035bc_155","name":"0f9d","type":"P","href":null,"layout":null,"metadata":null,"text":"[1]: Developer quotes from the MDN Browser Compatibility Report 2020:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_156":{"__typename":"Paragraph","id":"60f9299035bc_156","name":"ad2f","type":"BQ","href":null,"layout":null,"metadata":null,"text":"“Safari desktop does not support type=”date” on the `\u003Cinput\u003E` element on desktop though Safari iOS has support for this attribute.”","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_157":{"__typename":"Paragraph","id":"60f9299035bc_157","name":"5395","type":"BQ","href":null,"layout":null,"metadata":null,"text":"“So the scroll worked fine in Chrome in iOS, in Chrome and Safari on macOS. But in Safari for iOS there was somewhere where that scroll was interfering with our scroll.”","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_158":{"__typename":"Paragraph","id":"60f9299035bc_158","name":"edb9","type":"BQ","href":null,"layout":null,"metadata":null,"text":"“With iOS 13 they changed something and now scrolling works like garbage on iOS, especially on older devices such as an iPhone SE or older iPads. All the animations are broken and it doesn’t feel natural if you’re swiping through this gallery. Now I’ve used this in 5 or 6 projects, and something that used to work fine is now broken.”","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_159":{"__typename":"Paragraph","id":"60f9299035bc_159","name":"3d7e","type":"P","href":null,"layout":null,"metadata":null,"text":"[2]: Tools built on top of WebDriver may have a different license","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_160":{"__typename":"Paragraph","id":"60f9299035bc_160","name":"bac9","type":"P","href":null,"layout":null,"metadata":null,"text":"[3]: Chromium is also possible","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_161":{"__typename":"Paragraph","id":"60f9299035bc_161","name":"20e6","type":"P","href":null,"layout":null,"metadata":null,"text":"[4]: Every given Playwright version supports: Chromium (current Chrome version + 1), Chrome\u002FEdge current stable and beta, Firefox current stable, WebKit current trunk build","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_162":{"__typename":"Paragraph","id":"60f9299035bc_162","name":"5397","type":"P","href":null,"layout":null,"metadata":null,"text":"[5]: Depends on which tool you are using. For example, WebdriverIO ships with “automatic waits”","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_163":{"__typename":"Paragraph","id":"60f9299035bc_163","name":"2bb5","type":"P","href":null,"layout":null,"metadata":null,"text":"[6]: Depends on which tool you are using. WebdriverIO features a plugin that converts Chrome DevTools Recorder scripts to WebdriverIO test code","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_164":{"__typename":"Paragraph","id":"60f9299035bc_164","name":"b9fb","type":"P","href":null,"layout":null,"metadata":null,"text":"[7]: Depends on which tool you are using. Nightwatch.js supports component tests for Vue and React components","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_165":{"__typename":"Paragraph","id":"60f9299035bc_165","name":"0452","type":"P","href":null,"layout":null,"metadata":null,"text":"[8]: Depends on which tool you are using. Time to first test and debuggability is quite good with WebdriverIO, but not so much with the bare selenium-webdriver NPM package","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":141,"end":171,"href":"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fselenium-webdriver","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_166":{"__typename":"Paragraph","id":"60f9299035bc_166","name":"843e","type":"H3","href":null,"layout":null,"metadata":null,"text":"Further reading","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_167":{"__typename":"Paragraph","id":"60f9299035bc_167","name":"c8cb","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Cypress docs","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":12,"href":"https:\u002F\u002Fdocs.cypress.io\u002Fguides\u002Foverview\u002Fwhy-cypress","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_168":{"__typename":"Paragraph","id":"60f9299035bc_168","name":"18cf","type":"ULI","href":null,"layout":null,"metadata":null,"text":"No support for native browser events in Cypress","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":47,"href":"https:\u002F\u002Fgithub.com\u002Fcypress-io\u002Fcypress\u002Fissues\u002F311","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_169":{"__typename":"Paragraph","id":"60f9299035bc_169","name":"36ff","type":"ULI","href":null,"layout":null,"metadata":null,"text":"No iFrame support in Cypress","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":28,"href":"https:\u002F\u002Fgithub.com\u002Fcypress-io\u002Fcypress\u002Fissues\u002F136","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_170":{"__typename":"Paragraph","id":"60f9299035bc_170","name":"4fee","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Playwright docs","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":15,"href":"https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fintro","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_171":{"__typename":"Paragraph","id":"60f9299035bc_171","name":"a29c","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Your Favorite Questions about Playwright, Answered From The Applitools Team","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":75,"href":"https:\u002F\u002Fapplitools.com\u002Fblog\u002Ftop-playwright-questions-answered\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_172":{"__typename":"Paragraph","id":"60f9299035bc_172","name":"0278","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Puppeteer docs","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":14,"href":"https:\u002F\u002Fpptr.dev\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_173":{"__typename":"Paragraph","id":"60f9299035bc_173","name":"b4c3","type":"ULI","href":null,"layout":null,"metadata":null,"text":"TestCafé docs","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":13,"href":"https:\u002F\u002Ftestcafe.io\u002Fdocumentation\u002F402635\u002Fgetting-started","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_174":{"__typename":"Paragraph","id":"60f9299035bc_174","name":"d9ff","type":"ULI","href":null,"layout":null,"metadata":null,"text":"WebDriver docs","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":14,"href":"https:\u002F\u002Fwww.selenium.dev\u002Fdocumentation\u002Fwebdriver\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_175":{"__typename":"Paragraph","id":"60f9299035bc_175","name":"591d","type":"ULI","href":null,"layout":null,"metadata":null,"text":"WebdriverIO docs","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":16,"href":"https:\u002F\u002Fwebdriver.io\u002Fdocs\u002Fgettingstarted","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_176":{"__typename":"Paragraph","id":"60f9299035bc_176","name":"d5d2","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Nightwatch.js docs","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":18,"href":"https:\u002F\u002Fnightwatchjs.org\u002Fguide\u002Foverview\u002Fwhat-is-nightwatch.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_177":{"__typename":"Paragraph","id":"60f9299035bc_177","name":"a5fe","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Link collection on the topic of browser compatibility and interoperability","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":74,"href":"https:\u002F\u002Fmarcusnoll.de\u002F%2BDigital+garden\u002FBrowser+compatibility+and+interoperability","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_178":{"__typename":"Paragraph","id":"60f9299035bc_178","name":"47ed","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Cypress vs Selenium","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":19,"href":"https:\u002F\u002Fxenovation.com\u002Fblog\u002Fsoftware-testing\u002Fcypress-vs-selenium#maturity-of-cypress","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_179":{"__typename":"Paragraph","id":"60f9299035bc_179","name":"d1aa","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Cypress vs Selenium: Key Differences","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":36,"href":"https:\u002F\u002Fwww.browserstack.com\u002Fguide\u002Fcypress-vs-selenium","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_180":{"__typename":"Paragraph","id":"60f9299035bc_180","name":"3c5c","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Playwright vs Selenium: What are the Main Differences and Which is Better?","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":74,"href":"https:\u002F\u002Fapplitools.com\u002Fblog\u002Fplaywright-vs-selenium\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_181":{"__typename":"Paragraph","id":"60f9299035bc_181","name":"a44a","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Cypress vs Playwright: Which is best for E2E testing?","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":53,"href":"https:\u002F\u002Fcathalmacdonnacha.com\u002Fcypress-vs-playwright-which-is-best-for-e2e-testing","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:60f9299035bc_182":{"__typename":"Paragraph","id":"60f9299035bc_182","name":"ec96","type":"ULI","href":null,"layout":null,"metadata":null,"text":"Jake Archibald on native vs. JavaScript clicks (excerpt from his talk “In The Loop - setTimeout, micro tasks, requestAnimationFrame, requestIdleCallback, …”) and thread about consequences for browser test tools on Twitter","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":46,"href":"https:\u002F\u002Fyoutu.be\u002FcCOL7MC4Pl0?t=1794","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":162,"end":221,"href":"https:\u002F\u002Ftwitter.com\u002Fegilhansen\u002Fstatus\u002F1059861917995556872","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"CollectionViewerEdge:collectionId:35cb8c78d3cf-viewerId:lo_5c312e933cdf":{"__typename":"CollectionViewerEdge","id":"collectionId:35cb8c78d3cf-viewerId:lo_5c312e933cdf","isEditor":false,"isMuting":false},"UserViewerEdge:userId:f12092972d20-viewerId:lo_5c312e933cdf":{"__typename":"UserViewerEdge","id":"userId:f12092972d20-viewerId:lo_5c312e933cdf","isMuting":false},"PostViewerEdge:postId:cc9b3e9d16a-viewerId:lo_5c312e933cdf":{"__typename":"PostViewerEdge","shouldIndexPostForExternalSearch":true,"id":"postId:cc9b3e9d16a-viewerId:lo_5c312e933cdf"},"Tag:browser-testing-tool":{"__typename":"Tag","id":"browser-testing-tool","displayTitle":"Browser Testing Tool","normalizedTagSlug":"browser-testing-tool"},"Tag:cross-browser-testing":{"__typename":"Tag","id":"cross-browser-testing","displayTitle":"Cross Browser Testing","normalizedTagSlug":"cross-browser-testing"},"Tag:browser-automation":{"__typename":"Tag","id":"browser-automation","displayTitle":"Browser Automation","normalizedTagSlug":"browser-automation"},"Post:cc9b3e9d16a":{"__typename":"Post","id":"cc9b3e9d16a","collection":{"__ref":"Collection:35cb8c78d3cf"},"content({\"postMeteringOptions\":{\"referrer\":\"\"}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"bodyModel":{"__typename":"RichText","sections":[{"__typename":"Section","name":"203f","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null},{"__typename":"Section","name":"9463","startIndex":8,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null},{"__typename":"Section","name":"7437","startIndex":47,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null},{"__typename":"Section","name":"9075","startIndex":110,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null},{"__typename":"Section","name":"02e9","startIndex":123,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null},{"__typename":"Section","name":"1ec1","startIndex":147,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null},{"__typename":"Section","name":"8f89","startIndex":154,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null},{"__typename":"Section","name":"a0f2","startIndex":166,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}],"paragraphs":[{"__ref":"Paragraph:60f9299035bc_0"},{"__ref":"Paragraph:60f9299035bc_1"},{"__ref":"Paragraph:60f9299035bc_2"},{"__ref":"Paragraph:60f9299035bc_3"},{"__ref":"Paragraph:60f9299035bc_4"},{"__ref":"Paragraph:60f9299035bc_5"},{"__ref":"Paragraph:60f9299035bc_6"},{"__ref":"Paragraph:60f9299035bc_7"},{"__ref":"Paragraph:60f9299035bc_8"},{"__ref":"Paragraph:60f9299035bc_9"},{"__ref":"Paragraph:60f9299035bc_10"},{"__ref":"Paragraph:60f9299035bc_11"},{"__ref":"Paragraph:60f9299035bc_12"},{"__ref":"Paragraph:60f9299035bc_13"},{"__ref":"Paragraph:60f9299035bc_14"},{"__ref":"Paragraph:60f9299035bc_15"},{"__ref":"Paragraph:60f9299035bc_16"},{"__ref":"Paragraph:60f9299035bc_17"},{"__ref":"Paragraph:60f9299035bc_18"},{"__ref":"Paragraph:60f9299035bc_19"},{"__ref":"Paragraph:60f9299035bc_20"},{"__ref":"Paragraph:60f9299035bc_21"},{"__ref":"Paragraph:60f9299035bc_22"},{"__ref":"Paragraph:60f9299035bc_23"},{"__ref":"Paragraph:60f9299035bc_24"},{"__ref":"Paragraph:60f9299035bc_25"},{"__ref":"Paragraph:60f9299035bc_26"},{"__ref":"Paragraph:60f9299035bc_27"},{"__ref":"Paragraph:60f9299035bc_28"},{"__ref":"Paragraph:60f9299035bc_29"},{"__ref":"Paragraph:60f9299035bc_30"},{"__ref":"Paragraph:60f9299035bc_31"},{"__ref":"Paragraph:60f9299035bc_32"},{"__ref":"Paragraph:60f9299035bc_33"},{"__ref":"Paragraph:60f9299035bc_34"},{"__ref":"Paragraph:60f9299035bc_35"},{"__ref":"Paragraph:60f9299035bc_36"},{"__ref":"Paragraph:60f9299035bc_37"},{"__ref":"Paragraph:60f9299035bc_38"},{"__ref":"Paragraph:60f9299035bc_39"},{"__ref":"Paragraph:60f9299035bc_40"},{"__ref":"Paragraph:60f9299035bc_41"},{"__ref":"Paragraph:60f9299035bc_42"},{"__ref":"Paragraph:60f9299035bc_43"},{"__ref":"Paragraph:60f9299035bc_44"},{"__ref":"Paragraph:60f9299035bc_45"},{"__ref":"Paragraph:60f9299035bc_46"},{"__ref":"Paragraph:60f9299035bc_47"},{"__ref":"Paragraph:60f9299035bc_48"},{"__ref":"Paragraph:60f9299035bc_49"},{"__ref":"Paragraph:60f9299035bc_50"},{"__ref":"Paragraph:60f9299035bc_51"},{"__ref":"Paragraph:60f9299035bc_52"},{"__ref":"Paragraph:60f9299035bc_53"},{"__ref":"Paragraph:60f9299035bc_54"},{"__ref":"Paragraph:60f9299035bc_55"},{"__ref":"Paragraph:60f9299035bc_56"},{"__ref":"Paragraph:60f9299035bc_57"},{"__ref":"Paragraph:60f9299035bc_58"},{"__ref":"Paragraph:60f9299035bc_59"},{"__ref":"Paragraph:60f9299035bc_60"},{"__ref":"Paragraph:60f9299035bc_61"},{"__ref":"Paragraph:60f9299035bc_62"},{"__ref":"Paragraph:60f9299035bc_63"},{"__ref":"Paragraph:60f9299035bc_64"},{"__ref":"Paragraph:60f9299035bc_65"},{"__ref":"Paragraph:60f9299035bc_66"},{"__ref":"Paragraph:60f9299035bc_67"},{"__ref":"Paragraph:60f9299035bc_68"},{"__ref":"Paragraph:60f9299035bc_69"},{"__ref":"Paragraph:60f9299035bc_70"},{"__ref":"Paragraph:60f9299035bc_71"},{"__ref":"Paragraph:60f9299035bc_72"},{"__ref":"Paragraph:60f9299035bc_73"},{"__ref":"Paragraph:60f9299035bc_74"},{"__ref":"Paragraph:60f9299035bc_75"},{"__ref":"Paragraph:60f9299035bc_76"},{"__ref":"Paragraph:60f9299035bc_77"},{"__ref":"Paragraph:60f9299035bc_78"},{"__ref":"Paragraph:60f9299035bc_79"},{"__ref":"Paragraph:60f9299035bc_80"},{"__ref":"Paragraph:60f9299035bc_81"},{"__ref":"Paragraph:60f9299035bc_82"},{"__ref":"Paragraph:60f9299035bc_83"},{"__ref":"Paragraph:60f9299035bc_84"},{"__ref":"Paragraph:60f9299035bc_85"},{"__ref":"Paragraph:60f9299035bc_86"},{"__ref":"Paragraph:60f9299035bc_87"},{"__ref":"Paragraph:60f9299035bc_88"},{"__ref":"Paragraph:60f9299035bc_89"},{"__ref":"Paragraph:60f9299035bc_90"},{"__ref":"Paragraph:60f9299035bc_91"},{"__ref":"Paragraph:60f9299035bc_92"},{"__ref":"Paragraph:60f9299035bc_93"},{"__ref":"Paragraph:60f9299035bc_94"},{"__ref":"Paragraph:60f9299035bc_95"},{"__ref":"Paragraph:60f9299035bc_96"},{"__ref":"Paragraph:60f9299035bc_97"},{"__ref":"Paragraph:60f9299035bc_98"},{"__ref":"Paragraph:60f9299035bc_99"},{"__ref":"Paragraph:60f9299035bc_100"},{"__ref":"Paragraph:60f9299035bc_101"},{"__ref":"Paragraph:60f9299035bc_102"},{"__ref":"Paragraph:60f9299035bc_103"},{"__ref":"Paragraph:60f9299035bc_104"},{"__ref":"Paragraph:60f9299035bc_105"},{"__ref":"Paragraph:60f9299035bc_106"},{"__ref":"Paragraph:60f9299035bc_107"},{"__ref":"Paragraph:60f9299035bc_108"},{"__ref":"Paragraph:60f9299035bc_109"},{"__ref":"Paragraph:60f9299035bc_110"},{"__ref":"Paragraph:60f9299035bc_111"},{"__ref":"Paragraph:60f9299035bc_112"},{"__ref":"Paragraph:60f9299035bc_113"},{"__ref":"Paragraph:60f9299035bc_114"},{"__ref":"Paragraph:60f9299035bc_115"},{"__ref":"Paragraph:60f9299035bc_116"},{"__ref":"Paragraph:60f9299035bc_117"},{"__ref":"Paragraph:60f9299035bc_118"},{"__ref":"Paragraph:60f9299035bc_119"},{"__ref":"Paragraph:60f9299035bc_120"},{"__ref":"Paragraph:60f9299035bc_121"},{"__ref":"Paragraph:60f9299035bc_122"},{"__ref":"Paragraph:60f9299035bc_123"},{"__ref":"Paragraph:60f9299035bc_124"},{"__ref":"Paragraph:60f9299035bc_125"},{"__ref":"Paragraph:60f9299035bc_126"},{"__ref":"Paragraph:60f9299035bc_127"},{"__ref":"Paragraph:60f9299035bc_128"},{"__ref":"Paragraph:60f9299035bc_129"},{"__ref":"Paragraph:60f9299035bc_130"},{"__ref":"Paragraph:60f9299035bc_131"},{"__ref":"Paragraph:60f9299035bc_132"},{"__ref":"Paragraph:60f9299035bc_133"},{"__ref":"Paragraph:60f9299035bc_134"},{"__ref":"Paragraph:60f9299035bc_135"},{"__ref":"Paragraph:60f9299035bc_136"},{"__ref":"Paragraph:60f9299035bc_137"},{"__ref":"Paragraph:60f9299035bc_138"},{"__ref":"Paragraph:60f9299035bc_139"},{"__ref":"Paragraph:60f9299035bc_140"},{"__ref":"Paragraph:60f9299035bc_141"},{"__ref":"Paragraph:60f9299035bc_142"},{"__ref":"Paragraph:60f9299035bc_143"},{"__ref":"Paragraph:60f9299035bc_144"},{"__ref":"Paragraph:60f9299035bc_145"},{"__ref":"Paragraph:60f9299035bc_146"},{"__ref":"Paragraph:60f9299035bc_147"},{"__ref":"Paragraph:60f9299035bc_148"},{"__ref":"Paragraph:60f9299035bc_149"},{"__ref":"Paragraph:60f9299035bc_150"},{"__ref":"Paragraph:60f9299035bc_151"},{"__ref":"Paragraph:60f9299035bc_152"},{"__ref":"Paragraph:60f9299035bc_153"},{"__ref":"Paragraph:60f9299035bc_154"},{"__ref":"Paragraph:60f9299035bc_155"},{"__ref":"Paragraph:60f9299035bc_156"},{"__ref":"Paragraph:60f9299035bc_157"},{"__ref":"Paragraph:60f9299035bc_158"},{"__ref":"Paragraph:60f9299035bc_159"},{"__ref":"Paragraph:60f9299035bc_160"},{"__ref":"Paragraph:60f9299035bc_161"},{"__ref":"Paragraph:60f9299035bc_162"},{"__ref":"Paragraph:60f9299035bc_163"},{"__ref":"Paragraph:60f9299035bc_164"},{"__ref":"Paragraph:60f9299035bc_165"},{"__ref":"Paragraph:60f9299035bc_166"},{"__ref":"Paragraph:60f9299035bc_167"},{"__ref":"Paragraph:60f9299035bc_168"},{"__ref":"Paragraph:60f9299035bc_169"},{"__ref":"Paragraph:60f9299035bc_170"},{"__ref":"Paragraph:60f9299035bc_171"},{"__ref":"Paragraph:60f9299035bc_172"},{"__ref":"Paragraph:60f9299035bc_173"},{"__ref":"Paragraph:60f9299035bc_174"},{"__ref":"Paragraph:60f9299035bc_175"},{"__ref":"Paragraph:60f9299035bc_176"},{"__ref":"Paragraph:60f9299035bc_177"},{"__ref":"Paragraph:60f9299035bc_178"},{"__ref":"Paragraph:60f9299035bc_179"},{"__ref":"Paragraph:60f9299035bc_180"},{"__ref":"Paragraph:60f9299035bc_181"},{"__ref":"Paragraph:60f9299035bc_182"}]},"validatedShareKey":"","shareKeyCreator":null},"creator":{"__ref":"User:f12092972d20"},"inResponseToEntityType":null,"isLocked":false,"isMarkedPaywallOnly":false,"lockedSource":"LOCKED_POST_SOURCE_NONE","mediumUrl":"https:\u002F\u002Ftech.new-work.se\u002Fdecision-guide-for-browser-test-tooling-cc9b3e9d16a","primaryTopic":null,"topics":[{"__typename":"Topic","slug":"programming"}],"isLimitedState":false,"isPublished":true,"allowResponses":true,"latestPublishedVersion":"60f9299035bc","visibility":"PUBLIC","postResponses":{"__typename":"PostResponses","count":0},"responseDistribution":"NOT_DISTRIBUTED","clapCount":48,"title":"Decision guide for browser test tooling","isSeries":false,"sequence":null,"uniqueSlug":"decision-guide-for-browser-test-tooling-cc9b3e9d16a","socialTitle":"","socialDek":"","canonicalUrl":"","metaDescription":"","latestPublishedAt":1670344395919,"readingTime":15.13679245283019,"previewContent":{"__typename":"PreviewContent","subtitle":"At NEW WORK SE, every team is free to decide on the browser test automation tooling for their project. However, information from tooling…"},"previewImage":{"__ref":"ImageMetadata:1*-FoOHdT_6yYrV2ZgCtOSaQ.png"},"isShortform":false,"seoTitle":"Decision guide for browser test tooling","firstPublishedAt":1670344395919,"updatedAt":1670344402104,"shortformType":"SHORTFORM_TYPE_LINK","seoDescription":"A guide for picking the right browser test automation tool for your project. Learn also about idiosyncrasies of browsers and the validity of the tools' test results.","viewerEdge":{"__ref":"PostViewerEdge:postId:cc9b3e9d16a-viewerId:lo_5c312e933cdf"},"isSuspended":false,"license":"ALL_RIGHTS_RESERVED","tags":[{"__ref":"Tag:browser-testing-tool"},{"__ref":"Tag:cross-browser-testing"},{"__ref":"Tag:browser-automation"}],"isFeaturedInPublishedPublication":false,"isNewsletter":false,"statusForCollection":"APPROVED","pendingCollection":null,"detectedLanguage":"en","wordCount":3733,"layerCake":0,"responsesLocked":false}}</script><script src="https://cdn-client.medium.com/lite/static/js/manifest.71c31feb.js"></script><script src="https://cdn-client.medium.com/lite/static/js/9865.1496d74a.js"></script><script src="https://cdn-client.medium.com/lite/static/js/main.60c5d8d3.js"></script><script src="https://cdn-client.medium.com/lite/static/js/instrumentation.5bef8967.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/reporting.ff22a7a5.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9120.5df29668.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5049.d1ead72d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4505.6dfaf853.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6618.db187378.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9380.fb176dee.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2707.dc8dbee4.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9977.933c1c9a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8599.68bc318b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3045.1cc3d8cb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6349.3329b100.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2648.26563adf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8393.67b7130d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6428.7d30b23c.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6199.c727247b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5642.7d9f7f3d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6546.e8706ba8.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6834.8aa8d357.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4492.0c3e1a1d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2571.6814b962.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/839.1c286b32.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6128.f8800a13.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2135.2e8dc177.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7975.60bcefe8.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/144.86429b48.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5240.6281357f.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8819.c627c2bf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8204.d0637ed0.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.390e9ec3.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8414.0d800846.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3974.8d3e0217.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2527.18a8996d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostResponsesContent.e1e580cb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/responses.editor.e89462cb.chunk.js"></script><script>window.main();</script><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'9141b572982bcdd9',t:'MTczOTkyMDQxOC4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10