diff --git a/test/tools/debug_editer_validation.py b/test/tools/debug_editer_validation.py new file mode 100644 index 0000000..86adb21 --- /dev/null +++ b/test/tools/debug_editer_validation.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +import os, sys +from playwright.sync_api import sync_playwright + +with sync_playwright() as p: + browser = p.chromium.launch( + headless=True, + args=[ + '--no-sandbox', + '--ignore-certificate-errors', + '--host-resolver-rules=MAP mail.solit.cn 47.108.78.12, MAP solit.cn 47.108.78.12' + ] + ) + context = browser.new_context(viewport={'width': 1440, 'height': 900}, ignore_https_errors=True) + page = context.new_page() + + page.goto('https://mail.solit.cn/#/login', wait_until='networkidle') + inputs = page.locator('.login-content input') + inputs.nth(0).fill('xuans') + inputs.nth(1).fill('12345678') + page.locator('button.login-btn').click() + page.wait_for_timeout(2500) + + page.goto('https://mail.solit.cn/#/editer', wait_until='networkidle') + page.wait_for_timeout(2000) + + # 打印页面上的 sender 相关信息 + sender_text = page.locator('.sender-selector').inner_text() + print('Sender text:', repr(sender_text)) + + # 尝试用正确的选择器选 input + input_elem = page.locator('.border-less-select input').first + input_elem.click() + page.keyboard.type('testuser2@solit.cn') + page.wait_for_timeout(500) + page.keyboard.press('Enter') + page.wait_for_timeout(500) + + tags = page.locator('.border-less-select .el-tag') + print('Tags after typing & Enter:', tags.count()) + if tags.count() > 0: + print('Tag content:', tags.first.inner_text()) + + # 填写主题 + page.locator('.subject-row input').fill('自动化验证测试邮件') + + # 填写正文 + page.locator('.editor-content').click() + page.keyboard.type('正文内容...') + page.wait_for_timeout(500) + + page.locator('.send-btn').click() + page.wait_for_timeout(1000) + + errors = page.locator('.el-form-item__error') + print('Form errors count:', errors.count()) + for i in range(errors.count()): + print('Error', i, ':', errors.nth(i).inner_text()) + + browser.close() diff --git a/test/tools/run_acceptance_suite.py b/test/tools/run_acceptance_suite.py new file mode 100644 index 0000000..093dfe7 --- /dev/null +++ b/test/tools/run_acceptance_suite.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +import os, sys +from playwright.sync_api import sync_playwright + +output_dir = os.path.join(os.getcwd(), 'test-log', 'acceptance_contact_security') +os.makedirs(output_dir, exist_ok=True) + +with sync_playwright() as p: + browser = p.chromium.launch( + headless=True, + args=[ + '--no-sandbox', + '--ignore-certificate-errors', + '--host-resolver-rules=MAP mail.solit.cn 47.108.78.12, MAP solit.cn 47.108.78.12' + ] + ) + context = browser.new_context(viewport={'width': 1440, 'height': 900}, ignore_https_errors=True) + page = context.new_page() + + # 1. 登录 + print('--- Step 1: Login ---') + page.goto('https://mail.solit.cn/#/login', wait_until='networkidle') + inputs = page.locator('.login-content input') + inputs.nth(0).fill('xuans') + inputs.nth(1).fill('12345678') + page.locator('button.login-btn').click() + page.wait_for_timeout(2500) + page.screenshot(path=os.path.join(output_dir, '01_logged_in.png')) + print('Logged in, URL:', page.url) + + # 2. 验证收件箱安全提示 + print('--- Step 2: Inbox Security Tags ---') + page.goto('https://mail.solit.cn/#/list?tag=0', wait_until='networkidle') + page.wait_for_timeout(2000) + page.screenshot(path=os.path.join(output_dir, '02_inbox_list.png')) + + danger_tags = page.locator('.mail-status-tags .el-tag--danger') + print('Inbox danger tag count:', danger_tags.count()) + for i in range(danger_tags.count()): + print('Danger tag text:', danger_tags.nth(i).inner_text()) + + # 3. 验证发件箱状态标签与错误详情 + print('--- Step 3: Outbox Status Tags & Error Dialog ---') + page.goto('https://mail.solit.cn/#/list?tag=1', wait_until='networkidle') + page.wait_for_timeout(2000) + page.screenshot(path=os.path.join(output_dir, '03_outbox_list.png')) + success_tags = page.locator('.mail-status-tags .el-tag--success') + fail_tags = page.locator('.mail-status-tags .el-tag--danger') + print('Outbox success tag count:', success_tags.count()) + print('Outbox fail tag count:', fail_tags.count()) + + if fail_tags.count() > 0: + print('Clicking fail tag...') + fail_tags.first.click() + page.wait_for_timeout(1000) + page.screenshot(path=os.path.join(output_dir, '04_outbox_error_dialog.png')) + close_btn = page.locator('.el-dialog button') + if close_btn.count() > 0: + close_btn.first.click() + page.wait_for_timeout(500) + + # 4. 验证写信页联系人 + print('--- Step 4: Editer Page Contacts ---') + page.goto('https://mail.solit.cn/#/editer', wait_until='networkidle') + page.wait_for_timeout(2000) + page.screenshot(path=os.path.join(output_dir, '05_editer_page.png')) + + select_input = page.locator('.border-less-select') + select_input.click() + page.wait_for_timeout(800) + page.screenshot(path=os.path.join(output_dir, '06_editer_contacts_dropdown.png')) + + dropdown_items = page.locator('.el-select-dropdown__item') + print('Dropdown items count:', dropdown_items.count()) + for i in range(dropdown_items.count()): + print('Item:', dropdown_items.nth(i).inner_text()) + + browser.close() + print('Acceptance check finished.') diff --git a/test/tools/run_full_acceptance.py b/test/tools/run_full_acceptance.py new file mode 100644 index 0000000..d9f9606 --- /dev/null +++ b/test/tools/run_full_acceptance.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +import os, sys +from playwright.sync_api import sync_playwright + +output_dir = os.path.join(os.getcwd(), 'test-log', 'acceptance_contact_security') +os.makedirs(output_dir, exist_ok=True) + +with sync_playwright() as p: + browser = p.chromium.launch( + headless=True, + args=[ + '--no-sandbox', + '--ignore-certificate-errors', + '--host-resolver-rules=MAP mail.solit.cn 47.108.78.12, MAP solit.cn 47.108.78.12' + ] + ) + context = browser.new_context(viewport={'width': 1440, 'height': 900}, ignore_https_errors=True) + page = context.new_page() + + # 1. 登录 xuans + print('1. 登录 xuans...') + page.goto('https://mail.solit.cn/#/login', wait_until='networkidle') + inputs = page.locator('.login-content input') + inputs.nth(0).fill('xuans') + inputs.nth(1).fill('12345678') + page.locator('button.login-btn').click() + page.wait_for_timeout(2500) + + # 2. 检查收件箱中的信任发件人交互 + print('2. 检查收件箱信任操作...') + page.goto('https://mail.solit.cn/#/list?tag=0', wait_until='networkidle') + page.wait_for_timeout(2000) + + danger_tags = page.locator('.mail-status-tags .el-tag--danger') + print('当前收件箱疑似不安全标签数量:', danger_tags.count()) + if danger_tags.count() > 0: + print('点击第一个不安全标签...') + danger_tags.first.click() + page.wait_for_timeout(500) + page.screenshot(path=os.path.join(output_dir, '30_trust_sender_confirm_box.png')) + + confirm_btn = page.locator('.el-message-box .el-button--primary') + print('确认按钮数量:', confirm_btn.count()) + confirm_btn.click() + page.wait_for_timeout(1500) + page.screenshot(path=os.path.join(output_dir, '31_after_trusted.png')) + + # 3. 检查发件箱标签 + print('3. 检查发件箱...') + page.goto('https://mail.solit.cn/#/list?tag=%7B%22type%22%3A1%2C%22status%22%3A-1%7D', wait_until='networkidle') + page.wait_for_timeout(2000) + page.screenshot(path=os.path.join(output_dir, '32_outbox_view.png')) + + # 4. 进入写信页,测试删除联系人 + print('4. 写信页测试删除联系人...') + page.goto('https://mail.solit.cn/#/editer', wait_until='networkidle') + page.wait_for_timeout(2000) + + wrapper = page.locator('.border-less-select .el-select__wrapper') + wrapper.click() + page.wait_for_timeout(500) + + del_icon = page.locator('.contact-del-icon:visible') + print('删除图标数量:', del_icon.count()) + if del_icon.count() > 0: + del_icon.first.click() + page.wait_for_timeout(1000) + page.screenshot(path=os.path.join(output_dir, '33_after_delete_contact.png')) + + # 5. 验证多租户隔离:登录 testuser2 + print('5. 验证多租户隔离...') + page.goto('https://mail.solit.cn/#/login', wait_until='networkidle') + inputs = page.locator('.login-content input') + inputs.nth(0).fill('testuser2') + inputs.nth(1).fill('12345678') + page.locator('button.login-btn').click() + page.wait_for_timeout(2500) + + page.goto('https://mail.solit.cn/#/editer', wait_until='networkidle') + page.wait_for_timeout(2000) + + wrapper = page.locator('.border-less-select .el-select__wrapper') + wrapper.click() + page.wait_for_timeout(500) + page.screenshot(path=os.path.join(output_dir, '34_testuser2_contacts_dropdown.png')) + user2_items = page.locator('.el-select-dropdown__item:visible') + print('testuser2 联系人下拉选项数:', user2_items.count()) + + browser.close() + print('验收流程全部执行完毕!') diff --git a/test/tools/test_select_behavior.py b/test/tools/test_select_behavior.py new file mode 100644 index 0000000..7c9211a --- /dev/null +++ b/test/tools/test_select_behavior.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +import os, sys +from playwright.sync_api import sync_playwright + +with sync_playwright() as p: + browser = p.chromium.launch( + headless=True, + args=[ + '--no-sandbox', + '--ignore-certificate-errors', + '--host-resolver-rules=MAP mail.solit.cn 47.108.78.12, MAP solit.cn 47.108.78.12' + ] + ) + context = browser.new_context(viewport={'width': 1440, 'height': 900}, ignore_https_errors=True) + page = context.new_page() + + page.goto('https://mail.solit.cn/#/login', wait_until='networkidle') + inputs = page.locator('.login-content input') + inputs.nth(0).fill('xuans') + inputs.nth(1).fill('12345678') + page.locator('button.login-btn').click() + page.wait_for_timeout(2500) + + page.goto('https://mail.solit.cn/#/editer', wait_until='networkidle') + page.wait_for_timeout(2000) + + # 观察 el-select 结构 + wrapper = page.locator('.border-less-select .el-select__wrapper') + print('Wrapper count:', wrapper.count()) + wrapper.click() + page.wait_for_timeout(500) + + # 打印当前 active 元素或者向页面输入 + page.keyboard.type('testuser2@solit.cn') + page.wait_for_timeout(500) + page.screenshot(path='test-log/typing_step1.png') + + # 查看下拉菜单是否有内容 + dropdown_visible = page.locator('.el-select-dropdown:visible') + print('Dropdown visible:', dropdown_visible.count()) + items = page.locator('.el-select-dropdown__item:visible') + print('Dropdown items count:', items.count()) + for i in range(items.count()): + print('Item', i, ':', items.nth(i).inner_text()) + + # 按 Enter + page.keyboard.press('Enter') + page.wait_for_timeout(500) + page.screenshot(path='test-log/after_enter.png') + + tags = page.locator('.border-less-select .el-tag') + print('Tags after enter:', tags.count()) + for i in range(tags.count()): + print('Tag', i, ':', tags.nth(i).inner_text()) + + browser.close() diff --git a/test/tools/test_send_and_check_contact.py b/test/tools/test_send_and_check_contact.py new file mode 100644 index 0000000..4a33d47 --- /dev/null +++ b/test/tools/test_send_and_check_contact.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +import os, sys, time +from playwright.sync_api import sync_playwright + +output_dir = os.path.join(os.getcwd(), 'test-log', 'acceptance_contact_security') +os.makedirs(output_dir, exist_ok=True) + +with sync_playwright() as p: + browser = p.chromium.launch( + headless=True, + args=[ + '--no-sandbox', + '--ignore-certificate-errors', + '--host-resolver-rules=MAP mail.solit.cn 47.108.78.12, MAP solit.cn 47.108.78.12' + ] + ) + context = browser.new_context(viewport={'width': 1440, 'height': 900}, ignore_https_errors=True) + page = context.new_page() + + # 登录 + print('1. 登录 xuans...') + page.goto('https://mail.solit.cn/#/login', wait_until='networkidle') + inputs = page.locator('.login-content input') + inputs.nth(0).fill('xuans') + inputs.nth(1).fill('12345678') + page.locator('button.login-btn').click() + page.wait_for_timeout(2500) + + # 打开写信页 + print('2. 前往写信页...') + page.goto('https://mail.solit.cn/#/editer', wait_until='networkidle') + page.wait_for_timeout(2000) + + # 填写收件人 + select_box = page.locator('.border-less-select') + select_box.click() + page.wait_for_timeout(300) + page.keyboard.type('testuser2@solit.cn') + page.wait_for_timeout(500) + page.keyboard.press('Enter') + page.wait_for_timeout(500) + + # 填写主题 + page.locator('.subject-row input').fill('自动化联系人验证测试') + # 填写正文 + page.locator('.editor-content').click() + page.keyboard.type('测试正文:验证发信后收件人是否记录入库。') + page.wait_for_timeout(500) + + print('3. 点击发送...') + page.locator('.send-btn').click() + page.wait_for_timeout(4000) + page.screenshot(path=os.path.join(output_dir, '10_sent_first_mail.png')) + + # 再次前往写信页,查看下拉列表 + print('4. 重新进入写信页,查看历史联系人下拉...') + page.goto('https://mail.solit.cn/#/editer', wait_until='networkidle') + page.wait_for_timeout(2000) + + select_box = page.locator('.border-less-select') + select_box.click() + page.wait_for_timeout(800) + page.screenshot(path=os.path.join(output_dir, '11_contacts_dropdown_after_send.png')) + + items = page.locator('.el-select-dropdown__item:visible') + print('下拉数量:', items.count()) + for i in range(items.count()): + print('Item', i, ':', items.nth(i).inner_text()) + + browser.close() diff --git a/test/tools/test_send_debug_log.py b/test/tools/test_send_debug_log.py new file mode 100644 index 0000000..12a0308 --- /dev/null +++ b/test/tools/test_send_debug_log.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +import os, sys +from playwright.sync_api import sync_playwright + +with sync_playwright() as p: + browser = p.chromium.launch( + headless=True, + args=[ + '--no-sandbox', + '--ignore-certificate-errors', + '--host-resolver-rules=MAP mail.solit.cn 47.108.78.12, MAP solit.cn 47.108.78.12' + ] + ) + context = browser.new_context(viewport={'width': 1440, 'height': 900}, ignore_https_errors=True) + page = context.new_page() + + page.on('console', lambda msg: print('[CONSOLE]', msg.type, msg.text)) + page.on('pageerror', lambda err: print('[PAGE ERROR]', err)) + page.on('response', lambda res: print('[NET RES]', res.status, res.url) if '/api/' in res.url else None) + + page.goto('https://mail.solit.cn/#/login', wait_until='networkidle') + inputs = page.locator('.login-content input') + inputs.nth(0).fill('xuans') + inputs.nth(1).fill('12345678') + page.locator('button.login-btn').click() + page.wait_for_timeout(2500) + + page.goto('https://mail.solit.cn/#/editer', wait_until='networkidle') + page.wait_for_timeout(2000) + + # 选择收件人 + wrapper = page.locator('.border-less-select .el-select__wrapper') + wrapper.click() + page.wait_for_timeout(300) + page.keyboard.type('testuser2@solit.cn') + page.wait_for_timeout(500) + + item = page.locator('.el-select-dropdown__item:visible').first + item.click() + page.wait_for_timeout(500) + + tags = page.locator('.border-less-select .el-tag') + print('Tags count:', tags.count()) + + # 填写主题 + page.locator('.subject-row input').fill('自动化测试验证收件人') + + # 填写正文 + page.locator('.editor-content').click() + page.keyboard.type('测试正文内容123456') + page.wait_for_timeout(500) + + print('Clicking send...') + page.locator('.send-btn').click() + page.wait_for_timeout(4000) + + print('After click send, URL:', page.url) + errors = page.locator('.el-form-item__error') + print('Errors count:', errors.count()) + for i in range(errors.count()): + print('Error text:', errors.nth(i).inner_text()) + + browser.close() diff --git a/test/tools/test_verify_dropdown.py b/test/tools/test_verify_dropdown.py new file mode 100644 index 0000000..424a333 --- /dev/null +++ b/test/tools/test_verify_dropdown.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +import os, sys +from playwright.sync_api import sync_playwright + +with sync_playwright() as p: + browser = p.chromium.launch( + headless=True, + args=[ + '--no-sandbox', + '--ignore-certificate-errors', + '--host-resolver-rules=MAP mail.solit.cn 47.108.78.12, MAP solit.cn 47.108.78.12' + ] + ) + context = browser.new_context(viewport={'width': 1440, 'height': 900}, ignore_https_errors=True) + page = context.new_page() + + page.goto('https://mail.solit.cn/#/login', wait_until='networkidle') + inputs = page.locator('.login-content input') + inputs.nth(0).fill('xuans') + inputs.nth(1).fill('12345678') + page.locator('button.login-btn').click() + page.wait_for_timeout(2500) + + page.goto('https://mail.solit.cn/#/editer', wait_until='networkidle') + page.wait_for_timeout(2000) + + # 展开下拉列表 + wrapper = page.locator('.border-less-select .el-select__wrapper') + wrapper.click() + page.wait_for_timeout(500) + + items = page.locator('.el-select-dropdown__item:visible') + print('Dropdown items count:', items.count()) + for i in range(items.count()): + print('Item', i, ':', items.nth(i).inner_text()) + + # 截图 + page.screenshot(path='test-log/contacts_dropdown_rendered.png') + + browser.close()