-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_recorder.py
More file actions
160 lines (119 loc) · 5.13 KB
/
test_recorder.py
File metadata and controls
160 lines (119 loc) · 5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
"""
Tests for recorder functionality
"""
import pytest
import tempfile
import os
from sentience import SentienceBrowser, record, Trace, TraceStep
from sentience.recorder import Recorder
def test_recorder_start_stop():
"""Test recorder can start and stop"""
with SentienceBrowser() as browser:
browser.page.goto("https://example.com")
browser.page.wait_for_load_state("networkidle")
rec = record(browser)
rec.start()
assert rec._active is True
assert rec.trace is not None
rec.stop()
assert rec._active is False
def test_recorder_context_manager():
"""Test recorder as context manager"""
with SentienceBrowser() as browser:
browser.page.goto("https://example.com")
browser.page.wait_for_load_state("networkidle")
with record(browser) as rec:
assert rec._active is True
assert rec.trace is not None
assert rec._active is False
def test_recorder_navigation():
"""Test recording navigation events"""
with SentienceBrowser() as browser:
browser.page.goto("https://example.com")
browser.page.wait_for_load_state("networkidle")
with record(browser) as rec:
rec.record_navigation("https://example.com/page2")
assert len(rec.trace.steps) == 1
assert rec.trace.steps[0].type == "navigation"
assert rec.trace.steps[0].url == "https://example.com/page2"
def test_recorder_click():
"""Test recording click events"""
with SentienceBrowser() as browser:
browser.page.goto("https://example.com")
browser.page.wait_for_load_state("networkidle")
with record(browser) as rec:
rec.record_click(42, "role=button text~'Click'")
assert len(rec.trace.steps) == 1
assert rec.trace.steps[0].type == "click"
assert rec.trace.steps[0].element_id == 42
assert rec.trace.steps[0].selector == "role=button text~'Click'"
def test_recorder_type():
"""Test recording type events"""
with SentienceBrowser() as browser:
browser.page.goto("https://example.com")
browser.page.wait_for_load_state("networkidle")
with record(browser) as rec:
rec.record_type(10, "hello world", "role=textbox")
assert len(rec.trace.steps) == 1
assert rec.trace.steps[0].type == "type"
assert rec.trace.steps[0].element_id == 10
assert rec.trace.steps[0].text == "hello world"
assert rec.trace.steps[0].selector == "role=textbox"
def test_recorder_type_masking():
"""Test text masking in type events"""
with SentienceBrowser() as browser:
browser.page.goto("https://example.com")
browser.page.wait_for_load_state("networkidle")
with record(browser) as rec:
rec.add_mask_pattern("password")
rec.record_type(10, "mypassword123", "role=textbox")
assert len(rec.trace.steps) == 1
assert rec.trace.steps[0].text == "***" # Should be masked
def test_recorder_press():
"""Test recording key press events"""
with SentienceBrowser() as browser:
browser.page.goto("https://example.com")
browser.page.wait_for_load_state("networkidle")
with record(browser) as rec:
rec.record_press("Enter")
assert len(rec.trace.steps) == 1
assert rec.trace.steps[0].type == "press"
assert rec.trace.steps[0].key == "Enter"
def test_trace_save_load():
"""Test trace save and load"""
with SentienceBrowser() as browser:
browser.page.goto("https://example.com")
browser.page.wait_for_load_state("networkidle")
with record(browser) as rec:
rec.record_navigation("https://example.com")
rec.record_click(1, "role=button")
rec.record_type(2, "text", "role=textbox")
# Save trace
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
temp_path = f.name
try:
rec.save(temp_path)
assert os.path.exists(temp_path)
# Load trace
loaded_trace = Trace.load(temp_path)
assert loaded_trace.version == "1.0.0"
assert len(loaded_trace.steps) == 3
assert loaded_trace.steps[0].type == "navigation"
assert loaded_trace.steps[1].type == "click"
assert loaded_trace.steps[2].type == "type"
finally:
os.unlink(temp_path)
def test_trace_format():
"""Test trace format matches spec"""
with SentienceBrowser() as browser:
browser.page.goto("https://example.com")
browser.page.wait_for_load_state("networkidle")
with record(browser) as rec:
rec.record_click(1)
trace_dict = rec.trace.steps[0].to_dict()
# Verify required fields
assert "ts" in trace_dict
assert "type" in trace_dict
assert trace_dict["type"] == "click"
assert "element_id" in trace_dict
assert trace_dict["element_id"] == 1