cbrowser 4.0.5 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.d.ts +70 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +435 -1
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +173 -2
- package/dist/cli.js.map +1 -1
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/browser.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* AI-powered browser automation with constitutional safety.
|
|
5
5
|
*/
|
|
6
6
|
import { type CBrowserConfig } from "./config.js";
|
|
7
|
-
import type { SavedSession, NavigationResult, ClickResult, ExtractResult, JourneyResult, CleanupOptions, CleanupResult, JourneyOptions, NetworkMock, NetworkRequest, PerformanceMetrics, PerformanceAuditResult } from "./types.js";
|
|
7
|
+
import type { SavedSession, NavigationResult, ClickResult, ExtractResult, JourneyResult, CleanupOptions, CleanupResult, JourneyOptions, NetworkMock, NetworkRequest, PerformanceMetrics, PerformanceAuditResult, SmartRetryResult, AssertionResult, SelectorCacheEntry, SelectorCacheStats } from "./types.js";
|
|
8
8
|
export declare class CBrowser {
|
|
9
9
|
private config;
|
|
10
10
|
private paths;
|
|
@@ -139,6 +139,75 @@ export declare class CBrowser {
|
|
|
139
139
|
* Fill a form field.
|
|
140
140
|
*/
|
|
141
141
|
fill(selector: string, value: string): Promise<ClickResult>;
|
|
142
|
+
/**
|
|
143
|
+
* Click with smart retry - automatically retries with alternative selectors on failure.
|
|
144
|
+
*/
|
|
145
|
+
smartClick(selector: string, options?: {
|
|
146
|
+
force?: boolean;
|
|
147
|
+
maxRetries?: number;
|
|
148
|
+
retryDelay?: number;
|
|
149
|
+
}): Promise<SmartRetryResult>;
|
|
150
|
+
/**
|
|
151
|
+
* Find alternative selectors for an element.
|
|
152
|
+
*/
|
|
153
|
+
private findAlternativeSelectors;
|
|
154
|
+
private selectorCache;
|
|
155
|
+
/**
|
|
156
|
+
* Get the selector cache file path.
|
|
157
|
+
*/
|
|
158
|
+
private getSelectorCachePath;
|
|
159
|
+
/**
|
|
160
|
+
* Load the selector cache from disk.
|
|
161
|
+
*/
|
|
162
|
+
private loadSelectorCache;
|
|
163
|
+
/**
|
|
164
|
+
* Save the selector cache to disk.
|
|
165
|
+
*/
|
|
166
|
+
private saveSelectorCache;
|
|
167
|
+
/**
|
|
168
|
+
* Get cache key for a selector (includes domain for context).
|
|
169
|
+
*/
|
|
170
|
+
private getSelectorCacheKey;
|
|
171
|
+
/**
|
|
172
|
+
* Get current page domain.
|
|
173
|
+
*/
|
|
174
|
+
private getCurrentDomain;
|
|
175
|
+
/**
|
|
176
|
+
* Cache a working alternative selector for future use.
|
|
177
|
+
*/
|
|
178
|
+
private cacheAlternativeSelector;
|
|
179
|
+
/**
|
|
180
|
+
* Get a cached alternative selector if available.
|
|
181
|
+
*/
|
|
182
|
+
private getCachedSelector;
|
|
183
|
+
/**
|
|
184
|
+
* Update cache entry statistics.
|
|
185
|
+
*/
|
|
186
|
+
private updateCacheStats;
|
|
187
|
+
/**
|
|
188
|
+
* Get selector cache statistics.
|
|
189
|
+
*/
|
|
190
|
+
getSelectorCacheStats(): SelectorCacheStats;
|
|
191
|
+
/**
|
|
192
|
+
* Clear the selector cache.
|
|
193
|
+
*/
|
|
194
|
+
clearSelectorCache(domain?: string): number;
|
|
195
|
+
/**
|
|
196
|
+
* List all cached selectors.
|
|
197
|
+
*/
|
|
198
|
+
listCachedSelectors(domain?: string): SelectorCacheEntry[];
|
|
199
|
+
/**
|
|
200
|
+
* Analyze a failure and provide AI-powered suggestions.
|
|
201
|
+
*/
|
|
202
|
+
private analyzeFailure;
|
|
203
|
+
/**
|
|
204
|
+
* Assert a condition using natural language.
|
|
205
|
+
*/
|
|
206
|
+
assert(assertion: string): Promise<AssertionResult>;
|
|
207
|
+
/**
|
|
208
|
+
* Evaluate a natural language assertion.
|
|
209
|
+
*/
|
|
210
|
+
private evaluateAssertion;
|
|
142
211
|
/**
|
|
143
212
|
* Find an element using multiple strategies.
|
|
144
213
|
*/
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/browser.js
CHANGED
|
@@ -709,11 +709,445 @@ class CBrowser {
|
|
|
709
709
|
};
|
|
710
710
|
}
|
|
711
711
|
}
|
|
712
|
+
// =========================================================================
|
|
713
|
+
// Tier 5: Smart Retry (v5.0.0)
|
|
714
|
+
// =========================================================================
|
|
715
|
+
/**
|
|
716
|
+
* Click with smart retry - automatically retries with alternative selectors on failure.
|
|
717
|
+
*/
|
|
718
|
+
async smartClick(selector, options = {}) {
|
|
719
|
+
const maxRetries = options.maxRetries ?? 3;
|
|
720
|
+
const retryDelay = options.retryDelay ?? 1000;
|
|
721
|
+
const attempts = [];
|
|
722
|
+
// First attempt with original selector
|
|
723
|
+
let result = await this.click(selector, { force: options.force });
|
|
724
|
+
attempts.push({
|
|
725
|
+
attempt: 1,
|
|
726
|
+
selector,
|
|
727
|
+
success: result.success,
|
|
728
|
+
error: result.success ? undefined : result.message,
|
|
729
|
+
screenshot: result.screenshot,
|
|
730
|
+
});
|
|
731
|
+
if (result.success) {
|
|
732
|
+
return {
|
|
733
|
+
success: true,
|
|
734
|
+
attempts,
|
|
735
|
+
finalSelector: selector,
|
|
736
|
+
message: result.message,
|
|
737
|
+
screenshot: result.screenshot,
|
|
738
|
+
};
|
|
739
|
+
}
|
|
740
|
+
// Try to find alternative selectors
|
|
741
|
+
const alternatives = await this.findAlternativeSelectors(selector);
|
|
742
|
+
for (let i = 0; i < Math.min(maxRetries - 1, alternatives.length); i++) {
|
|
743
|
+
await new Promise(resolve => setTimeout(resolve, retryDelay));
|
|
744
|
+
const alt = alternatives[i];
|
|
745
|
+
result = await this.click(alt.selector, { force: options.force });
|
|
746
|
+
attempts.push({
|
|
747
|
+
attempt: i + 2,
|
|
748
|
+
selector: alt.selector,
|
|
749
|
+
success: result.success,
|
|
750
|
+
error: result.success ? undefined : result.message,
|
|
751
|
+
alternativeUsed: alt.reason,
|
|
752
|
+
screenshot: result.screenshot,
|
|
753
|
+
});
|
|
754
|
+
if (result.success) {
|
|
755
|
+
// Cache the working alternative for future use
|
|
756
|
+
this.cacheAlternativeSelector(selector, alt.selector);
|
|
757
|
+
return {
|
|
758
|
+
success: true,
|
|
759
|
+
attempts,
|
|
760
|
+
finalSelector: alt.selector,
|
|
761
|
+
message: `Clicked using alternative: ${alt.reason}`,
|
|
762
|
+
screenshot: result.screenshot,
|
|
763
|
+
};
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
// All attempts failed - provide AI suggestion
|
|
767
|
+
const aiSuggestion = await this.analyzeFailure(selector, attempts);
|
|
768
|
+
return {
|
|
769
|
+
success: false,
|
|
770
|
+
attempts,
|
|
771
|
+
message: `Failed after ${attempts.length} attempts`,
|
|
772
|
+
screenshot: result.screenshot,
|
|
773
|
+
aiSuggestion,
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
/**
|
|
777
|
+
* Find alternative selectors for an element.
|
|
778
|
+
*/
|
|
779
|
+
async findAlternativeSelectors(originalSelector) {
|
|
780
|
+
const page = await this.getPage();
|
|
781
|
+
const alternatives = [];
|
|
782
|
+
try {
|
|
783
|
+
// Try to find elements with similar text
|
|
784
|
+
const elements = await page.$$('button, a, [role="button"], input[type="submit"]');
|
|
785
|
+
for (const el of elements.slice(0, 10)) {
|
|
786
|
+
const text = await el.textContent().catch(() => "");
|
|
787
|
+
const ariaLabel = await el.getAttribute("aria-label").catch(() => "");
|
|
788
|
+
const title = await el.getAttribute("title").catch(() => "");
|
|
789
|
+
const id = await el.getAttribute("id").catch(() => "");
|
|
790
|
+
const className = await el.getAttribute("class").catch(() => "");
|
|
791
|
+
// Check if text matches original selector
|
|
792
|
+
if (text && originalSelector.toLowerCase().includes(text.toLowerCase().trim().substring(0, 20))) {
|
|
793
|
+
alternatives.push({
|
|
794
|
+
selector: `text="${text.trim()}"`,
|
|
795
|
+
confidence: 0.8,
|
|
796
|
+
reason: `Text match: "${text.trim()}"`,
|
|
797
|
+
});
|
|
798
|
+
}
|
|
799
|
+
// Check aria-label
|
|
800
|
+
if (ariaLabel && originalSelector.toLowerCase().includes(ariaLabel.toLowerCase().substring(0, 20))) {
|
|
801
|
+
alternatives.push({
|
|
802
|
+
selector: `[aria-label="${ariaLabel}"]`,
|
|
803
|
+
confidence: 0.9,
|
|
804
|
+
reason: `Aria-label: "${ariaLabel}"`,
|
|
805
|
+
});
|
|
806
|
+
}
|
|
807
|
+
// Check id
|
|
808
|
+
if (id && originalSelector.toLowerCase().includes(id.toLowerCase())) {
|
|
809
|
+
alternatives.push({
|
|
810
|
+
selector: `#${id}`,
|
|
811
|
+
confidence: 0.95,
|
|
812
|
+
reason: `ID match: #${id}`,
|
|
813
|
+
});
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
// Sort by confidence
|
|
817
|
+
alternatives.sort((a, b) => b.confidence - a.confidence);
|
|
818
|
+
}
|
|
819
|
+
catch {
|
|
820
|
+
// Ignore errors in alternative finding
|
|
821
|
+
}
|
|
822
|
+
return alternatives.slice(0, 5);
|
|
823
|
+
}
|
|
824
|
+
// =========================================================================
|
|
825
|
+
// Tier 5: Self-Healing Selector Cache (v5.0.0)
|
|
826
|
+
// =========================================================================
|
|
827
|
+
selectorCache = null;
|
|
828
|
+
/**
|
|
829
|
+
* Get the selector cache file path.
|
|
830
|
+
*/
|
|
831
|
+
getSelectorCachePath() {
|
|
832
|
+
return (0, path_1.join)(this.paths.dataDir, "selector-cache.json");
|
|
833
|
+
}
|
|
834
|
+
/**
|
|
835
|
+
* Load the selector cache from disk.
|
|
836
|
+
*/
|
|
837
|
+
loadSelectorCache() {
|
|
838
|
+
if (this.selectorCache)
|
|
839
|
+
return this.selectorCache;
|
|
840
|
+
const cachePath = this.getSelectorCachePath();
|
|
841
|
+
if ((0, fs_1.existsSync)(cachePath)) {
|
|
842
|
+
try {
|
|
843
|
+
const data = (0, fs_1.readFileSync)(cachePath, "utf-8");
|
|
844
|
+
this.selectorCache = JSON.parse(data);
|
|
845
|
+
return this.selectorCache;
|
|
846
|
+
}
|
|
847
|
+
catch {
|
|
848
|
+
// Corrupted cache, start fresh
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
this.selectorCache = { version: 1, entries: {} };
|
|
852
|
+
return this.selectorCache;
|
|
853
|
+
}
|
|
854
|
+
/**
|
|
855
|
+
* Save the selector cache to disk.
|
|
856
|
+
*/
|
|
857
|
+
saveSelectorCache() {
|
|
858
|
+
if (!this.selectorCache)
|
|
859
|
+
return;
|
|
860
|
+
const cachePath = this.getSelectorCachePath();
|
|
861
|
+
(0, fs_1.writeFileSync)(cachePath, JSON.stringify(this.selectorCache, null, 2));
|
|
862
|
+
}
|
|
863
|
+
/**
|
|
864
|
+
* Get cache key for a selector (includes domain for context).
|
|
865
|
+
*/
|
|
866
|
+
getSelectorCacheKey(selector, domain) {
|
|
867
|
+
const d = domain || this.getCurrentDomain();
|
|
868
|
+
return `${d}::${selector.toLowerCase()}`;
|
|
869
|
+
}
|
|
870
|
+
/**
|
|
871
|
+
* Get current page domain.
|
|
872
|
+
*/
|
|
873
|
+
getCurrentDomain() {
|
|
874
|
+
try {
|
|
875
|
+
if (this.page) {
|
|
876
|
+
const url = this.page.url();
|
|
877
|
+
return new URL(url).hostname;
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
catch {
|
|
881
|
+
// Ignore
|
|
882
|
+
}
|
|
883
|
+
return "unknown";
|
|
884
|
+
}
|
|
885
|
+
/**
|
|
886
|
+
* Cache a working alternative selector for future use.
|
|
887
|
+
*/
|
|
888
|
+
cacheAlternativeSelector(original, working, reason = "Alternative found") {
|
|
889
|
+
const cache = this.loadSelectorCache();
|
|
890
|
+
const key = this.getSelectorCacheKey(original);
|
|
891
|
+
const domain = this.getCurrentDomain();
|
|
892
|
+
cache.entries[key] = {
|
|
893
|
+
originalSelector: original,
|
|
894
|
+
workingSelector: working,
|
|
895
|
+
domain,
|
|
896
|
+
successCount: 1,
|
|
897
|
+
failCount: 0,
|
|
898
|
+
lastUsed: new Date().toISOString(),
|
|
899
|
+
reason,
|
|
900
|
+
};
|
|
901
|
+
this.saveSelectorCache();
|
|
902
|
+
if (this.config.verbose) {
|
|
903
|
+
console.log(`📦 Cached healed selector: "${original}" → "${working}"`);
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* Get a cached alternative selector if available.
|
|
908
|
+
*/
|
|
909
|
+
getCachedSelector(original) {
|
|
910
|
+
const cache = this.loadSelectorCache();
|
|
911
|
+
const key = this.getSelectorCacheKey(original);
|
|
912
|
+
return cache.entries[key] || null;
|
|
913
|
+
}
|
|
914
|
+
/**
|
|
915
|
+
* Update cache entry statistics.
|
|
916
|
+
*/
|
|
917
|
+
updateCacheStats(original, success) {
|
|
918
|
+
const cache = this.loadSelectorCache();
|
|
919
|
+
const key = this.getSelectorCacheKey(original);
|
|
920
|
+
const entry = cache.entries[key];
|
|
921
|
+
if (entry) {
|
|
922
|
+
if (success) {
|
|
923
|
+
entry.successCount++;
|
|
924
|
+
}
|
|
925
|
+
else {
|
|
926
|
+
entry.failCount++;
|
|
927
|
+
}
|
|
928
|
+
entry.lastUsed = new Date().toISOString();
|
|
929
|
+
this.saveSelectorCache();
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
/**
|
|
933
|
+
* Get selector cache statistics.
|
|
934
|
+
*/
|
|
935
|
+
getSelectorCacheStats() {
|
|
936
|
+
const cache = this.loadSelectorCache();
|
|
937
|
+
const entries = Object.values(cache.entries);
|
|
938
|
+
const byDomain = {};
|
|
939
|
+
for (const entry of entries) {
|
|
940
|
+
byDomain[entry.domain] = (byDomain[entry.domain] || 0) + 1;
|
|
941
|
+
}
|
|
942
|
+
const topHealedSelectors = entries
|
|
943
|
+
.sort((a, b) => b.successCount - a.successCount)
|
|
944
|
+
.slice(0, 10)
|
|
945
|
+
.map(e => ({
|
|
946
|
+
original: e.originalSelector,
|
|
947
|
+
working: e.workingSelector,
|
|
948
|
+
heals: e.successCount,
|
|
949
|
+
}));
|
|
950
|
+
return {
|
|
951
|
+
totalEntries: entries.length,
|
|
952
|
+
totalHeals: entries.reduce((sum, e) => sum + e.successCount, 0),
|
|
953
|
+
byDomain,
|
|
954
|
+
topHealedSelectors,
|
|
955
|
+
};
|
|
956
|
+
}
|
|
957
|
+
/**
|
|
958
|
+
* Clear the selector cache.
|
|
959
|
+
*/
|
|
960
|
+
clearSelectorCache(domain) {
|
|
961
|
+
const cache = this.loadSelectorCache();
|
|
962
|
+
let cleared = 0;
|
|
963
|
+
if (domain) {
|
|
964
|
+
// Clear only for specific domain
|
|
965
|
+
for (const [key, entry] of Object.entries(cache.entries)) {
|
|
966
|
+
if (entry.domain === domain) {
|
|
967
|
+
delete cache.entries[key];
|
|
968
|
+
cleared++;
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
else {
|
|
973
|
+
// Clear all
|
|
974
|
+
cleared = Object.keys(cache.entries).length;
|
|
975
|
+
cache.entries = {};
|
|
976
|
+
}
|
|
977
|
+
this.saveSelectorCache();
|
|
978
|
+
return cleared;
|
|
979
|
+
}
|
|
980
|
+
/**
|
|
981
|
+
* List all cached selectors.
|
|
982
|
+
*/
|
|
983
|
+
listCachedSelectors(domain) {
|
|
984
|
+
const cache = this.loadSelectorCache();
|
|
985
|
+
let entries = Object.values(cache.entries);
|
|
986
|
+
if (domain) {
|
|
987
|
+
entries = entries.filter(e => e.domain === domain);
|
|
988
|
+
}
|
|
989
|
+
return entries.sort((a, b) => b.successCount - a.successCount);
|
|
990
|
+
}
|
|
991
|
+
/**
|
|
992
|
+
* Analyze a failure and provide AI-powered suggestions.
|
|
993
|
+
*/
|
|
994
|
+
async analyzeFailure(selector, attempts) {
|
|
995
|
+
const page = await this.getPage();
|
|
996
|
+
try {
|
|
997
|
+
// Get page context for suggestion
|
|
998
|
+
const buttons = await page.$$eval('button, a, [role="button"]', els => els.slice(0, 10).map(el => ({
|
|
999
|
+
text: el.textContent?.trim().substring(0, 50),
|
|
1000
|
+
tag: el.tagName,
|
|
1001
|
+
})));
|
|
1002
|
+
const buttonList = buttons.map(b => `- ${b.tag}: "${b.text}"`).join("\n");
|
|
1003
|
+
return `Element "${selector}" not found after ${attempts.length} attempts.\n\nAvailable clickable elements:\n${buttonList}\n\nTry using the exact text from one of these elements.`;
|
|
1004
|
+
}
|
|
1005
|
+
catch {
|
|
1006
|
+
return `Element "${selector}" not found. Check that the element exists and is visible.`;
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
// =========================================================================
|
|
1010
|
+
// Tier 5: Assertions (v5.0.0)
|
|
1011
|
+
// =========================================================================
|
|
1012
|
+
/**
|
|
1013
|
+
* Assert a condition using natural language.
|
|
1014
|
+
*/
|
|
1015
|
+
async assert(assertion) {
|
|
1016
|
+
const page = await this.getPage();
|
|
1017
|
+
try {
|
|
1018
|
+
// Parse the assertion
|
|
1019
|
+
const result = await this.evaluateAssertion(assertion);
|
|
1020
|
+
this.audit("assert", assertion, "green", result.passed ? "success" : "failure");
|
|
1021
|
+
return {
|
|
1022
|
+
...result,
|
|
1023
|
+
screenshot: await this.screenshot(),
|
|
1024
|
+
};
|
|
1025
|
+
}
|
|
1026
|
+
catch (error) {
|
|
1027
|
+
return {
|
|
1028
|
+
passed: false,
|
|
1029
|
+
assertion,
|
|
1030
|
+
message: `Assertion error: ${error instanceof Error ? error.message : String(error)}`,
|
|
1031
|
+
screenshot: await this.screenshot(),
|
|
1032
|
+
};
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
/**
|
|
1036
|
+
* Evaluate a natural language assertion.
|
|
1037
|
+
*/
|
|
1038
|
+
async evaluateAssertion(assertion) {
|
|
1039
|
+
const page = await this.getPage();
|
|
1040
|
+
const lowerAssertion = assertion.toLowerCase();
|
|
1041
|
+
// Page title assertions
|
|
1042
|
+
if (lowerAssertion.includes("title") && (lowerAssertion.includes("is") || lowerAssertion.includes("contains"))) {
|
|
1043
|
+
const title = await page.title();
|
|
1044
|
+
const match = assertion.match(/["']([^"']+)["']/);
|
|
1045
|
+
const expected = match?.[1] || "";
|
|
1046
|
+
if (lowerAssertion.includes("contains")) {
|
|
1047
|
+
const passed = title.toLowerCase().includes(expected.toLowerCase());
|
|
1048
|
+
return { passed, assertion, actual: title, expected, message: passed ? "Title contains expected text" : `Title "${title}" does not contain "${expected}"` };
|
|
1049
|
+
}
|
|
1050
|
+
else {
|
|
1051
|
+
const passed = title === expected;
|
|
1052
|
+
return { passed, assertion, actual: title, expected, message: passed ? "Title matches" : `Title "${title}" does not match "${expected}"` };
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
// URL assertions
|
|
1056
|
+
if (lowerAssertion.includes("url") && (lowerAssertion.includes("is") || lowerAssertion.includes("contains"))) {
|
|
1057
|
+
const url = page.url();
|
|
1058
|
+
const match = assertion.match(/["']([^"']+)["']/);
|
|
1059
|
+
const expected = match?.[1] || "";
|
|
1060
|
+
if (lowerAssertion.includes("contains")) {
|
|
1061
|
+
const passed = url.includes(expected);
|
|
1062
|
+
return { passed, assertion, actual: url, expected, message: passed ? "URL contains expected text" : `URL "${url}" does not contain "${expected}"` };
|
|
1063
|
+
}
|
|
1064
|
+
else {
|
|
1065
|
+
const passed = url === expected;
|
|
1066
|
+
return { passed, assertion, actual: url, expected, message: passed ? "URL matches" : `URL "${url}" does not match "${expected}"` };
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
// Text presence assertions
|
|
1070
|
+
if (lowerAssertion.includes("page") && (lowerAssertion.includes("contains") || lowerAssertion.includes("has") || lowerAssertion.includes("shows"))) {
|
|
1071
|
+
const match = assertion.match(/["']([^"']+)["']/);
|
|
1072
|
+
const expected = match?.[1] || "";
|
|
1073
|
+
const content = await page.textContent("body") || "";
|
|
1074
|
+
const passed = content.toLowerCase().includes(expected.toLowerCase());
|
|
1075
|
+
return { passed, assertion, expected, message: passed ? `Page contains "${expected}"` : `Page does not contain "${expected}"` };
|
|
1076
|
+
}
|
|
1077
|
+
// Element existence assertions
|
|
1078
|
+
if (lowerAssertion.includes("exists") || lowerAssertion.includes("visible") || lowerAssertion.includes("present")) {
|
|
1079
|
+
const match = assertion.match(/["']([^"']+)["']/);
|
|
1080
|
+
const selector = match?.[1] || "";
|
|
1081
|
+
const element = await this.findElement(selector);
|
|
1082
|
+
const passed = element !== null;
|
|
1083
|
+
return { passed, assertion, expected: selector, message: passed ? `Element "${selector}" exists` : `Element "${selector}" not found` };
|
|
1084
|
+
}
|
|
1085
|
+
// Element count assertions
|
|
1086
|
+
const countMatch = lowerAssertion.match(/(\d+)\s+(items?|elements?|buttons?|links?|rows?)/);
|
|
1087
|
+
if (countMatch) {
|
|
1088
|
+
const expectedCount = parseInt(countMatch[1]);
|
|
1089
|
+
const elementType = countMatch[2];
|
|
1090
|
+
let selectorForType;
|
|
1091
|
+
switch (elementType.replace(/s$/, "")) {
|
|
1092
|
+
case "button":
|
|
1093
|
+
selectorForType = "button, [role='button']";
|
|
1094
|
+
break;
|
|
1095
|
+
case "link":
|
|
1096
|
+
selectorForType = "a";
|
|
1097
|
+
break;
|
|
1098
|
+
case "row":
|
|
1099
|
+
selectorForType = "tr";
|
|
1100
|
+
break;
|
|
1101
|
+
case "item":
|
|
1102
|
+
selectorForType = "li";
|
|
1103
|
+
break;
|
|
1104
|
+
default:
|
|
1105
|
+
selectorForType = "*";
|
|
1106
|
+
break;
|
|
1107
|
+
}
|
|
1108
|
+
const elements = await page.$$(selectorForType);
|
|
1109
|
+
const actualCount = elements.length;
|
|
1110
|
+
const passed = actualCount === expectedCount;
|
|
1111
|
+
return { passed, assertion, actual: String(actualCount), expected: String(expectedCount), message: passed ? `Found ${expectedCount} ${elementType}` : `Expected ${expectedCount} ${elementType} but found ${actualCount}` };
|
|
1112
|
+
}
|
|
1113
|
+
// Default: treat as text search
|
|
1114
|
+
const match = assertion.match(/["']([^"']+)["']/);
|
|
1115
|
+
if (match) {
|
|
1116
|
+
const expected = match[1];
|
|
1117
|
+
const content = await page.textContent("body") || "";
|
|
1118
|
+
const passed = content.toLowerCase().includes(expected.toLowerCase());
|
|
1119
|
+
return { passed, assertion, expected, message: passed ? `Found "${expected}"` : `Did not find "${expected}"` };
|
|
1120
|
+
}
|
|
1121
|
+
return { passed: false, assertion, message: "Could not parse assertion. Use quotes around expected values." };
|
|
1122
|
+
}
|
|
712
1123
|
/**
|
|
713
1124
|
* Find an element using multiple strategies.
|
|
714
1125
|
*/
|
|
715
|
-
async findElement(selector) {
|
|
1126
|
+
async findElement(selector, options = {}) {
|
|
716
1127
|
const page = await this.getPage();
|
|
1128
|
+
// Strategy 0: Check self-healing cache first (unless skipped)
|
|
1129
|
+
if (!options.skipCache) {
|
|
1130
|
+
const cached = this.getCachedSelector(selector);
|
|
1131
|
+
if (cached) {
|
|
1132
|
+
try {
|
|
1133
|
+
const cachedElement = await this.findElement(cached.workingSelector, { skipCache: true });
|
|
1134
|
+
if (cachedElement && await cachedElement.count() > 0) {
|
|
1135
|
+
this.updateCacheStats(selector, true);
|
|
1136
|
+
if (this.config.verbose) {
|
|
1137
|
+
console.log(`🔧 Self-healed: "${selector}" → "${cached.workingSelector}"`);
|
|
1138
|
+
}
|
|
1139
|
+
return cachedElement;
|
|
1140
|
+
}
|
|
1141
|
+
else {
|
|
1142
|
+
// Cached selector no longer works
|
|
1143
|
+
this.updateCacheStats(selector, false);
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
catch {
|
|
1147
|
+
this.updateCacheStats(selector, false);
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
717
1151
|
// Strategy 1: Direct CSS selector
|
|
718
1152
|
if (selector.startsWith("css:")) {
|
|
719
1153
|
return page.locator(selector.slice(4)).first();
|