orchardcore-tester
OrchardCore testing tool using browser automation to verify features, admin panels, and content management.
Install
mkdir -p .claude/skills/orchardcore-tester && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/6828" && unzip -o skill.zip -d .claude/skills/orchardcore-tester && rm skill.zipInstalls to .claude/skills/orchardcore-tester
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Tests OrchardCore CMS features through browser automation. Use when the user needs to build, run, setup, or test OrchardCore functionality including admin features, content management, media library, and module testing.Key capabilities
- →Build OrchardCore CMS
- →Automate site setup
- →Test admin panel workflows
- →Verify media library operations
- →Run functional tests
How it works
The skill automates the build, background execution, and browser-based testing of OrchardCore using Playwright and environment-based setup configurations.
Inputs & outputs
When to use orchardcore-tester
- →Test OrchardCore admin panel workflows
- →Verify content management feature stability
- →Automate media library upload tests
- →Run functional tests for custom OrchardCore modules
About this skill
OrchardCore Feature Testing
This skill guides you through testing OrchardCore CMS features using browser automation with playwright-cli.
Prerequisites
- OrchardCore repository (working directory)
- .NET SDK 10.0+ installed
playwright-cliskill available, with a browser engine installed. On macOS (or any machine without Chrome) use webkit:
Then passplaywright-cli --browser webkit install--browser webkiton the firstopenof a session. Seereferences/playwright-cli.md.
The examples below show PowerShell and bash. The repo targets macOS/.NET 10; bash works everywhere. Use whichever matches your shell.
Core Workflow
Testing an OrchardCore feature follows these steps:
- Build the application
- Run the application server (background)
- Setup a test site (AutoSetup is the recommended unattended path)
- Test the feature via browser
- Verify results and clean up
TL;DR (fastest reliable path)
# 1. build
dotnet build src/OrchardCore.Cms.Web -c Debug -f net10.0
# 2. fresh state + pick a port
rm -rf src/OrchardCore.Cms.Web/App_Data
PORT=$(( (RANDOM % 1000) + 5000 )); echo -n $PORT > .orchardcore-port
# 3. run with AutoSetup (provisions Default tenant on first request, no wizard)
cd src/OrchardCore.Cms.Web
OrchardCore__OrchardCore_AutoSetup__AutoSetupPath= \
OrchardCore__OrchardCore_AutoSetup__Tenants__0__ShellName=Default \
OrchardCore__OrchardCore_AutoSetup__Tenants__0__SiteName=TestSite \
OrchardCore__OrchardCore_AutoSetup__Tenants__0__SiteTimeZone=America/Los_Angeles \
OrchardCore__OrchardCore_AutoSetup__Tenants__0__AdminUsername=admin \
OrchardCore__OrchardCore_AutoSetup__Tenants__0__AdminEmail=admin@test.com \
OrchardCore__OrchardCore_AutoSetup__Tenants__0__AdminPassword=Password1! \
OrchardCore__OrchardCore_AutoSetup__Tenants__0__DatabaseProvider=Sqlite \
OrchardCore__OrchardCore_AutoSetup__Tenants__0__RecipeName=Blog \
dotnet run -f net10.0 --no-build --urls "http://localhost:$PORT" > autosetup-console.log 2>&1 &
cd ../..
# 4. trigger + confirm
curl -s -o /dev/null "http://localhost:$PORT/"
grep -m1 "successfully provisioned" src/OrchardCore.Cms.Web/autosetup-console.log
Then log in (see Step 4 — the login password field needs the native-setter
workaround). Full AutoSetup details and gotchas: references/autosetup.md.
Step 1: Build
dotnet build src/OrchardCore.Cms.Web/OrchardCore.Cms.Web.csproj -c Debug -f net10.0
Step 2: Run Application (Background)
Since multiple agents may run OrchardCore from different worktrees simultaneously, use a random port and run in background.
Get or Create Session Port
# Check for existing port file, or generate random port (5000-5999)
$portFile = ".orchardcore-port"
if (Test-Path $portFile) {
$port = Get-Content $portFile
} else {
$port = Get-Random -Minimum 5000 -Maximum 6000
$port | Out-File $portFile -NoNewline
}
Write-Host "Using port: $port"
Start Application in Background
# Start OrchardCore in background process
$proc = Start-Process dotnet `
-ArgumentList "run","-f","net10.0","--no-build","--urls","http://localhost:$port" `
-WorkingDirectory "src/OrchardCore.Cms.Web" `
-PassThru -NoNewWindow
# Save PID for later cleanup
$proc.Id | Out-File ".orchardcore-pid" -NoNewline
Write-Host "Started OrchardCore (PID: $($proc.Id)) on http://localhost:$port"
Wait for Application Ready
# Poll until app responds (max 60 seconds)
$port = Get-Content ".orchardcore-port"
$timeout = 60; $elapsed = 0
while ($elapsed -lt $timeout) {
try {
$response = Invoke-WebRequest -Uri "http://localhost:$port" -UseBasicParsing -TimeoutSec 2
Write-Host "Application ready at http://localhost:$port"
break
} catch {
Start-Sleep -Seconds 2
$elapsed += 2
}
}
Stop Application
# Stop the background process
if (Test-Path ".orchardcore-pid") {
$pid = Get-Content ".orchardcore-pid"
Stop-Process -Id $pid -Force -ErrorAction SilentlyContinue
Remove-Item ".orchardcore-pid" -Force
Write-Host "Stopped OrchardCore (PID: $pid)"
}
# bash: find the process actually listening on the port and kill it.
# (Backgrounding dotnet via a subshell makes $! unreliable, so resolve by port.)
PORT=$(cat .orchardcore-port)
PID=$(lsof -ti tcp:$PORT -sTCP:LISTEN | head -1)
[ -n "$PID" ] && kill "$PID" && echo "Stopped OrchardCore (PID: $PID)"
rm -f .orchardcore-pid
Step 3: Setup Test Site
A fresh App_Data is uninitialized, so the site must be provisioned. There are
two paths.
Option A — AutoSetup (recommended, unattended)
Provision the Default tenant from configuration on first request — no
browser, no wizard. OrchardCore.Cms.Web already wires AutoSetup in
(Program.cs → .AddSetupFeatures("OrchardCore.AutoSetup")); you just supply
env vars when starting the app (see the TL;DR above, or run them inline with
dotnet run from Step 2).
Key rules (full details in references/autosetup.md):
- Prefix is
OrchardCore__OrchardCore_AutoSetup__Tenants__0__<Option>—__is the separator, the single_inOrchardCore_AutoSetupis literal. - No quotes around values in bash inline-env form (quotes become part of the value and corrupt the admin password/email).
SiteTimeZoneis required (e.g.America/Los_Angeles).
Confirm success with the log line:
The AutoSetup successfully provisioned the site 'TestSite'.
grep -m1 "successfully provisioned" src/OrchardCore.Cms.Web/autosetup-console.log
Option B — Interactive setup wizard (browser)
Start the app without AutoSetup env vars, then drive the wizard with
playwright-cli. The plain inputs (Site Name, User Name, Email) fill normally,
but the password and confirmation fields cannot be filled with fill/type
— use the native-setter eval workaround. Full step-by-step:
references/setup-wizard.md. Quick shape:
PORT=$(cat .orchardcore-port)
playwright-cli --browser webkit open "http://localhost:$PORT/"
playwright-cli snapshot
# fill <sitename>, <username>, <email>; pick Blog from the recipe dropdown
# set passwords via native setter (see below / setup-wizard.md), then click Finish Setup
Reset for fresh setup:
rm -rf src/OrchardCore.Cms.Web/App_Data
Remove-Item -Recurse -Force src/OrchardCore.Cms.Web/App_Data
Step 4: Test Features
Important: Replace 5000 with the actual port from .orchardcore-port file.
Login to Admin
The username fills normally, but the login password field
(input[name="LoginForm.Password"]) cannot be filled with fill/type — use
the native-setter eval (same limitation as the setup wizard; see
references/playwright-cli.md).
PORT=$(cat .orchardcore-port)
playwright-cli --browser webkit open "http://localhost:$PORT/Login"
playwright-cli snapshot # get the username/login-button refs
# username: plain fill works
playwright-cli fill <username-ref> "admin"
# password: fill is a no-op here — set it via the native setter + events
playwright-cli eval '((p)=>{var s=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"value").set; s.call(p,"Password1!"); p.dispatchEvent(new Event("input",{bubbles:true})); p.dispatchEvent(new Event("change",{bubbles:true})); return p.value.length})(document.querySelector("input[name=\"LoginForm.Password\"]"))'
# submit, then confirm /Admin loads (does NOT redirect back to /Login)
playwright-cli click <login-button-ref>
playwright-cli open "http://localhost:$PORT/Admin"
playwright-cli eval 'window.location.pathname' # -> "/Admin" when authenticated
The
evalprints a benignresult is not a functionmessage (it returns a number); the value is still set — verify withplaywright-cli eval 'document.querySelector("input[name=\"LoginForm.Password\"]").value'.
Common Test Scenarios
Test Media Library:
playwright-cli open http://localhost:$port/Admin/Media
playwright-cli snapshot
Test Content Creation:
playwright-cli open http://localhost:$port/Admin/Contents/ContentItems
playwright-cli snapshot
# Click New, select content type, fill fields, publish
Enable a Feature:
playwright-cli open http://localhost:$port/Admin/Features
playwright-cli snapshot
# Search for feature, click Enable
See references/common-features.md for detailed workflows.
Step 5: Verify Results
After each action:
# Check page state
playwright-cli snapshot
# Check for JavaScript errors
playwright-cli console error
# Verify page title
playwright-cli eval "document.title"
Debugging with Log Files
Console output is not visible when running in background. Use log files instead:
# View last 50 lines of today's log
Get-Content "src/OrchardCore.Cms.Web/App_Data/logs/orchard-log-$(Get-Date -Format 'yyyy-MM-dd').log" -Tail 50
# Search for errors
Select-String -Path "src/OrchardCore.Cms.Web/App_Data/logs/orchard-log-$(Get-Date -Format 'yyyy-MM-dd').log" -Pattern "ERROR|Exception" -Context 2,5
See references/debugging.md for more debugging techniques.
Quick Reference
| Task | URL Path |
|---|---|
| Admin Dashboard | /Admin |
| Features | /Admin/Features |
| Content Items | /Admin/Contents/ContentItems |
| Media Library | /Admin/Media |
| Users | /Admin/Users/Index |
| Themes | /Admin/Themes |
Session Files
| File | Purpose |
|---|---|
.orchardcore-port | Persisted port number for session |
.orchardcore-pid | Process ID for cleanup |
Default Credentials
- Username: admin
- Email: [email protected]
- Password: Password1!
References
references/autosetup.md- Unattended AutoSetup (env-var recipe, gotchas, troubleshooting)references/playwright-cli.md- playwright-cli specifics: browser insta
Content truncated.
When not to use it
- →Non-OrchardCore applications
- →Manual testing only
Prerequisites
Limitations
- →Requires .NET 10.0+
- →Specific password field input limitations
How it compares
It provides an automated, unattended testing workflow for OrchardCore compared to manual browser-based verification.
Compared to similar skills
orchardcore-tester side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| orchardcore-tester (this skill) | 1 | 6mo | Review | Intermediate |
| makefile-dev-workflow | 0 | 6mo | Review | Beginner |
| fingerprint | 0 | 3mo | Review | Intermediate |
| add-test | 0 | 4mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by OrchardCMS
View all by OrchardCMS →You might also like
makefile-dev-workflow
raphaelmansuy
Unified development workflow for EdgeQuake using Makefile commands. Use when starting services, running tests, or managing the full development stack (database, backend, frontend). Provides simplified alternatives to raw cargo/npm commands.
fingerprint
amentler
Führt den Chord-Recognition-Fingerprint des Repos aus, indem der Statistik-Test für die Akkorderkennung samt TP/TN/FP/FN, Sensitivität, Spezifität, Precision, Accuracy, F1 und Falllisten gestartet wird. Verwenden, wenn der aktuelle Erkennungsstand kompakt und reproduzierbar gemessen werden soll.
add-test
affandar
Add a new integration test to PilotSwarm test suite. Tests verify end-to-end flows through PilotSwarmClient, duroxide orchestration, and the Copilot SDK.
integration-testing
EmanuelAngel
>
interactive-shell
Jonghakseo
dev server, TUI, REPL, DB shell, 로그처럼 사용자 제어나 장시간 실행이 필요한 터미널 작업에 사용한다. AI 작업 위임에는 subagent를 사용한다.
verify
melnicorn
Build, run, and drive Sensify locally to verify changes end-to-end