This commit is contained in:
parent
492f2f6322
commit
dabed6e4f5
60
test/tools/debug_editer_validation.py
Normal file
60
test/tools/debug_editer_validation.py
Normal file
@ -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()
|
||||
79
test/tools/run_acceptance_suite.py
Normal file
79
test/tools/run_acceptance_suite.py
Normal file
@ -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.')
|
||||
90
test/tools/run_full_acceptance.py
Normal file
90
test/tools/run_full_acceptance.py
Normal file
@ -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('验收流程全部执行完毕!')
|
||||
56
test/tools/test_select_behavior.py
Normal file
56
test/tools/test_select_behavior.py
Normal file
@ -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()
|
||||
70
test/tools/test_send_and_check_contact.py
Normal file
70
test/tools/test_send_and_check_contact.py
Normal file
@ -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()
|
||||
63
test/tools/test_send_debug_log.py
Normal file
63
test/tools/test_send_debug_log.py
Normal file
@ -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()
|
||||
40
test/tools/test_verify_dropdown.py
Normal file
40
test/tools/test_verify_dropdown.py
Normal file
@ -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()
|
||||
Loading…
Reference in New Issue
Block a user