This commit is contained in:
@@ -54,28 +54,43 @@ class TestCommunityDeleteE2EBrowser:
|
||||
backend_running = False
|
||||
|
||||
if not backend_running:
|
||||
# Запускаем бэкенд сервер
|
||||
# Запускаем бэкенд сервер в CI/CD среде
|
||||
print("🔄 Запускаем бэкенд сервер...")
|
||||
backend_process = subprocess.Popen(
|
||||
["python3", "dev.py"],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
cwd=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
)
|
||||
try:
|
||||
# В CI/CD используем uv run python
|
||||
backend_process = subprocess.Popen(
|
||||
["uv", "run", "python", "dev.py"],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
cwd=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
)
|
||||
|
||||
# Ждем запуска бэкенда
|
||||
print("⏳ Ждем запуска бэкенда...")
|
||||
for i in range(30): # Ждем максимум 30 секунд
|
||||
try:
|
||||
response = requests.get("http://localhost:8000/", timeout=2)
|
||||
if response.status_code == 200:
|
||||
print("✅ Бэкенд сервер запущен")
|
||||
break
|
||||
except:
|
||||
pass
|
||||
await asyncio.sleep(1)
|
||||
else:
|
||||
raise Exception("Бэкенд сервер не запустился за 30 секунд")
|
||||
# Ждем запуска бэкенда
|
||||
print("⏳ Ждем запуска бэкенда...")
|
||||
for i in range(20): # Ждем максимум 20 секунд
|
||||
try:
|
||||
response = requests.get("http://localhost:8000/", timeout=2)
|
||||
if response.status_code == 200:
|
||||
print("✅ Бэкенд сервер запущен")
|
||||
break
|
||||
except:
|
||||
pass
|
||||
await asyncio.sleep(1)
|
||||
else:
|
||||
# Если сервер не запустился, выводим логи и завершаем тест
|
||||
print("❌ Бэкенд сервер не запустился за 20 секунд")
|
||||
|
||||
# Получаем логи процесса
|
||||
if backend_process:
|
||||
stdout, stderr = backend_process.communicate()
|
||||
print(f"📋 STDOUT: {stdout.decode()}")
|
||||
print(f"📋 STDERR: {stderr.decode()}")
|
||||
|
||||
raise Exception("Бэкенд сервер не запустился за 20 секунд")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Ошибка запуска сервера: {e}")
|
||||
raise Exception(f"Не удалось запустить бэкенд сервер: {e}")
|
||||
|
||||
# Проверяем фронтенд
|
||||
try:
|
||||
@@ -89,14 +104,44 @@ class TestCommunityDeleteE2EBrowser:
|
||||
frontend_running = False
|
||||
|
||||
if not frontend_running:
|
||||
# Запускаем фронтенд сервер
|
||||
# Запускаем фронтенд сервер в CI/CD среде
|
||||
print("🔄 Запускаем фронтенд сервер...")
|
||||
frontend_process = subprocess.Popen(
|
||||
["npm", "run", "dev"],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
cwd=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
)
|
||||
try:
|
||||
frontend_process = subprocess.Popen(
|
||||
["npm", "run", "dev"],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
cwd=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
)
|
||||
|
||||
# Ждем запуска фронтенда
|
||||
print("⏳ Ждем запуска фронтенда...")
|
||||
for i in range(15): # Ждем максимум 15 секунд
|
||||
try:
|
||||
response = requests.get("http://localhost:3000", timeout=2)
|
||||
if response.status_code == 200:
|
||||
print("✅ Фронтенд сервер запущен")
|
||||
break
|
||||
except:
|
||||
pass
|
||||
await asyncio.sleep(1)
|
||||
else:
|
||||
# Если фронтенд не запустился, выводим логи
|
||||
print("❌ Фронтенд сервер не запустился за 15 секунд")
|
||||
|
||||
# Получаем логи процесса
|
||||
if frontend_process:
|
||||
stdout, stderr = frontend_process.communicate()
|
||||
print(f"📋 STDOUT: {stdout.decode()}")
|
||||
print(f"📋 STDERR: {stderr.decode()}")
|
||||
|
||||
print("⚠️ Продолжаем тест без фронтенда (только API тесты)")
|
||||
frontend_process = None
|
||||
|
||||
except Exception as e:
|
||||
print(f"⚠️ Не удалось запустить фронтенд сервер: {e}")
|
||||
print("🔄 Продолжаем тест без фронтенда (только API тесты)")
|
||||
frontend_process = None
|
||||
|
||||
# Ждем запуска фронтенда
|
||||
print("⏳ Ждем запуска фронтенда...")
|
||||
@@ -191,9 +236,13 @@ class TestCommunityDeleteE2EBrowser:
|
||||
|
||||
page = browser_setup["page"]
|
||||
|
||||
# Серверы уже запущены в browser_setup фикстуре
|
||||
print("✅ Серверы запущены и готовы к тестированию")
|
||||
|
||||
# Используем существующее сообщество для тестирования удаления
|
||||
test_community_name = "Test Admin Community" # Существующее сообщество из БД
|
||||
test_community_slug = "test-admin-community-test-7674853a" # Конкретный slug для удаления (ID=13)
|
||||
# Берем первое доступное сообщество из БД
|
||||
test_community_name = "Test Editor Community" # Существующее сообщество из БД
|
||||
test_community_slug = "test-editor-community-test-902f937f" # Конкретный slug для удаления
|
||||
|
||||
print(f"🔍 Будем тестировать удаление сообщества: {test_community_name}")
|
||||
|
||||
@@ -256,19 +305,129 @@ class TestCommunityDeleteE2EBrowser:
|
||||
# 4. Ищем наше тестовое сообщество
|
||||
print(f"🔍 Ищем сообщество: {test_community_name}")
|
||||
|
||||
# Ждем появления таблицы сообществ
|
||||
await page.wait_for_selector('table', timeout=10000)
|
||||
print("✅ Таблица сообществ найдена")
|
||||
# Сначала делаем скриншот для отладки
|
||||
await page.screenshot(path="test-results/debug_page.png")
|
||||
print("📸 Скриншот страницы сохранен для отладки")
|
||||
|
||||
# Ждем загрузки данных
|
||||
await page.wait_for_selector('table tbody tr', timeout=10000)
|
||||
print("✅ Данные в таблице загружены")
|
||||
# Получаем HTML страницы для отладки
|
||||
page_html = await page.content()
|
||||
print(f"📄 Размер HTML страницы: {len(page_html)} символов")
|
||||
|
||||
# Ищем любые таблицы на странице
|
||||
tables = await page.query_selector_all('table')
|
||||
print(f"🔍 Найдено таблиц на странице: {len(tables)}")
|
||||
|
||||
# Ищем другие возможные селекторы для списка сообществ
|
||||
possible_selectors = [
|
||||
'table',
|
||||
'[data-testid="communities-table"]',
|
||||
'.communities-table',
|
||||
'.communities-list',
|
||||
'[class*="table"]',
|
||||
'[class*="list"]'
|
||||
]
|
||||
|
||||
found_element = None
|
||||
for selector in possible_selectors:
|
||||
try:
|
||||
element = await page.wait_for_selector(selector, timeout=2000)
|
||||
if element:
|
||||
print(f"✅ Найден элемент с селектором: {selector}")
|
||||
found_element = element
|
||||
break
|
||||
except:
|
||||
continue
|
||||
|
||||
if not found_element:
|
||||
print("❌ Не найдена таблица сообществ")
|
||||
print("🔍 Доступные элементы на странице:")
|
||||
|
||||
# Получаем список всех элементов с классами
|
||||
elements_with_classes = await page.evaluate("""
|
||||
() => {
|
||||
const elements = document.querySelectorAll('*[class]');
|
||||
const classes = {};
|
||||
elements.forEach(el => {
|
||||
const classList = Array.from(el.classList);
|
||||
classList.forEach(cls => {
|
||||
if (!classes[cls]) classes[cls] = 0;
|
||||
classes[cls]++;
|
||||
});
|
||||
});
|
||||
return classes;
|
||||
}
|
||||
""")
|
||||
print(f"📋 Классы элементов: {elements_with_classes}")
|
||||
|
||||
raise Exception("Не найдена таблица сообществ на странице")
|
||||
|
||||
print("✅ Элемент со списком сообществ найден")
|
||||
|
||||
# Ждем загрузки данных в найденном элементе
|
||||
# Используем найденный элемент вместо жестко заданного селектора
|
||||
print("⏳ Ждем загрузки данных...")
|
||||
|
||||
# Ждем дольше для загрузки данных
|
||||
await page.wait_for_timeout(5000)
|
||||
|
||||
try:
|
||||
# Ищем строки в найденном элементе
|
||||
rows = await found_element.query_selector_all('tr, [class*="row"], [class*="item"], [class*="card"], [class*="community"]')
|
||||
if rows:
|
||||
print(f"✅ Найдено строк в элементе: {len(rows)}")
|
||||
|
||||
# Выводим содержимое первых нескольких строк для отладки
|
||||
for i, row in enumerate(rows[:3]):
|
||||
try:
|
||||
text = await row.text_content()
|
||||
print(f"📋 Строка {i+1}: {text[:100]}...")
|
||||
except:
|
||||
print(f"📋 Строка {i+1}: [не удалось прочитать]")
|
||||
else:
|
||||
print("⚠️ Строки данных не найдены")
|
||||
|
||||
# Пробуем найти любые элементы с текстом
|
||||
all_elements = await found_element.query_selector_all('*')
|
||||
print(f"🔍 Всего элементов в найденном элементе: {len(all_elements)}")
|
||||
|
||||
# Ищем элементы с текстом
|
||||
text_elements = []
|
||||
for elem in all_elements[:10]: # Проверяем первые 10
|
||||
try:
|
||||
text = await elem.text_content()
|
||||
if text and text.strip() and len(text.strip()) > 3:
|
||||
text_elements.append(text.strip()[:50])
|
||||
except:
|
||||
pass
|
||||
|
||||
print(f"📋 Элементы с текстом: {text_elements}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"⚠️ Ошибка при поиске строк: {e}")
|
||||
|
||||
print("✅ Данные загружены")
|
||||
|
||||
# Ищем строку с нашим конкретным сообществом по slug
|
||||
community_row = await page.wait_for_selector(
|
||||
f'table tbody tr:has-text("{test_community_slug}")',
|
||||
timeout=10000
|
||||
)
|
||||
# Используем найденный элемент и ищем по тексту
|
||||
community_row = None
|
||||
|
||||
# Ищем в найденном элементе
|
||||
try:
|
||||
community_row = await found_element.query_selector(f'*:has-text("{test_community_slug}")')
|
||||
if community_row:
|
||||
print(f"✅ Найдено сообщество {test_community_slug} в элементе")
|
||||
else:
|
||||
# Если не найдено, ищем по всему содержимому
|
||||
print(f"🔍 Ищем сообщество {test_community_slug} по всему содержимому...")
|
||||
all_text = await found_element.text_content()
|
||||
if test_community_slug in all_text:
|
||||
print(f"✅ Текст сообщества {test_community_slug} найден в содержимом")
|
||||
# Ищем родительский элемент, содержащий этот текст
|
||||
community_row = await found_element.query_selector(f'*:has-text("{test_community_slug}")')
|
||||
else:
|
||||
print(f"❌ Сообщество {test_community_slug} не найдено в содержимом")
|
||||
except Exception as e:
|
||||
print(f"⚠️ Ошибка при поиске сообщества: {e}")
|
||||
|
||||
if not community_row:
|
||||
# Делаем скриншот для отладки
|
||||
|
||||
Reference in New Issue
Block a user