From biloba
Explains the Biloba mental model for writing browser tests with Ginkgo/Gomega: performance via parallelization, stability via pragmatic simulation, conciseness, and the chromedp escape hatch.
How this skill is triggered — by the user, by Claude, or both
Slash command
/biloba:overviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Biloba is a browser-testing framework for Go that builds on [chromedp](https://github.com/chromedp/chromedp) to bring fast, stable, automated browser testing to **Ginkgo** and **Gomega**. It is unapologetically Ginkgo/Gomega-native: you don't `. import` it — you drive everything through a `*biloba.Biloba` value (conventionally `b`).
Biloba is a browser-testing framework for Go that builds on chromedp to bring fast, stable, automated browser testing to Ginkgo and Gomega. It is unapologetically Ginkgo/Gomega-native: you don't . import it — you drive everything through a *biloba.Biloba value (conventionally b).
Read the canonical narrative docs at https://onsi.github.io/biloba/ for the full story; pin to the version you go get'd (the API may shift pre-1.0). This skill is the orientation; the other skills go deep.
1. Performance via parallelization. One shared Chrome process drives one isolated root tab (b) per Ginkgo parallel process, reused between specs via b.Prepare(). The practical upshots:
ginkgo -p. Specs must be independent (Ginkgo's model) — Biloba's per-tab isolation makes that cheap.b is special: never closed, reused spec-to-spec. New tabs (b.NewTab()) and spawned tabs are closed by Prepare(). → biloba:setup.2. Stability via pragmatism. Biloba favors a good-enough simulation run atomically in the browser over a realistic emulation across async round-trips. A click is element.click() after synchronous visibility/enabled checks — no scroll-into-view, no centroid, no occlusion test. The consequences you must internalize:
offsetWidth/offsetHeight. Biloba won't catch an element hidden behind another or off-screen. Use HaveComputedStyle for explicit style assertions.SetValue sets the value and fires input/change — it does not type. Apps wired to real key events (search-as-you-type, rich text, hotkeys) need b.Type/b.SendKeys. → biloba:write-tests.Hover fires pointer/mouse events but does not activate CSS :hover.:hover, cross-origin frames), drop down to chromedp — see the escape hatch below.3. Conciseness via Ginkgo and Gomega.
Eventually/Consistently. This dual immediate/matcher API is the single most important pattern — learn it in biloba:write-tests.console.log streams to the GinkgoWriter; a failing console.assert fails the spec.Biloba deliberately does not hide chromedp. Every tab exposes b.Context (a chromedp context), so anything Biloba doesn't wrap natively you can do directly:
chromedp.Run(b.Context, chromedp.ActionFunc(func(ctx context.Context) error {
return emulation.SetGeolocationOverride().WithLatitude(48.8584).WithLongitude(2.2945).Do(ctx)
}))
Reach for it for geolocation, cross-origin frames, real :hover, or any CDP feature without a native wrapper.
chrome-headless-shell, bootstrap variations) → biloba:setupbiloba:write-testsbiloba:xpathbiloba:apibiloba:explore-unfamiliar-pagebiloba:debug-failuresnpx claudepluginhub onsi/biloba --plugin bilobaWrites and reviews Biloba browser tests using Ginkgo/Gomega, covering the dual immediate/matcher API, element selection (CSS, XPath, text), readiness anchors, request stubbing, and multi-tab flows.
Explains the Ginkgo mental model for writing Go tests: tree construction then running, spec independence, and node taxonomy. Use this first when working with Ginkgo.
Enables robust, stealthy browser automation with Playwright Go, emphasizing context-based architecture, structured logging, and anti-detection for scraping and testing.