测试之家
  • Topics
  • QA
  • 招聘
  • 社区学堂新
  • 开源项目
  • 活动
  • Wiki
  • Sign Up
  • Sign In
会员
shangguanyi (上官一)
第 95287 位Users / 2024-10-17
7 篇帖子 • 46 条回帖
4 关注者
1 正在关注
0 收藏
未设置 GitHub 信息.
  • 个人信息
  • 专栏
  • 话题
  • 回帖
  • 收藏
  • 关注中
  • 关注者
  • 来点高级货:手搓自动化验证码登录注册自动化测试 at October 29, 2025

    这不巧了吗,我最近刚写了一个获取邮件信息的方法,再用正则表达式或者其他方式提取一下验证码

    from imapclient import IMAPClient
    import email
    from email.header import decode_header
    from email.utils import parseaddr
    
    
    def get_email(sender_email=None, folder="INBOX", subject_keyword=None,
                  only_unread=False, mark_as_read=False, limit=None):
        """
        使用 IMAPClient 获取邮件,并设置 IMAP ID 信息
        """
        IMAP_SERVER = "XXXX"
        EMAIL_ACCOUNT = "XXXX"
        PASSWORD = "XXXX"
    
        result = []
    
        with IMAPClient(IMAP_SERVER, ssl=True) as server:
            # 登录
            server.login(EMAIL_ACCOUNT, PASSWORD)
    
            # 设置 IMAP ID 信息
            server.id_({
                "name": "myname",
                "version": "1.0.0",
                "vendor": "myclient",
                "support-email": "testmail@test.com"
            })
    
            # 列出文件夹(调试用)
            folders = server.list_folders()
            print("所有文件夹:")
            for i in folders:
                print(i)
    
            # 选择目标文件夹
            try:
                server.select_folder(folder)
            except Exception as e:
                print(f"无法打开文件夹: {folder}\n{e}")
                return []
    
            # 搜索条件
            criteria = []
            if only_unread:
                criteria.append("UNSEEN")
            else:
                criteria.append("ALL")
            if sender_email:
                criteria.append(f'FROM "{sender_email}"')
    
            # 搜索邮件
            messages = server.search(criteria)
            if not messages:
                print("没有找到符合条件的邮件")
                return []
    
            print(f"找到 {len(messages)} 封符合条件的邮件")
    
            count = 0
            for msgid, data in server.fetch(messages, ["RFC822"]).items():
                msg = email.message_from_bytes(data[b"RFC822"])
    
                # 解码主题
                subject, encoding = decode_header(msg["Subject"])[0]
                if isinstance(subject, bytes):
                    subject = subject.decode(encoding or "utf-8", errors="ignore")
    
                if subject_keyword and subject_keyword not in subject:
                    continue
    
                # 解码发件人
                raw_from = msg.get("From")
                name, addr = parseaddr(raw_from)
                decoded_name = decode_header(name)[0][0]
                if isinstance(decoded_name, bytes):
                    decoded_name = decoded_name.decode("utf-8", errors="ignore")
                from_ = f"{decoded_name} <{addr}>"
    
                # 提取正文
                body = ""
                if msg.is_multipart():
                    for part in msg.walk():
                        content_type = part.get_content_type()
                        content_disposition = str(part.get("Content-Disposition"))
                        if content_type == "text/plain" and "attachment" not in content_disposition:
                            charset = part.get_content_charset() or "utf-8"
                            try:
                                body = part.get_payload(decode=True).decode(charset, errors="ignore")
                            except Exception:
                                body = ""
                            break
                else:
                    charset = msg.get_content_charset() or "utf-8"
                    body = msg.get_payload(decode=True).decode(charset, errors="ignore")
    
                result.append({
                    "subject": subject,
                    "from": from_,
                    "body": body
                })
    
                # 标记为已读
                if mark_as_read:
                    server.set_flags(msgid, ["\\Seen"])
    
                count += 1
                if limit and count >= limit:
                    break
    
        return result
    
    
    # 测试:读取未读邮件
    if __name__ == "__main__":
        emails = get_email(folder="INBOX", only_unread=True, mark_as_read=True limit=1)
        print("结果:", emails)
    
  • Agentic X:LLM Agent 在测试领域的探索与思考 at September 26, 2025

    我发现一个更省事的方法,直接调用 manus api (他支持直接打开浏览器),让他把测试步骤解析成 json 结构,接口虽然不会返回任务的详细结果,但会返回 task_id,等任务执行完成直接请求
    https://api.manus.im/session.v1.SessionService/GetSession 接口,
    lastDisplayMessage 字段就是最后返回的结果,可以直接拿去用,缺点就是仅支持 WEB 端且价格有点贵
    官网:https://manus.im/app
    api 文档:https://open.manus.ai/docs/api-reference/create-task

  • Agentic X:LLM Agent 在测试领域的探索与思考 at September 24, 2025

    多模态能力的 ui 测试平台是不是要把前端的页面结构传给 AI 呀,如果一条用例涉及多个页面,需要把多个页面结构一起传给 AI

  • 测试工程师 -支持远程 at September 22, 2025

    +1

  • UI 自动化平台中的用例管理 at September 09, 2025

    平台支持手机端 app UI 自动化测试吗,如果支持,是如何实现的呢

  • 告别 JavaScript 困扰!IterfaceTestPlatform 让 30 万 Python 测试工程师轻松拥抱接口自动化 at August 15, 2025

    接口都 404 了

  • 自动化测试 - 测试平台的结构化断言如何实现加减乘除的计算 at August 05, 2025

    如果后端使用的是 python,可以使用 eval 函数,其他语言应该也有相应的函数可以实现。
    可以在断言类型里加一个 eval,先算出来 a+b 的结果,最后再断言相等

    a = 1.555
    b = 2.456
    c = 4.01
    result = eval("round(a + b, 2)")  # 四舍五入保留两位小数
    
  • 关于 UI 自动化方案 at August 04, 2025

    https://testerhome.com/topics/40809

  • 需要调研市面上好用的自动化测试平台,采购使用,大家有推荐吗? at June 05, 2025

    接口自动化其实可以使用 apifox,我看 metersphere 免费的也仅支持接口自动化

  • pytest + allure + jenkins 集成之后,在 allure 的报告中要怎样设置才能让每条测试用例都能显示历史记录 at May 30, 2025

    ✅ Allure 历史记录的原理简述:
    Allure 会为每条用例计算一个 historyId(基于测试函数名和参数等生成的哈希值),并在 Jenkins 每次构建时将上次的 history 文件复制到 allure-results 中来进行比对。

    🎯 可能导致 “没有历史记录” 的原因:
    测试用例的名称或参数发生变化

    如果用例名变了、或参数化的参数值不同,会导致 historyId 变化,Allure 会认为是 “新用例”。

    上次构建的 history 数据未正确保存到当前构建

    Jenkins 需要在构建时,将上一个构建的 allure-results/history 目录复制到当前的 allure-results 中,否则没有 “历史”。

    pytest-allure 没有生成正确的 historyId

    在某些场景下(特别是动态生成用例或使用了不规范的参数名),可能导致 historyId 计算不一致。

    ✅ 正确设置历史记录的做法:

    1. 配置 Jenkins pipeline(或构建脚本)以传递历史数据 在每次运行前,从上一个构建中复制 allure-results/history 目录到当前的 allure-results:

    在 Jenkins pipeline 中加入

    cp -r previous_build/allure-report/history current_build/allure-results/
    示例(Pipeline 脚本):

    stage('Run Tests') {
    steps {
    script {
    // 假设你将上次构建的 history 存在 artifacts 中
    sh 'cp -r ${WORKSPACE}/previous_allure_report/history ${WORKSPACE}/allure-results || true'
    sh 'pytest --alluredir=allure-results'
    }
    }
    }

    1. 保持用例名称和参数一致 避免每次改动测试用例名或参数(特别是参数化用例)。

    对于参数化用例,尽量使用 @pytest.mark.parametrize 的 ids 参数来保持用例名称稳定。

    @pytest.mark.parametrize("user_input", [1, 2], ids=["input_1", "input_2"])
    def test_example(user_input):
    ...

    1. 使用 pytest 的唯一标识机制 避免动态构造 test 函数名或模块名,这会影响 Allure 的 historyId 生成。

    ✅ 推荐补充做法:
    在 Jenkins 中将构建 artifacts 中的 allure-results 和 allure-report 保留并归档。

    在 Allure Commandline 中使用 --clean 但确保历史文件提前合并进来。

    以上是 ChatGPT 的回复,我试了一下,主要就是将旧报告中的 history 文件夹拷贝出来,再放进新的 allure-results 目录中,在生成测试报告,就会有历史记录了。历史记录只会记录是否成功,不能查看详细信息,感觉用处不大。

  • 大家有遇到这公司吗? at May 27, 2025

    其他的有什么推荐呢

  • 迷茫 at May 07, 2025

    咱俩一样,先苟着吧

  • 有没有大佬指点一下 selenium4 怎么定位到这个元素呀 at February 14, 2025

    先点击下拉选项框 再点击下拉选项框的内容就可以吧,我用 playwright 就是这么操作的

  • 写了一个 web+wap+api 自动化测试平台,无偿分享源码,请大佬多多指教 at February 07, 2025
    Author only
  • 求助!想问下搞 UI 自动化怎么解决 CLOUDFLARE 验证的问题 at January 21, 2025

    让开发或运维加一下 ip 白名单

  • 写了一个 web+wap+api 自动化测试平台,无偿分享源码,请大佬多多指教 at January 21, 2025
    Author only
  • 前端有时候收不到后端转发的 WebSocket 信息,不知道哪里出了问题,请各位大佬看一下 at January 16, 2025

    感谢大佬 我用 redis 试了一下是可以的

  • 前端有时候收不到后端转发的 WebSocket 信息,不知道哪里出了问题,请各位大佬看一下 at January 16, 2025

    本地运行是单进程所以没问题,多进程有问题

  • 有没有好用的开源 UI 测试框架,希望能抄一下作业 at December 24, 2024

    playwright
    官网:https://playwright.dev/python/docs/intro

  • 求助使用 pytest+python+allure 测试低代码类项目,有没有大佬可以分享一下经验呢?每次都卡在一个元素定位上 at December 11, 2024

    报什么错误呀,如果是 element click intercepted
    方式一:
    next_btn = driver.find_element(By.XPATH,'xpath')
    driver.execute_script("arguments[0].click();", next_btn)# 点击
    方式二:
    actions = ActionChains(driver)
    actions.move_to_element(element).click().perform()

  • 写了一个 web+wap+api 自动化测试平台,无偿分享源码,请大佬多多指教 at November 21, 2024

    已添加

  • jmeter 压测问题 at November 14, 2024

    添加一个临界部分控制器

  • 求推荐占用服务器资源少的开源 UI 自动化测试平台(web 端) at October 30, 2024

    https://testerhome.com/topics/40809
    2 核 2G 就可以

  • 【ARUN】FastAPI&Vue 拥有无敌颜值且易用的全栈测试平台! 第七弹——风险跟踪/任务编排/数据同步监测/数据开发/代码统计 at October 25, 2024

    太牛了 有没有体验地址呀

  • 写了一个 web+wap+api 自动化测试平台,无偿分享源码,请大佬多多指教 at October 25, 2024

    可以 学到了

  • 1
  • 2
  • Next
  • 关于 / 活跃用户 / 中国移动互联网测试技术大会 / 反馈 / Github / API / 帮助推广
    TesterHome社区,测试之家,由众多测试工程师组织和维护的技术社区,致力于帮助新人成长,提高测试地位,推进质量发展。Inspired by RubyChina
    友情链接 WeTest腾讯质量开放平台 / InfoQ / 掘金 / SegmentFault / 测试窝 / 百度测试吧 / IT大咖说
    简体中文 / 正體中文 / English

    ©testerhome.com 测试之家   渝ICP备2022001292号
      渝公网安备 50022202000435号    版权所有 © 重庆年云聚力信息技术有限公司