|
|
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 |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
|