https://github.com/zikani03/basi
A low-code tool for interacting with Playwright for UI tests and browser automation
https://github.com/zikani03/basi
integration-testing low-code pact playwright ui-automation
Last synced: 8 months ago
JSON representation
A low-code tool for interacting with Playwright for UI tests and browser automation
- Host: GitHub
- URL: https://github.com/zikani03/basi
- Owner: zikani03
- License: apache-2.0
- Created: 2025-05-06T06:22:57.000Z (12 months ago)
- Default Branch: main
- Last Pushed: 2025-07-31T04:58:46.000Z (9 months ago)
- Last Synced: 2025-07-31T05:18:45.310Z (9 months ago)
- Topics: integration-testing, low-code, pact, playwright, ui-automation
- Language: Go
- Homepage:
- Size: 75.2 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# basi
`basi` allow users and developers to author and run Playwright actions using a simple
configuration file with less code. Browser automation steps are written in `.basi` files.
The goal is for the .basi file DSL to be simple enough to hand over to non-technical users.
> NOTE: `basi` is still in very early development. There are no guarantees about API or feature stability.
## Installation
Download a binary from the [GitHub Releases](https://github.com/zikani03/basi/releases) and place it on your $PATH.
> NOTE: `basi` depends on Playwright and needs to download some
> browsers and tools if playwright if it is not already installed.
> You will notice this the first time you run the test/files
If you want to contribute or build from the source code see the [Building](#building) section
Once installed you can then run it :
```sh
$ basi --help
```
## Example usage
Create a file named `example-hn.basi` file with the following content:
```
Goto "https://news.ycombinator.com/login"
Fill "input[name=acct]" "throwaway-username"
Fill "input[name=pw]" "fakepassword"
Click "input[value=login]"
Screenshot "body" "./test-screenshot.png"
```
You can now run the file using basi, like so:
```sh
$ basi run example-hn.basi
```
**You can use `Find` to select an element to run assertions on it**
```
Goto "https://github.com/"
Find "Build and ship software on a single, collaborative platform"
ExpectId "hero-section-brand-heading"
Screenshot "body" "./data/test-github.png"
```
**You can setup metadata/configuration for each run in a `frontmatter` section**
```
ID : "A random ID to identify the run"
URL : "https://nndi.cloud/"
Title : "Navigate to home on nndi"
Headless : "yes"
Description : "Navigates to the NNDI website and clicks the Home link"
---
Goto "/"
Click "#navbar > ul > li.active > a"
ExpectAttr "data-nav-section" "home"
Screenshot "body" "./test-nndi.png"
```
## Available actions
|Action|Arguments|Example|
|------|---------|-------|
|Click |**querySelector**| Click "#element" |
|DoubleClick |**querySelector**| DoubleClick "#element" |
|Tap |**querySelector**| Tap "#element" |
|Focus |**querySelector**| Focus "#element" |
|Blur |**querySelector**| Blur "#element" |
|Fill |**querySelector** TEXT| Fill "#element" "my input text" |
|Find |**textContent or querySelector**| Find "My Account" |
|Clear |**querySelector**| Clear "#element" |
|Check |**querySelector**| Check "#element" |
|Uncheck |**querySelector**| Uncheck "#element" |
|FillCheckbox |**querySelector**| FillCheckbox "#element" |
|Press |**querySelector** TEXT| Press "#element" "some text"|
|PressSequentially |**querySelector** TEXT | PressSequentially "#element" "some input"|
|Type |**querySelector** TEXT | Type "#element" |
|Screenshot |**querySelector** TEXT | Screenshot "#selector" "filename.png"|
|Select |**querySelector** TEXT | Select "#someSelect" "Value or Label"|
|SelectOption |**querySelector** TEXT | Select "#someSelect" "Value or Label"|
|SelectMultipleOptions |**querySelector** TEXT | SelectMultipleOptions "#someSelect" "Value or Label 1,Value or Label 2,..., Value or Label N"|
|WaitFor |**querySelector**| WaitFor "#element" |
|WaitForSelector |**querySelector**| WaitForSelector "#element" |
|Goto |**REGEX**| Goto "^some-page" |
|WaitForURL |**REGEX**| WaitForURL "^some-page" |
|GoBack |N/A| GoBack |
|GoForward |N/A| GoForward |
|Refresh |N/A| Refresh |
## Expects
`basi` implements most of [Playwright's Assertions](https://playwright.dev/docs/test-assertions) via Expect actions. The following Expect actions are currently supported
|Action|Arguments|Example|
|------|---------|-------|
|ExpectText| **argument** | ExpectText "Click Here" |
|ExpectAttr| **attributeName** **argument** | ExpectAttr "name" "some-name" |
|ExpectAttribute| **argument** | ExpectAttribute "name" "some-name" |
|ExpectValue| **argument** | ExpectValue "something" |
|ExpectValues| **argument** | ExpectValues "something,something" |
|ExpectAttached| None | ExpectAttached |
|ExpectChecked| None | ExpectChecked |
|ExpectDisabled| None ExpectDisabled |
|ExpectEditable| None | ExpectEditable |
|ExpectEmpty| None | ExpectEmpty |
|ExpectEnabled| None | ExpectEnabled |
|ExpectFocused| None | ExpectFocused |
|ExpectHidden| None| ExpectHidden |
|ExpectInViewport| None | ExpectInViewport |
|ExpectVisible| None| ExpectVisible |
|ExpectToContainClass| **argument** | ExpectToContainClass "class-name" |
|ExpectToContainText| **argument** | ExpectToContainText "something" |
|ExpectAccessibleDescription| **argument** | ExpectAccessibleDescription "description" |
|ExpectAccessibleErrorMessage| **argument** | ExpectAccessibleErrorMessage "An error message" |
|ExpectAccessibleName| **argument** | ExpectAccessibleName "An accessible name" |
|ExpectClass| **className** | ExpectClass "a-class-name" |
|ExpectCSS| **css-property** **argument** | ExpectCSS "display" "flex" |
|ExpectId| **argument** | ExpectId "an-id" |
## Building
```sh
$ git clone https://github.com/zikani03/basi
$ cd basi
$ go build -o basi ./cmd/main.go
$ ./basi --help
# Test with the example file in the repo
$ ./basi run example-hn.basi --url "https://news.ycombinator.com"
```
## LICENSE
Apache 2.0 LICENSE