Я разместил свой 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
Почему я получаю трассировку стека без исключений в разделе сообщений, когда запускаю сканер селена? ⇐ Python
Программы на Python
1768841573
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)
Подробнее здесь: [url]https://stackoverflow.com/questions/79871364/why-am-i-getting-a-stack-trace-with-no-exception-in-the-message-section-when-i-r[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия