190 lines
5.6 KiB
Markdown
190 lines
5.6 KiB
Markdown
# Machine-Speed Optimization - World Class Automation
|
|
|
|
## 🚀 Objective
|
|
|
|
Transform the automation from **human-like behavior** to **machine-speed execution** while maintaining 100% reliability.
|
|
|
|
---
|
|
|
|
## ✅ Optimizations Applied
|
|
|
|
### 1. **Removed Human-Like Delays** (Major Impact)
|
|
- **Removed**: `RandomizedWait.wait_for_question_answer()` - was adding 2-6 seconds
|
|
- **Replaced**: Minimal 0.1s wait for click to register
|
|
- **Savings**: ~2-6 seconds per question
|
|
|
|
### 2. **Smart Page Load Check** (Major Impact)
|
|
- **Optimized**: `wait_for_page_load()` now checks if page is already loaded
|
|
- **Returns immediately** if `document.readyState == "complete"`
|
|
- **Reduced timeout**: 15s → 3s (with early return)
|
|
- **Savings**: ~10-12 seconds per question (when page already loaded)
|
|
|
|
### 3. **Minimal Loading Indicator Wait** (Medium Impact)
|
|
- **Reduced**: `wait_for_loading_to_disappear()` timeout: 2s → 0.5s
|
|
- **Reason**: Loading indicators disappear instantly or don't exist
|
|
- **Savings**: ~1.5 seconds per question
|
|
|
|
### 4. **Fast Question Type Detection** (Medium Impact)
|
|
- **Reduced**: All question detection timeouts: 2-3s → 0.5s
|
|
- **Optimized**: Smart wait returns immediately if element already visible
|
|
- **Savings**: ~1-2 seconds per question
|
|
|
|
### 5. **Reduced Element Wait Timeouts** (Small Impact)
|
|
- **Reduced**: All `WebDriverWait` timeouts: 10s → 2s
|
|
- **Reason**: Elements should be ready quickly after page load
|
|
- **Savings**: ~0.5-1 second per question (when elements are ready)
|
|
|
|
---
|
|
|
|
## 📊 Performance Comparison
|
|
|
|
### Before Optimization:
|
|
- **Per Question**: ~25 seconds (observed)
|
|
- **100 Questions**: ~42 minutes (observed)
|
|
- **Wait Strategy**: Human-like, realistic delays
|
|
|
|
### After Machine-Speed Optimization:
|
|
- **Per Question**: ~3-8 seconds (estimated)
|
|
- **100 Questions**: ~5-13 minutes (estimated)
|
|
- **Wait Strategy**: Machine-speed, minimal delays
|
|
- **Improvement**: **70-80% faster** (30+ minutes saved!)
|
|
|
|
### Breakdown (Machine-Speed):
|
|
1. Get question type: 0.1-0.5s (was 0.5-3s)
|
|
2. Answer question: 0.5-2s (was 2-6s)
|
|
3. Click registration: 0.1s (was 2-6s)
|
|
4. Click Next + page load: 0.5-2s (was 15-30s)
|
|
5. **Total**: ~1.2-4.5s per question
|
|
|
|
---
|
|
|
|
## 🔧 Technical Changes
|
|
|
|
### Files Modified:
|
|
|
|
1. **`tests/load_tests/test_generic_load_assessments.py`**
|
|
- Removed `RandomizedWait.wait_for_question_answer()`
|
|
- Added minimal 0.1s wait for click registration
|
|
|
|
2. **`utils/wait_helpers.py`**
|
|
- `wait_for_page_load()`: Smart check, returns immediately if ready
|
|
- `wait_for_loading_to_disappear()`: Reduced timeout 2s → 0.5s
|
|
|
|
3. **`utils/question_answer_helper.py`**
|
|
- All `_element_exists()` timeouts: 2-3s → 0.5s
|
|
- All `WebDriverWait` timeouts: 10s → 2s
|
|
- Smart wait for question container (0.5s instead of hardcoded sleep)
|
|
|
|
4. **`pages/domain_assessment_page.py`**
|
|
- Optimized `click_next()` with smart waits
|
|
|
|
5. **`pages/base_page.py`**
|
|
- Optimized `wait_for_page_load()` with smart waits
|
|
|
|
---
|
|
|
|
## ⚡ Key Optimizations
|
|
|
|
### 1. **Early Return Pattern**
|
|
```python
|
|
# Before: Always waits full timeout
|
|
WebDriverWait(driver, 15).until(condition)
|
|
|
|
# After: Returns immediately if ready
|
|
if condition_met():
|
|
return
|
|
WebDriverWait(driver, 3).until(condition)
|
|
```
|
|
|
|
### 2. **Minimal Timeouts**
|
|
- Question detection: 0.5s (was 2-3s)
|
|
- Element waits: 2s (was 10s)
|
|
- Loading indicator: 0.5s (was 2s)
|
|
- Page load: 3s with early return (was 15s)
|
|
|
|
### 3. **Removed Human-Like Delays**
|
|
- No "thinking time" after answering
|
|
- No "reading time" for options
|
|
- No "navigation delay" after clicking
|
|
- Minimal wait only for click registration (0.1s)
|
|
|
|
---
|
|
|
|
## 🎯 Expected Results
|
|
|
|
### Single Student (100 Questions):
|
|
- **Before**: ~42 minutes
|
|
- **After**: ~5-13 minutes
|
|
- **Improvement**: **70-80% faster**
|
|
|
|
### Load Test (100 Students):
|
|
- **Before**: ~42 minutes per student (sequential)
|
|
- **After**: ~5-13 minutes per student (sequential)
|
|
- **With 30 workers**: ~20-40 minutes total (was 2+ hours)
|
|
|
|
---
|
|
|
|
## ⚠️ Safety Considerations
|
|
|
|
1. **Explicit Waits Preserved**: Still using explicit waits for reliability
|
|
2. **Smart Waits**: Return immediately when ready, don't wait unnecessarily
|
|
3. **Minimum Timeouts**: Reduced but not eliminated (still safe)
|
|
4. **No Logic Changes**: Only wait-time optimizations, no functional changes
|
|
|
|
---
|
|
|
|
## 🧪 Testing Recommendations
|
|
|
|
### Phase 1: Single Student Test
|
|
```bash
|
|
python3 tests/load_tests/test_generic_load_assessments.py \
|
|
--csv students_with_passwords_2025-12-15T10-49-08_01.csv \
|
|
--start 0 --end 1 --workers 1 --headless
|
|
```
|
|
|
|
**Expected**: Should complete in ~5-13 minutes (was 42 minutes)
|
|
|
|
### Phase 2: Small Batch Test
|
|
```bash
|
|
python3 tests/load_tests/test_generic_load_assessments.py \
|
|
--csv students_with_passwords_2025-12-15T10-49-08_01.csv \
|
|
--start 0 --end 10 --workers 5 --headless
|
|
```
|
|
|
|
**Expected**: Should complete in ~10-20 minutes (was 42 minutes per student)
|
|
|
|
### Phase 3: Full Load Test
|
|
```bash
|
|
./scripts/PC1_100_students.sh
|
|
```
|
|
|
|
**Expected**: Should complete in ~20-40 minutes (was 2+ hours)
|
|
|
|
---
|
|
|
|
## 📈 Success Metrics
|
|
|
|
- **Target**: <8 seconds per question (average)
|
|
- **Target**: <15 minutes for 100 questions
|
|
- **Target**: 0% increase in failure rate
|
|
- **Target**: Maintain 100% reliability
|
|
- **Target**: Machine-speed execution (no human-like delays)
|
|
|
|
---
|
|
|
|
## 💡 Philosophy
|
|
|
|
**Before**: "Simulate human behavior with realistic delays"
|
|
**After**: "Machine-speed execution with minimal necessary waits"
|
|
|
|
The automation now:
|
|
- ✅ Returns immediately when conditions are met
|
|
- ✅ Uses minimal timeouts (not excessive)
|
|
- ✅ Removes all "thinking time" delays
|
|
- ✅ Optimizes for speed while maintaining reliability
|
|
|
|
---
|
|
|
|
**Status**: ✅ Ready for Testing - Machine-Speed Optimized
|
|
|