fix: 采集后关闭自动新建商品页
- 新增 close_tab 和 create_tab_info,区分断开 CDP 连接与关闭浏览器 target - open_product 标记商品页是否本轮自动新建,collect 结束后只关闭自动新建 tab - 保留用户原本打开的商品 tab,③ 更新流程暂不自动关闭页面 - 补充 editor tab 生命周期测试并同步架构、API、任务和进度文档
This commit is contained in:
@@ -37,6 +37,20 @@ class FakeCDP:
|
||||
self.closed = True
|
||||
|
||||
|
||||
class FakeProductCDP:
|
||||
def __init__(self, ws):
|
||||
self.ws = ws
|
||||
self.closed = False
|
||||
self.sent = []
|
||||
|
||||
def send(self, method, params=None):
|
||||
self.sent.append((method, params or {}))
|
||||
return {}
|
||||
|
||||
def close(self):
|
||||
self.closed = True
|
||||
|
||||
|
||||
def cookie(name, domain=".shopee.tw"):
|
||||
return {"name": name, "domain": domain}
|
||||
|
||||
@@ -133,6 +147,103 @@ class EditorLoginTests(unittest.TestCase):
|
||||
):
|
||||
self.assertTrue(editor.is_logged_in({"debug_port": 9222}))
|
||||
|
||||
def test_open_product_marks_reused_existing_tab(self):
|
||||
fake = FakeProductCDP("ws-existing")
|
||||
with mock.patch(
|
||||
"app.editor.find_product_tab",
|
||||
return_value={"id": "target-existing", "webSocketDebuggerUrl": "ws-existing"},
|
||||
) as find_product_tab, mock.patch(
|
||||
"app.editor.create_tab_info",
|
||||
) as create_tab_info, mock.patch(
|
||||
"app.editor.CDP",
|
||||
return_value=fake,
|
||||
), mock.patch("app.editor._ensure_page_domains"), mock.patch("app.editor._wait_ready"):
|
||||
cdp = editor.open_product({"debug_port": 9222}, "51100639510")
|
||||
|
||||
self.assertIs(fake, cdp)
|
||||
self.assertEqual("target-existing", cdp.target_id)
|
||||
self.assertFalse(cdp.created_by_app)
|
||||
self.assertEqual("127.0.0.1:9222", cdp.cdp_host)
|
||||
find_product_tab.assert_called_once_with("51100639510", host="127.0.0.1:9222")
|
||||
create_tab_info.assert_not_called()
|
||||
self.assertIn(
|
||||
(
|
||||
"Page.navigate",
|
||||
{
|
||||
"url": (
|
||||
"https://seller.shopee.tw/portal/product/51100639510"
|
||||
"?pageEntry=product_list&ignore-html-cache=1"
|
||||
)
|
||||
},
|
||||
),
|
||||
fake.sent,
|
||||
)
|
||||
|
||||
def test_open_product_marks_auto_created_tab(self):
|
||||
fake = FakeProductCDP("ws-new")
|
||||
with mock.patch("app.editor.find_product_tab", return_value=None), mock.patch(
|
||||
"app.editor.create_tab_info",
|
||||
return_value={"id": "target-new", "webSocketDebuggerUrl": "ws-new"},
|
||||
) as create_tab_info, mock.patch(
|
||||
"app.editor.CDP",
|
||||
return_value=fake,
|
||||
), mock.patch("app.editor._ensure_page_domains"), mock.patch("app.editor._wait_ready"):
|
||||
cdp = editor.open_product({"debug_port": 9223}, "51100639511")
|
||||
|
||||
self.assertEqual("target-new", cdp.target_id)
|
||||
self.assertTrue(cdp.created_by_app)
|
||||
self.assertEqual("127.0.0.1:9223", cdp.cdp_host)
|
||||
create_tab_info.assert_called_once()
|
||||
|
||||
def test_collect_closes_only_auto_created_product_tab(self):
|
||||
cdp = FakeProductCDP("ws-new")
|
||||
cdp.target_id = "target-new"
|
||||
cdp.created_by_app = True
|
||||
cdp.cdp_host = "127.0.0.1:9222"
|
||||
|
||||
with mock.patch("app.editor.open_product", return_value=cdp), mock.patch(
|
||||
"app.editor.read_title",
|
||||
return_value="旧标题",
|
||||
), mock.patch(
|
||||
"app.editor.read_cover_src",
|
||||
return_value="https://down-ws-sg.vod.susercontent.com/cover.jpg",
|
||||
), mock.patch(
|
||||
"app.editor.download_cover",
|
||||
return_value="images/main/51100639510_old.jpg",
|
||||
), mock.patch("app.editor.close_tab", return_value=True) as close_tab:
|
||||
result = editor.collect(
|
||||
{"debug_port": 9222},
|
||||
{"item_id": "51100639510", "old_cover_path": "old.jpg"},
|
||||
)
|
||||
|
||||
self.assertEqual("旧标题", result["old_title"])
|
||||
self.assertTrue(cdp.closed)
|
||||
close_tab.assert_called_once_with("target-new", host="127.0.0.1:9222")
|
||||
|
||||
def test_collect_keeps_reused_product_tab_open(self):
|
||||
cdp = FakeProductCDP("ws-existing")
|
||||
cdp.target_id = "target-existing"
|
||||
cdp.created_by_app = False
|
||||
cdp.cdp_host = "127.0.0.1:9222"
|
||||
|
||||
with mock.patch("app.editor.open_product", return_value=cdp), mock.patch(
|
||||
"app.editor.read_title",
|
||||
return_value="旧标题",
|
||||
), mock.patch(
|
||||
"app.editor.read_cover_src",
|
||||
return_value="https://down-ws-sg.vod.susercontent.com/cover.jpg",
|
||||
), mock.patch(
|
||||
"app.editor.download_cover",
|
||||
return_value="images/main/51100639510_old.jpg",
|
||||
), mock.patch("app.editor.close_tab") as close_tab:
|
||||
editor.collect(
|
||||
{"debug_port": 9222},
|
||||
{"item_id": "51100639510", "old_cover_path": "old.jpg"},
|
||||
)
|
||||
|
||||
self.assertTrue(cdp.closed)
|
||||
close_tab.assert_not_called()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user