Почему я получаю трассировку стека без исключений в разделе сообщений, когда запускаю сканер селена?Python

Программы на Python
Ответить
Anonymous
 Почему я получаю трассировку стека без исключений в разделе сообщений, когда запускаю сканер селена?

Сообщение Anonymous »

Я разместил свой API сканера Selenium при рендеринге, он берет данные с одного сайта и помещает их на другой сайт. Когда я тестирую приложение в интерактивных документах FastAPI, я получаю трассировку стека без исключений, поэтому я даже не могу отладить проблему с помощью сканера. Трассировка стека выглядит примерно так:
Stacktrace:
#0 0x59066606dc3a
#1 0x590665a87969
#2 0x590665adcead
#3 0x590665add0f1
#4 0x590665b287e4
#5 0x590665b25a20
#6 0x590665acebe2
#7 0x590665acf991
#8 0x590666033a99
#9 0x5906660369b1
#10 0x5906660200a9
#11 0x59066603756e
#12 0x5906660065e0
#13 0x59066605b358
#14 0x59066605b528
#15 0x59066606cfa8
#16 0x758b1b90c1f5

Раньше я использовал Colorama и обычные операторы печати для ведения журнала, но я переключился на стандартный модуль ведения журнала и все равно столкнулся с теми же проблемами. Я понятия не имею, работает ли мой бот или нет, потому что у меня нет журналов.
Мой код:
#main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, EmailStr
from concurrent.futures import ThreadPoolExecutor
from bot import InitCrawler
from colorama import Fore, init
import uuid,logging

init(autoreset=True)

executor = ThreadPoolExecutor(max_workers=2)
task_status = {} # Track task status by ID

app = FastAPI(title="SIWES Bot Service", version="1.0.0")

class ReportPayload(BaseModel):
email: EmailStr
password: str
monday: str
tuesday: str
wednesday: str
thursday: str
friday: str

def log(msg, level="info"):
colors = {
"success": Fore.GREEN,
"warning": Fore.YELLOW,
"error": Fore.RED,
"info": Fore.CYAN,
}
print(colors.get(level, "") + msg)

def run_bot_with_retry(task_id, email, password, reports, max_attempts=3):
for attempt in range(1, max_attempts + 1):
bot = None
try:
logging.debug(f"Task {task_id}: Attempt {attempt} for {email}")
bot = InitCrawler()
bot.login(email, password)
bot.file(reports)
logging.debug(f"Task {task_id}: Completed successfully")
task_status[task_id] = "completed"
return
except Exception as e:
logging.warning(f"Task {task_id}: Attempt {attempt} failed: {str(e)}")
if attempt == max_attempts:
task_status[task_id] = f"failed: {str(e)}"
finally:
if bot:
try:
bot.driver.quit()
except Exception as e:
logging.warning(f"Error closing driver: {str(e)}")

@app.get("/")
async def root():
return {
"service": "SIWES Bot Service",
"version": "1.0.0",
"status": "running"
}

@app.post("/submit-report")
def submit_report(payload: ReportPayload):
task_id = str(uuid.uuid4())
task_status[task_id] = "running"

reports = {
"monday": payload.monday,
"tuesday": payload.tuesday,
"wednesday": payload.wednesday,
"thursday": payload.thursday,
"friday": payload.friday,
}

executor.submit(run_bot_with_retry, task_id, payload.email, payload.password, reports)

return {
"status": "started",
"task_id": task_id,
"message": "Report submission is running in background"
}

@app.get("/task-status/{task_id}")
def get_task_status(task_id: str):
if task_id not in task_status:
raise HTTPException(status_code=404, detail="Task not found")
return {"task_id": task_id, **task_status[task_id]}


#bot.py
import os
import time
import logging

from selenium import webdriver
from selenium.common import StaleElementReferenceException
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from colorama import Fore,init

init(autoreset=True)

chrome_options = Options()
chrome_options.binary_location = "/opt/render/project/.render/chrome/opt/google/chrome/google-chrome"
chrome_options.add_argument("--headless=new")
chrome_options.add_argument("--window-size=1920,1080")

def log(msg, level="info"):
colors = {
"success": Fore.GREEN,
"warning": Fore.YELLOW,
"error": Fore.RED,
"info": Fore.CYAN,
}
print(colors.get(level, "") + msg)

class InitCrawler:
def __init__(self):
service = Service(ChromeDriverManager(driver_version="144.0.7559.59").install())
self.driver = webdriver.Chrome(service=service,options=chrome_options)
self.driver.get("https://babcock-siwes.com/")
self._stop = False

# =========================
# Helper methods
# =========================
def wait_for(self, by, value, timeout=10):
return WebDriverWait(self.driver, timeout).until(
EC.presence_of_element_located((by, value))
)

def wait_for_clickable(self, by, value, timeout=10):
return WebDriverWait(self.driver, timeout).until(
EC.element_to_be_clickable((by, value))
)

def is_clickable(self, by, value, timeout=10):
try:
WebDriverWait(self.driver, timeout).until(
EC.element_to_be_clickable((by, value))
)
return True
except TimeoutException:
return False

# =========================
# login
# =========================

def login(self,email,password):

try:
if self.is_clickable(By.XPATH,"/html/body/main/nav/button/div",3):
logging.debug("Waiting for nav bar")
self.driver.find_element(By.XPATH,"/html/body/main/nav/button/div").click()
time.sleep(0.5)
logging.debug("Waiting for student button")
self.wait_for_clickable(By.XPATH, "/html/body/main/nav/div/div/button[2]").click()

self.wait_for_clickable(By.XPATH, '//button[text()="Students"]').click()

email_input = self.wait_for(By.XPATH, "/html/body/main/div/form/section[1]/div[1]/div/input")
password_input = self.wait_for(By.XPATH, "/html/body/main/div/form/section[1]/div[2]/div/input")

email_input.click()
email_input.clear()
email_input.send_keys(email)
email_input.send_keys(Keys.ENTER)

password_input.clear()
password_input.send_keys(password)
password_input.send_keys(Keys.ENTER)
self.driver.save_screenshot("debug1.png")
self.wait_for_clickable(By.XPATH, '//button[text()="Login"]').click()

except Exception as e:
logging.error(str(e))

def file(self,reports: dict):
try:
time.sleep(2)
self.wait_for_clickable(By.XPATH,"/html/body/main/div/nav/ul/li[3]").click()
days = ["monday","tuesday","wednesday","thursday","friday"]
for day in days:
try:
element = self.wait_for_clickable(By.XPATH,f'//*[@id="{day}-text"]')
element.click()
element.clear()
element.send_keys(reports[f"{day}"])
logging.debug(f"successfully logged {day}")
time.sleep(0.5)

except Exception as e:
logging.error(str(e))

self.driver.save_screenshot("debug2.png")
self.wait_for_clickable(By.XPATH, '//button[text()="Upload Report"]').click()
except StaleElementReferenceException:
logging.error("Stale Element")

if __name__ == "__main__":

bot = InitCrawler()
bot.login(os.getenv("EMAIL"), os.getenv("PASSWORD"))

reports = {
"monday": "monday",
"tuesday": "tuesday",
"wednesday": "wednesday",
"thursday": "thursday",
"friday": "friday"
}
bot.file(reports)


Подробнее здесь: https://stackoverflow.com/questions/798 ... n-when-i-r
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»