Repository navigation
e2e@0.23.0
Minor Changes
- #1552
d2556bcThanks @okwasniewski! - Breaking:inputValue()on a node with no value, such as a heading or a button, andisChecked()on a node with no checked state throwACTION_FAILED, as in Playwright, instead of returning""andfalse. A field with no value still reads"", and a checkable role with no state reported still readsfalse.uncheck()on an ARIArole="radio"now clicks it, as in Playwright; a native radio still refuses.
Patch Changes
-
#1524
cba5e0eThanks @okwasniewski! - The built-in agent can resize the viewport with the newresize_viewporttool, soagent.actande2e explorecan check layouts at desktop, tablet, and phone widths. The tool is offered when the target's engine implements the new optionalsession.resizehook. Custom executors callctx.actions.resize({ width, height }), and the replay cache records and replays it. -
#1479
d15a98eThanks @okwasniewski! -app.baseUrlno longer ends in a slash, so${app.baseUrl}/api/usersrequests/api/usersinstead of//api/users. Withtestfrom@e2e-dev/web,app.baseUrlis typedstring, since aweb()target always declaresapp.url. A test that relied on the trailing slash, such as${app.baseUrl}api/usersornew URL('users', app.baseUrl)on a URL with a path, adds the slash itself. -
#1491
108bc60Thanks @okwasniewski! - Bump @agentclientprotocol/sdk to 2.2.0, @ai-sdk/provider to 4.0.35, and oxc to 0.156.0. -
#1516
0410fc9Thanks @okwasniewski! - Bump agent-device to 0.21.36, @agentclientprotocol/sdk to 2.4.0, @vitest/expect to 5.1.0, and oxc to 0.157.0. -
#1573
3d5f4eaThanks @okwasniewski! - Bump @ai-sdk/provider to 4.0.36. -
#1451
b4dd4bdThanks @amoscicki! - The run summary'sCacheline counts the steps of passing and flaky tests whose recording was not saved (step.cache.writeofunconfirmed,no-change, ornot-writtenin the attempt that passed), such as4 missed · 1 not saved. -
#1493
91bd614Thanks @okwasniewski! - Adde2e doctor: checks thate2e runcan start without starting anything. It covers the Node.js runtime, the config and its targets, each engine's own checks, and the model each agent resolved to.--jsonprints thedoctor-1report for a host,--check-modelcalls each model once, and the command exits 2 when a check failed. Engines can report their checks through the new optionaldoctorhook. -
#1575
7d7d0e1Thanks @kacperkapusciak! -e2e initande2e --helpshow the new e2e logo, its six rows of bars drawn in full blocks, one row per bar. Ine2e initthe logo shades in from ░ to █, top rows first, in about half a second. The logo needs a terminal at least 52 columns wide, and prints without motion on one shorter than 7 rows. -
#1478
2208056Thanks @okwasniewski! -CONFIG_NOT_FOUNDfor an explicit config path (--config <path>, the MCPopen_sessionconfiginput, oropenHost({ config: '<path>' })) now names the absolute path it checked and, for a relative path, the working directory it resolved against. -
#1572
0c04696Thanks @okwasniewski! - Documentation links in CLI help,e2e initoutput, and the MCP server listing now point to https://e2e.com/docs. -
#1232
3f43eddThanks @okwasniewski! - Add the engine protocol:connectEngine,serveEngine, and transports ine2e/enginerun an engine in another process, on another machine, or in another language over LSP-style JSON-RPC. Every engine built withdefineEnginenow runs through the protocol in process, so the harness drives every engine the same way.Engine.disposenow runs only onceinitwas called, even wheninitfailed. A worker that never initialized no longer disposes its engine. -
#1522
73734c6Thanks @okwasniewski! -e2e exploredigs deeper once the main flows are covered: it returns to them with edge-case inputs, combined filters and sorting, reloads, and other accounts, finishes early only when nothing new is reachable, and checks other screens that offer a control it found broken. -
#1523
f4be1c4Thanks @okwasniewski! -e2e exploreruns longer:--max-stepsgoes up to 100 and--timeoutup to 7200000 (2 hours). -
#1480
723c1afThanks @okwasniewski! - A failed test's block in the terminal and insummary.mdquotes the first 3 errors the app logged (console errors, uncaught exceptions, failed requests, 5xx responses), so an app error behind a locator failure shows without openingtrace.md. -
#1499
1d671f6Thanks @okwasniewski! - The markdown report footer (summary.md, the@e2e-dev/githubpull request comment and job summary) now readsTested by e2e <version> · ..., withe2elinking to https://e2e.com. -
#1464
57f9ed9Thanks @okwasniewski! -locator.waitFor,expecton a locator, andtoHaveScreenshotgive their last read extra time past the timeout, up to their slowest read so far and within the test timeout, so a screen that shows up during a slow last read still passes. -
#1576
33a1541Thanks @kdy1! - Start faster by loading heavy dependencies when a command or session needs them. The CLI no longer loads the MCP server, the prompt library, or the schema library untilmcp,init,login,logout,models,explore,upgrade,doctor, or--watchruns, soe2e --versionand--helptake about 25% less time.@e2e-dev/webimports Playwright when a browser is first launched or looked up, so a process that only reads the config skips it:e2e liston a web project takes about 44% less time, and importing the package half as long. A worker loads Playwright for its first browser instead of before its first test, so that test's reported duration grows by about 0.14 s while the run takes no longer.e2e/runnerno longer loads the explorer when imported.@e2e-dev/acploads the ACP and MCP SDKs when its first session starts, and@e2e-dev/limrunloads@limrun/apiwhen its first device is leased. -
#1434
50d8063Thanks @DeryFerd! - Later agent steps now see a fully replayed step's summary labeledrecorded in an earlier runinstead ofobserved. -
#1482
d94593bThanks @okwasniewski! - Thelistreporter prints each test as it finishes when stdout is not a terminal (piped, redirected, most CI), instead of only once its whole file finishes, and ends every run with aFailedrow per failed test (file:line, the error's first line, the trace page when one was written), soe2e run | tailstill names what broke. -
#1416
79e2e13Thanks @DeryFerd! - Filtered-locator failures can list how many candidates each filter step left, when the post-failure diagnostic pass can read the chain, so a step that narrowed too much or too little names itself. The message says the counts were read then. -
#1520
50fa7afThanks @okwasniewski! -e2e mcphas arun_teststool: it runs a test file, one test (tests/checkout.e2e.ts:12), or the whole suite ase2e rundoes and returns what the run printed, so a coding agent can run tests without a shell.run_tests {files: ["tests/checkout.e2e.ts:12"]} -
#1498
4b56473Thanks @21prnv! - A replay no longer fails its end check on a date written with an ordinal suffix, such asOctober 26thor3rd October, when the day differs from the recording. -
#1571
4c44e44Thanks @kdy1! - The agent compares screenshots with a native SHA-256 instead of a byte-by-byte loop in script, so a settle poll or screen update that carries pixels no longer spends about 8 ms of the event loop per megabyte of image. -
#1493
91bd614Thanks @okwasniewski! - A model call without a response schema that the provider ends on anerrorfinish now fails asMODEL_PROVIDER_FAILEDinstead ofMODEL_OUTPUT_INVALID. -
#1500
7b1b8b2Thanks @bheemreddy-samsara! - Add coordinates toagent.act'sonActionevent: narrow onevent.actionto readpointfortapAtandhoverAt, orfromandtofordragAt, replay included. Points are in the same space asscreen.tapAtandboundingBox(), rounded and clamped to the viewport.ActionEventis now a union keyed byaction, typedActionNameortool:<name>instead ofstring. NewActionNameandActionDetailstypes. -
#1474
d10655fThanks @samanyudas! -e2e runwithout thelistreporter prints each run error on stderr asCODE: message. Before,--reporter junitormarkdownwith a test file that failed to collect, a config that failed to load, or no model for the agent exited 2 and printed nothing. -
#1481
f078364Thanks @okwasniewski! - Thelistsummary names the first 10app.screenshotfiles in aScreenshotsrow, then counts the rest. The MCPscreenshottool takes an optionalpath(a.png, relative to the project root): it saves the masked full-resolution screenshot there and returns the absolute path. -
#1470
b8485baThanks @samanyudas! -run.summary.executednow counts a serial member whose body ran, the same way it counts an ordinary test. Before, it left out a member that calledtest.skip()in its body, and a member that ran in one group attempt before a retry skipped it behind a failed predecessor. The run's telemetry cache tiers count them the same way. -
#1483
0b84d35Thanks @okwasniewski! -open_sessionnow names the app command it started: its executable, the URL it answers on, the port a free-porturlwas assigned, and theenvandinheritEnvnames it got. It prints noargsand noenvvalues. It also says the config reads the MCP server's environment, not the agent's shell.e2e runprints the URL on the app command's setup line, and theappsetup event carries it asurl. -
#1546
a8ed7f7Thanks @okwasniewski! -locator.setInputFiles([])clears a file input and firesinputandchange, as in Playwright. It used to throwINVALID_ARGUMENT. A blank path is still refused. -
#1567
65ebc7dThanks @NathanWalker! - The bundled e2e skill now names NativeScript'stestIDamong the idsgetByTestIdreads on a device. -
#1538
c7cbcefThanks @kacperkapusciak! - The bundled skills declare what they need to run (nodeandnpx, and the optionalAI_GATEWAY_API_KEYfor the e2e skill) inmetadata.openclaw, the frontmatter ClawHub reads. All three are now on ClawHub under@e2e. -
#1547
4dce5a7Thanks @okwasniewski! -tap({ position })measures the offset from inside the node's border, as Playwright'sclick({ position })does. Before, a bordered element shifted the tap by its border width. Engines can report that point as the new optionalSemanticNode.origin. -
#1539
732ea8aThanks @okwasniewski! - Addtest.failto mark a test that is expected to fail:test.fail(title, fn),test.fail(condition, reason)inside a body, or thefailtest option. A marked test that fails with a test failure passes, and the report keeps the reason and the original error underexpectedFailure. A marked test that passes fails withUNEXPECTED_PASS, so a fixed gap gets noticed. Infrastructure errors such asENGINE_FAILUREand blocked agent verdicts are not covered. -
#1505
bdf769bThanks @okwasniewski! - A fixture call that times out names what it waited for:browser.waitForResponse('foo.css')fails withoperation timed out in browser.waitForResponse "foo.css". Steps forwaitForURL,waitForResponse,route, andunrouteshow a string pattern in quotes and a RegExp as its literal. -
#1554
d2953bbThanks @okwasniewski! - A call'stimeout: 0now means no deadline of its own, as in Playwright: locator actions,waitFor, matchers,toHaveScreenshot,expect.poll, contributed fixture calls, andbrowser.goto,waitForResponse, andwaitForDownloadwait until the test timeout (cleanupTimeoutinafterEach) instead of failing at once or being refused. A negative,NaN, or infinitetimeoutisINVALID_ARGUMENTon every call, locator actions included (INVALID_CONFIGonexpect.poll, as before).expect.pollwithtimeout: 0outside a test isINVALID_CONFIG. Engine authors getstepTimeoutfrome2e/engineto give a contributed call'stimeoutoption the same rules. -
#1471
80c2fdaThanks @samanyudas! - A string a test or the config writes toprocess.stdoutorprocess.stderrwith an encoding, such ashex,base64, orlatin1, now prints decoded from a worker, as Node prints it. The runner process decoded onlyhex,base64, andbase64url, and now decodes every encoding Node accepts too. Bytes that end inside a UTF-8 character no longer print after the string written next.