PageSourceSearch

https://webdriver.io/assets/js/81610004.37e8543a.js

js webdriver.io collected 2026-09-24 08:34:03 UTC 9,135 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[15921],{22002:(e,t,r)=>{r.d(t,{R:()=>d,x:()=>o});var s=r(7378);const n={},i=s.createContext(n);function d(e){const t=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),s.createElement(i.Provider,{value:t},e.children)}},83856:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>d,metadata:()=>s,toc:()=>a});const s=JSON.parse('{"id":"devtools/cross-framework","title":"Cross-Framework Support","description":"The trace format and the show-trace player are identical across WebdriverIO / Selenium / Nightwatch; this page shows where capture completeness differs. For the full trace-mode reference, see Trace Mode.","source":"@site/docs/devtools/CrossFrameworkSupport.md","sourceDirName":"devtools","slug":"/devtools/cross-framework","permalink":"/docs/devtools/cross-framework","draft":false,"unlisted":false,"editUrl":"https://github.com/webdriverio/webdriverio/edit/main/website/docs/devtools/CrossFrameworkSupport.md","tags":[],"version":"current","frontMatter":{"id":"cross-framework","title":"Cross-Framework Support"},"sidebar":"docs","previous":{"title":"Allure Integration","permalink":"/docs/devtools/allure"},"next":{"title":"Trace Mode Limitations","permalink":"/docs/devtools/limitations"}}');var n=r(86106),i=r(22002);const d={id:"cross-framework",title:"Cross-Framework Support"},o=void 0,c={},a=[];function l(e){const t={a:"a",code:"code",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["The trace format and the ",(0,n.jsx)(t.code,{children:"show-trace"})," player are identical across WebdriverIO / Selenium / Nightwatch; this page shows where capture completeness differs. For the full trace-mode reference, see ",(0,n.jsx)(t.a,{href:"/docs/devtools/wdio/trace-mode",children:"Trace Mode"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["The transforms that build a trace live in ",(0,n.jsx)(t.a,{href:"https://github.com/webdriverio/devtools/tree/main/packages/trace",children:(0,n.jsx)(t.code,{children:"@wdio/devtools-trace"})}),", one layer below the adapters, so the ",(0,n.jsxs)(t.strong,{children:["trace format and the ",(0,n.jsx)(t.code,{children:"show-trace"})," player are identical for every adapter"]})," \u2014 the same ",(0,n.jsx)(t.code,{children:".zip"})," (or directory) opens in the same player regardless of which produced it. The three adapters below additionally share the core options (",(0,n.jsx)(t.code,{children:"mode"}),", ",(0,n.jsx)(t.code,{children:"traceGranularity"}),", ",(0,n.jsx)(t.code,{children:"tracePolicy"}),", ",(0,n.jsx)(t.code,{children:"traceFormat"}),", ",(0,n.jsx)(t.code,{children:"filmstrip"}),", ",(0,n.jsx)(t.code,{children:"emitArtifactsManifest"}),", ",(0,n.jsx)(t.code,{children:"captureAssertions"}),")."]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Capture completeness varies by adapter"}),", though \u2014 WebdriverIO is the most complete; Selenium and Nightwatch cover the core flow with the gaps noted below. Framework-specific enable syntax lives on each adapter page \u2014 see ",(0,n.jsx)(t.a,{href:"/docs/devtools/selenium#trace-mode",children:"Selenium"})," and ",(0,n.jsx)(t.a,{href:"/docs/devtools/nightwatch#trace-mode",children:"Nightwatch"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["The Python adapter (see the ",(0,n.jsx)(t.strong,{children:"Python"})," tabs on the ",(0,n.jsx)(t.a,{href:"/docs/devtools/selenium",children:"Selenium"})," page) writes the same archive and opens in the same player, but is not in this table: it runs no JavaScript in the test process, so the backend builds its trace from the captured stream instead of the adapter building it in-process. Granularity and retention do have Python equivalents \u2014 ",(0,n.jsx)(t.code,{children:"--devtools-trace-granularity session|test"})," and ",(0,n.jsx)(t.code,{children:"--devtools-trace-policy"}),", the latter with its retry-aware values degrading to ",(0,n.jsx)(t.code,{children:"retain-on-failure"}
1)," because nothing on that wire carries an attempt number. The rows with no Python equivalent are the per-test-artifact ones: ",(0,n.jsx)(t.code,{children:"screenshot"}),", ",(0,n.jsx)(t.code,{children:"video"})," and inline Allure attach. What it does capture - DOM time-travel, the dense filmstrip, the A11y tree and element overlay, commands, console, network, assertions, run controls and Preserve & Rerun - is on its own page."]}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Capability"}),(0,n.jsx)(t.th,{children:"WebdriverIO"}),(0,n.jsx)(t.th,{children:"Selenium"}),(0,n.jsx)(t.th,{children:"Nightwatch"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsxs)(t.td,{children:["Trace mode + ",(0,n.jsx)(t.code,{children:"show-trace"})," player"]}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"\u2705"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"DOM time-travel (mutation capture)"}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"\u2705 \xb9"}),(0,n.jsx)(t.td,{children:"\u2705"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"A11y tab + pick-locator overlay (trace player)"}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"\u2705"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Transcript + Copy-for-LLM"}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"\u2705"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsxs)(t.td,{children:["Per-test ",(0,n.jsx)(t.code,{children:"screenshot"})," / ",(0,n.jsx)(t.code,{children:"video"})]}),(0,n.jsx)(t.td,{children:"\u2705 inline Allure"}),(0,n.jsx)(t.td,{children:"\u2705 inline Allure"}),(0,n.jsx)(t.td,{children:"\u26a0\ufe0f produce-only \xb2"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsxs)(t.td,{children:[(0,n.jsx)(t.code,{children:"emitArtifactsManifest"})," auto-detect"]}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"\u26a0\ufe0f opt-in only"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsxs)(t.td,{children:["Retry-aware ",(0,n.jsx)(t.code,{children:"tracePolicy"})]}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsxs)(t.td,{children:["\u26a0\ufe0f ",(0,n.jsx)(t.code,{children:"retain-on-failure"})," only \xb3"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:(0,n.jsx)(t.code,{children:"traceGranularity: 'test'"})}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsxs)(t.td,{children:["\u26a0\ufe0f Cucumber / exports-object; BDD ",(0,n.jsx)(t.code,{children:"describe/it"})," collapses to a session slice"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Cucumber Feature\u2192Scenario\u2192Step nesting"}),(0,n.jsx)(t.td,{children:"Scenario\u2192Step \u2074"}),(0,n.jsx)(t.td,{children:"\u2705 full"}),(0,n.jsx)(t.td,{children:"Feature\u2192Scenario \u2075"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"BiDi capture (console / network / exceptions)"}),(0,n.jsx)(t.td,{children:"\u2705 auto"}),(0,n.jsx)(t.td,{children:"\u2705 auto"}),(0,n.jsxs)(t.td,{children:["\u26a0\ufe0f opt-in (",(0,n.jsx)(t.code,{children:"bidi: true"})," + ",(0,n.jsx)(t.code,{children:"webSocketUrl"}),")"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Screencast (filmstrip / video)"}),(0,n.jsx)(t.td,{children:"CDP push"}),(0,n.jsx)(t.td,{children:"CDP push"}),(0,n.jsx)(t.td,{children:"polling only"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Live-dashboard A11y tab + overlay"}),(0,n.jsx)(t.td,{children:"\u2705"}),(0,n.jsx)(t.td,{children:"trace player only"}),(0,n.jsx)(t.td,{children:"trace player only"})]})]})]}),"\n",(0,n.jsxs)(t.p,{children:["\xb9 Selenium reconstructs the DOM per navigation; anchor timing is approximate (a navigation's snapshot can lag the command that triggered it).\n\xb2 Nightwatch has no live Allure attach API, so per-test artifacts are written to the trace output dir and listed in the manifest, but not attached to an Allure test.\n\xb3 Nightwatch's ",(0,n.jsx)(t.code,{children:"--retries"})," re-runs a test internally without re-firing the plugin's per-test hooks, so the retry-aware policies (",(0,n.jsx)(t.code,{children:"on-first-retry"}),", ",(0,n.jsx)(t.code,{children:"retain-on-first-failure"}),", \u2026) degrade to ",(0,n.jsx)(t.code,{children:"retain-on-failure"}),".\n\u2074 WebdriverIO does not yet carry feature-level ancestry, so its Cucumber nesting is Scenario\u2192Step.\n\u2075 Nightwatch does not yet stamp per-step nesting (Feature\u2192Scenario only)."]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.