rss-feedmonitor/archive/ALERT_CREATION_PROCESS.md

91 lines
2.3 KiB
Markdown

# Robust Alert Creation Process
## Key Principles for Reliability
### 1. **Always Fresh Snapshots**
- Get snapshot BEFORE every action
- Never reuse refs from previous snapshots
- Elements change refs on every page load
### 2. **Dynamic Element Finding**
- Find elements by `name` attribute, not cached refs
- Use grep to search snapshot files for element names
- Extract ref from current snapshot only
### 3. **Random Variance (Human-like)**
- Delays: 0.5-2 seconds between actions
- Typing: 30% slow, 70% fast
- Wait times: 1-3 seconds after clicks
### 4. **Error Handling**
- Retry failed actions with exponential backoff
- Get fresh snapshot on error
- Re-find elements on retry
## Step-by-Step Process (Per Query)
```
1. Navigate → https://www.google.com/alerts
2. Wait 1-2s (random)
3. Get snapshot
4. Find "Create an alert about..." → extract ref
5. Click textbox
6. Wait 0.5-1s (random)
7. Type query (slowly=random 30% chance)
8. Wait 1-2s (random)
9. Get snapshot
10. Find "Show option" → extract ref
11. Click "Show option"
12. Wait 1-2s (random)
13. Get snapshot
14. Find delivery dropdown ("knappcolin04@gmail.com") → extract ref
15. Click dropdown
16. Wait 1-2s (random)
17. Get snapshot
18. Find "RSS feed" option → extract ref
19. Click "RSS feed"
20. Wait 0.5-1s (random)
21. Get snapshot
22. Find "Create Alert" → extract ref
23. Click "Create Alert"
24. Wait 2-4s (random)
25. Navigate back to alerts page
26. Repeat for next query
```
## Implementation Pattern
```python
# Pseudo-code pattern:
for query in queries:
# Navigate
browser_navigate("https://www.google.com/alerts")
time.sleep(random_delay(1, 2))
# Get fresh snapshot
snapshot = browser_snapshot()
# Find element dynamically
ref = find_element_by_name(snapshot, "Create an alert about...")
# Click with delay
browser_click(ref)
time.sleep(random_delay(0.5, 1))
# Type with variance
slowly = should_type_slowly() # 30% chance
browser_type(ref, query, slowly=slowly)
time.sleep(random_delay(1, 2))
# Continue pattern...
```
## Why This Works
1. **Fresh refs** = No stale element errors
2. **Random timing** = Human-like, avoids detection
3. **Dynamic finding** = Works even when page structure changes
4. **Retries** = Handles transient errors
5. **Proper waits** = Elements ready before interaction