hkfires commited on
Commit
2221e12
·
verified ·
1 Parent(s): 615e7b3

feat: handle popup dialog and save screenshot on successful login

Browse files
Files changed (3) hide show
  1. browser/navigation.py +48 -14
  2. main.py +15 -0
  3. requirements.txt +2 -1
browser/navigation.py CHANGED
@@ -7,23 +7,45 @@ from utils.common import ensure_dir
7
  class KeepAliveError(Exception):
8
  pass
9
 
10
- def handle_untrusted_dialog(page: Page, logger=None):
11
  """
12
- 检查并处理 "Last modified by..." 的弹窗。
13
- 如果弹窗出现,则点击 "OK" 按钮。
14
  """
15
- ok_button_locator = page.get_by_role("button", name="OK")
16
-
 
 
 
 
 
17
  try:
18
- if ok_button_locator.is_visible(timeout=10000): # 等待最多10秒
19
- logger.info(f"检测到弹窗,正在点击 'OK' 按钮...")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
- ok_button_locator.click(force=True)
22
- logger.info(f"'OK' 按钮已点击")
23
- expect(ok_button_locator).to_be_hidden(timeout=1000)
24
- logger.info(f"弹窗已确认关闭")
 
25
  else:
26
- logger.info(f"在10秒内未检测到弹窗,继续执行...")
27
  except Exception as e:
28
  logger.info(f"检查弹窗时发生意外:{e},将继续执行...")
29
 
@@ -34,8 +56,20 @@ def handle_successful_navigation(page: Page, logger, cookie_file_config, shutdow
34
  logger.info("已成功到达目标页面")
35
  page.click('body') # 给予页面焦点
36
 
37
- # 检查并处理 "Last modified by..." 的弹窗
38
- handle_untrusted_dialog(page, logger=logger)
 
 
 
 
 
 
 
 
 
 
 
 
39
 
40
  if cookie_validator:
41
  logger.info("Cookie验证器已创建,将定期验证Cookie有效性")
 
7
  class KeepAliveError(Exception):
8
  pass
9
 
10
+ def handle_popup_dialog(page: Page, logger=None):
11
  """
12
+ 检查并处理弹窗。
13
+ 交替点击 Got it 和 Continue to the app 按钮直到没有弹窗。
14
  """
15
+ logger.info("开始处理弹窗...")
16
+
17
+ # 定义需要查找的按钮列表
18
+ button_names = ["Got it", "Continue to the app"]
19
+ max_iterations = 10 # 最多尝试10轮,防止死循环
20
+ total_clicks = 0
21
+
22
  try:
23
+ for iteration in range(max_iterations):
24
+ clicked_in_round = False
25
+
26
+ # 等待页面稳定
27
+ time.sleep(1)
28
+
29
+ # 每轮交替尝试点击所有按钮
30
+ for button_name in button_names:
31
+ try:
32
+ button_locator = page.locator(f'button:visible:has-text("{button_name}")')
33
+ if button_locator.count() > 0 and button_locator.first.is_visible():
34
+ # logger.info(f"检测到弹窗: 点击 '{button_name}'")
35
+ button_locator.first.click(force=True, timeout=2000)
36
+ total_clicks += 1
37
+ clicked_in_round = True
38
+ time.sleep(1)
39
+ except:
40
+ pass
41
 
42
+ if not clicked_in_round:
43
+ break
44
+
45
+ if total_clicks > 0:
46
+ logger.info(f"弹窗处理完成, 共点击 {total_clicks} 次")
47
  else:
48
+ logger.info("未检测到弹窗")
49
  except Exception as e:
50
  logger.info(f"检查弹窗时发生意外:{e},将继续执行...")
51
 
 
56
  logger.info("已成功到达目标页面")
57
  page.click('body') # 给予页面焦点
58
 
59
+ # 检查并处理弹窗
60
+ handle_popup_dialog(page, logger=logger)
61
+
62
+ # 保存登录成功截图
63
+ try:
64
+ from datetime import datetime
65
+ screenshot_dir = logs_dir()
66
+ ensure_dir(screenshot_dir)
67
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
68
+ screenshot_path = os.path.join(screenshot_dir, f"SUCCESS_{cookie_file_config}_{timestamp}.png")
69
+ page.screenshot(path=screenshot_path)
70
+ logger.info(f"已保存登录成功截图: {screenshot_path}")
71
+ except Exception as e:
72
+ logger.warning(f"保存截图失败: {e}")
73
 
74
  if cookie_validator:
75
  logger.info("Cookie验证器已创建,将定期验证Cookie有效性")
main.py CHANGED
@@ -5,6 +5,21 @@ import signal
5
  import sys
6
  import time
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  from browser.instance import run_browser_instance
9
  from utils.logger import setup_logging
10
  from utils.paths import cookies_dir, logs_dir
 
5
  import sys
6
  import time
7
 
8
+ # 加载 .env 文件(仅在非 Docker 环境且文件存在时)
9
+ def load_env_file():
10
+ """加载 .env 文件,不影响已存在的环境变量"""
11
+ if os.environ.get("DOCKER_ENV") or os.path.exists("/.dockerenv"):
12
+ return # Docker 环境,跳过加载
13
+ try:
14
+ from dotenv import load_dotenv
15
+ env_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".env")
16
+ if os.path.exists(env_path):
17
+ load_dotenv(env_path, override=False) # override=False 不覆盖已有环境变量
18
+ except ImportError:
19
+ pass # python-dotenv 未安装,跳过
20
+
21
+ load_env_file()
22
+
23
  from browser.instance import run_browser_instance
24
  from utils.logger import setup_logging
25
  from utils.paths import cookies_dir, logs_dir
requirements.txt CHANGED
@@ -30,4 +30,5 @@ typing_extensions==4.14.0
30
  ua-parser==1.0.1
31
  ua-parser-builtins==0.18.0.post1
32
  urllib3==2.4.0
33
- yarl==1.20.1
 
 
30
  ua-parser==1.0.1
31
  ua-parser-builtins==0.18.0.post1
32
  urllib3==2.4.0
33
+ yarl==1.20.1
34
+ python-dotenv>=1.0.0