177 lines
5.1 KiB
Go
177 lines
5.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"git.teamworkapps.com/shortcut/cremote/client"
|
|
)
|
|
|
|
func main() {
|
|
fmt.Println("=== Cremote Accessibility Tree Test ===")
|
|
fmt.Println()
|
|
|
|
// Create client
|
|
c := client.NewClient("localhost", 8989)
|
|
|
|
// Check if daemon is running
|
|
fmt.Println("Checking daemon status...")
|
|
running, err := c.CheckStatus()
|
|
if err != nil || !running {
|
|
log.Fatalf("Daemon is not running or not accessible: %v", err)
|
|
}
|
|
fmt.Println("✓ Daemon is running")
|
|
|
|
// Open a new tab
|
|
fmt.Println("Opening new tab...")
|
|
tabID, err := c.OpenTab(5)
|
|
if err != nil {
|
|
log.Fatalf("Failed to open tab: %v", err)
|
|
}
|
|
fmt.Printf("✓ Opened tab: %s\n", tabID)
|
|
|
|
// Navigate to a test page with accessibility content
|
|
fmt.Println("Navigating to test page...")
|
|
testURL := "https://brokedown.net/formtest.php"
|
|
err = c.LoadURL(tabID, testURL, 10)
|
|
if err != nil {
|
|
log.Fatalf("Failed to load URL: %v", err)
|
|
}
|
|
fmt.Printf("✓ Loaded: %s\n", testURL)
|
|
|
|
// Wait for page to fully load
|
|
time.Sleep(2 * time.Second)
|
|
|
|
// Test 1: Get full accessibility tree
|
|
fmt.Println("\n--- Test 1: Full Accessibility Tree ---")
|
|
fullTree, err := c.GetAccessibilityTree(tabID, nil, 10)
|
|
if err != nil {
|
|
log.Printf("❌ Failed to get full accessibility tree: %v", err)
|
|
} else {
|
|
fmt.Printf("✓ Retrieved full accessibility tree with %d nodes\n", len(fullTree.Nodes))
|
|
|
|
// Print first few nodes for inspection
|
|
fmt.Println("First 3 nodes:")
|
|
for i, node := range fullTree.Nodes {
|
|
if i >= 3 {
|
|
break
|
|
}
|
|
fmt.Printf(" Node %d: ID=%s, Role=%s, Name=%s, Ignored=%v\n",
|
|
i+1, node.NodeID, getRoleValue(node.Role), getNameValue(node.Name), node.Ignored)
|
|
}
|
|
}
|
|
|
|
// Test 2: Get accessibility tree with limited depth
|
|
fmt.Println("\n--- Test 2: Limited Depth Accessibility Tree ---")
|
|
depth := 2
|
|
limitedTree, err := c.GetAccessibilityTree(tabID, &depth, 10)
|
|
if err != nil {
|
|
log.Printf("❌ Failed to get limited depth accessibility tree: %v", err)
|
|
} else {
|
|
fmt.Printf("✓ Retrieved accessibility tree (depth=%d) with %d nodes\n", depth, len(limitedTree.Nodes))
|
|
}
|
|
|
|
// Test 3: Get partial accessibility tree for a specific element
|
|
fmt.Println("\n--- Test 3: Partial Accessibility Tree ---")
|
|
selector := "form"
|
|
partialTree, err := c.GetPartialAccessibilityTree(tabID, selector, true, 10)
|
|
if err != nil {
|
|
log.Printf("❌ Failed to get partial accessibility tree: %v", err)
|
|
} else {
|
|
fmt.Printf("✓ Retrieved partial accessibility tree for '%s' with %d nodes\n", selector, len(partialTree.Nodes))
|
|
|
|
// Print details of found nodes
|
|
fmt.Println("Form-related accessibility nodes:")
|
|
for i, node := range partialTree.Nodes {
|
|
if i >= 5 { // Limit output
|
|
break
|
|
}
|
|
fmt.Printf(" Node %d: Role=%s, Name=%s, BackendNodeID=%d\n",
|
|
i+1, getRoleValue(node.Role), getNameValue(node.Name), node.BackendDOMNodeID)
|
|
}
|
|
}
|
|
|
|
// Test 4: Query accessibility tree by role
|
|
fmt.Println("\n--- Test 4: Query by Role ---")
|
|
roleQuery, err := c.QueryAccessibilityTree(tabID, "", "", "textbox", 10)
|
|
if err != nil {
|
|
log.Printf("❌ Failed to query accessibility tree by role: %v", err)
|
|
} else {
|
|
fmt.Printf("✓ Found %d textbox elements\n", len(roleQuery.Nodes))
|
|
|
|
for i, node := range roleQuery.Nodes {
|
|
if i >= 3 { // Limit output
|
|
break
|
|
}
|
|
fmt.Printf(" Textbox %d: Name=%s, Value=%s\n",
|
|
i+1, getNameValue(node.Name), getValueValue(node.Value))
|
|
}
|
|
}
|
|
|
|
// Test 5: Query accessibility tree by accessible name
|
|
fmt.Println("\n--- Test 5: Query by Accessible Name ---")
|
|
nameQuery, err := c.QueryAccessibilityTree(tabID, "", "Submit", "", 10)
|
|
if err != nil {
|
|
log.Printf("❌ Failed to query accessibility tree by name: %v", err)
|
|
} else {
|
|
fmt.Printf("✓ Found %d elements with accessible name 'Submit'\n", len(nameQuery.Nodes))
|
|
|
|
for i, node := range nameQuery.Nodes {
|
|
fmt.Printf(" Element %d: Role=%s, Name=%s\n",
|
|
i+1, getRoleValue(node.Role), getNameValue(node.Name))
|
|
}
|
|
}
|
|
|
|
// Test 6: Query with selector scope
|
|
fmt.Println("\n--- Test 6: Query with Selector Scope ---")
|
|
scopedQuery, err := c.QueryAccessibilityTree(tabID, "form", "", "button", 10)
|
|
if err != nil {
|
|
log.Printf("❌ Failed to query accessibility tree with selector scope: %v", err)
|
|
} else {
|
|
fmt.Printf("✓ Found %d button elements within form\n", len(scopedQuery.Nodes))
|
|
}
|
|
|
|
// Clean up
|
|
fmt.Println("\n--- Cleanup ---")
|
|
err = c.CloseTab(tabID, 5)
|
|
if err != nil {
|
|
log.Printf("❌ Failed to close tab: %v", err)
|
|
} else {
|
|
fmt.Println("✓ Tab closed")
|
|
}
|
|
|
|
fmt.Println("\n=== Accessibility Tree Test Completed ===")
|
|
}
|
|
|
|
// Helper functions to extract values from AXValue structs
|
|
func getRoleValue(axValue *client.AXValue) string {
|
|
if axValue == nil || axValue.Value == nil {
|
|
return "unknown"
|
|
}
|
|
if str, ok := axValue.Value.(string); ok {
|
|
return str
|
|
}
|
|
return fmt.Sprintf("%v", axValue.Value)
|
|
}
|
|
|
|
func getNameValue(axValue *client.AXValue) string {
|
|
if axValue == nil || axValue.Value == nil {
|
|
return ""
|
|
}
|
|
if str, ok := axValue.Value.(string); ok {
|
|
return str
|
|
}
|
|
return fmt.Sprintf("%v", axValue.Value)
|
|
}
|
|
|
|
func getValueValue(axValue *client.AXValue) string {
|
|
if axValue == nil || axValue.Value == nil {
|
|
return ""
|
|
}
|
|
if str, ok := axValue.Value.(string); ok {
|
|
return str
|
|
}
|
|
return fmt.Sprintf("%v", axValue.Value)
|
|
}
|