Repository navigation
Conversation
Moli (https://github.com/lexmount/moli) is a Rust headless browser with V8 and Stylo, served over CDP. The helper is a thin CDPBrowser subclass like Lightpanda: it self-launches `moli serve` on a free port, or attaches to an explicit endpoint. Moli runs without --layout on purpose: with --layout element geometry is frozen on first read and only a screenshot refreshes it, which breaks waitForVisible/waitForText. Presets pin synthetic input, layout 'real' and no screenshots, since the runtime probe would otherwise pick coordinate input that Moli rejects in this mode. - shared webapi suite: 289 passing, 50 pending; 6 tests skipped with verified reasons (clickXY, upload MIME type, link color) - 19 acceptance scenarios tagged @Moli, including gherkin features - CI workflow pinned to v1.1.17 with SHA256 check - docs: alternative browsers, installation, README, helper reference Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mocha adapter uses Mocha.utils.inherits, removed in mocha 12. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds an experimental
Molihelper driving Moli, a Rust headless browser (V8 + Servo's Stylo) served over CDP. Implemented likeLightpanda: a thinCDPBrowsersubclass that pins presets and manages themoli serveprocess (self-launch on a free port, attach viaendpoint, or courtesy-attach to:9222).Why no
--layoutWith
moli serve --layout, element geometry is a snapshot frozen on first read. After a DOM change (adisplaytoggle, a newly appended node) boxes stay 0×0 untilPage.captureScreenshotrebuilds the layout. That brokewaitForVisibleandwaitForText(35 webapi failures). Default mode uses placeholder boxes that followdisplayandvisibilitylive, so visibility checks work and only 6 tests need skipping.The runtime layout probe reports
real, because Stylo computes styles, and would pick CDP coordinate input, which Moli rejects without layout. So the helper pins the presets:input: 'synthetic',capabilities.layout: 'real',capabilities.screenshot: false.Changes
lib/helper/Moli.jsand the generateddocs/helpers/Moli.mdtest/helper/CDPBrowser_moli_test.js(shared webapi suite + spawn lifecycle)test/helper/webapi.js: Moli skips with verified reasons:clickXY×3: no coordinate input without layoutattachFile×2:DOM.setFileInputFilesgives the file an emptytype, so it posts asapplication/octet-streamseeCssPropertiesOnElements: links computecolor: rgb(0, 0, 0)test/acceptance/codecept.Moli.js;@Moliadded to the@Lightpandascenarios and to 4 gherkin features.github/workflows/moli.yml: v1.1.17 pinned with a SHA256 checkSTANDARD_ACTING_HELPERS, Decision/pause messages,Bunoshfile.js,typings/fixDefFiles.js, npm scripttest:unit:webbapi:molialternative-browsers.md,installation.md, READMELocal results
Versions are the CI-pinned ones (Lightpanda 1.0.0, Obscura 0.2.2, Chrome 144 headless). The iteration loop fills and submits a form, ticks a checkbox, selects an option, clicks a link and reads text; 3 rounds of 30 iterations each.
🤖 Generated with Claude Code