"""Read-only acceptance for the explicitly simulated WeKnora monitor.""" import json from pathlib import Path import urllib.request from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.firefox.options import Options from selenium.webdriver.firefox.service import Service from selenium.webdriver.support.ui import WebDriverWait BASE='http://127.0.0.1:8088';ROOT=Path(__file__).resolve().parents[1] def get(path): with urllib.request.urlopen(BASE+path,timeout=10) as response:return json.load(response) overview=get('/api/v1/monitor/overview');assert overview['mode']=='simulation' and overview['simulated'] is True kb=overview['knowledge_bases'][0];assert kb['imported']==5750 and sum(kb[key] for key in ('completed','pending','processing','finalizing','failed','cancelled'))==5750 options=Options();options.add_argument('--headless');options.binary_location='/snap/firefox/current/usr/lib/firefox/firefox' driver=webdriver.Firefox(options=options,service=Service('/snap/bin/geckodriver'));driver.set_window_size(1440,1000);wait=WebDriverWait(driver,30,poll_frequency=.1) def body():return driver.find_element(By.TAG_NAME,'body').text def fits():assert driver.execute_script('return document.documentElement.scrollWidth<=window.innerWidth') try: driver.get(BASE);wait.until(lambda d:d.find_element(By.TAG_NAME,'h1').text=='来源与目录') driver.find_element(By.XPATH,"//nav//button[contains(.,'解析监控')]").click();wait.until(lambda d:d.find_element(By.TAG_NAME,'h1').text=='解析监控');wait.until(lambda d:'completed 4530' in d.find_element(By.CSS_SELECTOR,'.monitor-stage-tabs').text) for expected in ['本地模拟数据','不代表测试服务器真实数据','CPU','42%','内存','18.6 / 32.0 GB','WeKnora API','Embedding模型','LLM模型','MinerU','已导入 5750','completed 4530','pending 450','finalizing 714','processing 50','failed 6','对内 3300 / 4200','对外 1230 / 1550']: assert expected in body() assert '100%' not in body() driver.find_element(By.XPATH,"//div[contains(@class,'monitor-stage-tabs')]//button[contains(.,'finalizing')]").click();wait.until(lambda d:'[模拟] 产品参数总表.xlsx' in d.find_element(By.CSS_SELECTOR,'.monitor-file-table').text) assert '基础检索可用,Wiki与图谱仍在生成' in body() driver.find_element(By.XPATH,"//div[contains(@class,'monitor-stage-tabs')]//button[contains(.,'failed')]").click();wait.until(lambda d:'[模拟] CRA-IP68产品介绍.pdf' in d.find_element(By.CSS_SELECTOR,'.monitor-file-table').text) assert 'mineru_parse_failed' in body() driver.find_element(By.XPATH,"//div[contains(@class,'monitor-stage-tabs')]//button[contains(.,'全部')]").click();wait.until(lambda d:len(d.find_elements(By.CSS_SELECTOR,'.monitor-file-table tbody tr'))==5) for width in (1440,1024,768):driver.set_window_size(width,900);fits() driver.set_window_size(1440,1000);driver.get_full_page_screenshot_as_file(str(ROOT/'tmp/WEKNORA_MONITOR_SIMULATION_FIREFOX.png')) result={'mode':'simulation','explicit_label':True,'imported':5750,'completed':4530,'pending':450,'finalizing':714,'processing':50,'failed':6,'status_filter':'pass','file_names':'pass','resource_cards':'pass','root_overflow':False,'write_requests':0} (ROOT/'tmp/weknora-monitor-simulation-acceptance.json').write_text(json.dumps(result,ensure_ascii=False,indent=2));print(json.dumps(result,ensure_ascii=False)) finally:driver.quit()