from datetime import datetime from time import sleep from typing import List from playwright.sync_api import Page from lib.log_parser import WebItem class TranslatorPage: def __init__(self, page:Page): self.page = page @property def _switch(self): return self.page.get_by_role("switch") @property def _trans_selector(self): return self.page.locator(".ant-select-selector") def start(self, translation_lang): if translation_lang == "zh2en": self.start_zh2en() elif translation_lang == "en2zh": self.start_en2zh() else: raise TypeError(f"invalid translation_lang: {translation_lang}") def start_zh2en(self): self._trans_selector.click() self.page.locator(".ant-select-item").get_by_text("Chinese -> English").click() self.set_on() print("page started zh2en translation") def start_en2zh(self): self._trans_selector.click() self.page.locator(".ant-select-item").get_by_text("English -> Chinese").click() self.set_on() print("page started en2zh translation") def _is_on(self): state = self._switch.get_attribute("aria-checked") return True if state=="true" else False def set_on(self): if not self._is_on(): self._switch.click() print("click button to set translation on") def set_off(self): if self._is_on(): self._switch.click() print("click button to set translation off") def get_current_node_text(self, duration=0, interval=0.05)-> List[WebItem]: """在一定时间内持续读取页面最新的 node的内容""" print(f"capture page latest content for duration: {duration}s") translate_items = [] last_src, last_dst = None, None for i in range(int(duration // interval) + 1): current_node = self.page.locator(".trans-list").locator(".current_node") src_lang = current_node.locator(".trans-src-lang").inner_text() dst_lang = current_node.locator(".trans-dst-lang").inner_text() tsp = datetime.now() sleep(interval) if src_lang == last_src and dst_lang == last_dst: continue # print("src lang:", src_lang) # print("dst lang:", dst_lang) translate_items.append(WebItem(tsp, src_lang, dst_lang)) last_src, last_dst = src_lang, dst_lang print(f"capture page latest content finished") return translate_items def get_translated_texts(self, translation_lang): src_all = self.page.locator(".trans-list").locator(".trans-src-lang").all_inner_texts() dst_all = self.page.locator(".trans-list").locator(".trans-dst-lang").all_inner_texts() # 使用空格连接英文的不同段落 if translation_lang == "zh2en": return "".join(src_all), " ".join(dst_all) elif translation_lang == "en2zh": return " ".join(src_all), "".join(dst_all) return "".join(src_all), "".join(dst_all)