• 年轻人别想不开呀,开发岗位可以有很多,专职测开屈指可数,很多挂着测开 title 的岗位可都是业务功能测试哦

  • stagehand 有体验过的吗 at 2025年08月20日

    我个人觉得这个落地的话,还需要跟公司申请一笔经费,以往自动化都不需要用钱,现在用上大模型还得花钱,能不能审批通过都是个问题,后期还得出份数据证明比免费的强

  • 打奶泡练习 --- 原理 at 2025年08月20日

    除了燕麦奶,其他植物奶形成的泡沫壁较薄,不稳定,容易消泡


  • 我都没去换过

  • diy 小程序 at 2025年08月20日

    你的宠物店运营得怎样?

  • 行业动态 - 二十七期 at 2025年08月19日

    同感,我现在有什么问题也是第一时间问大模型,我之前找绝望主妇的台本 PDF 下载链接找不到,deepseek 居然可以给我找到一个美剧台词免费下载的网址,真 6

  • stagehand 有体验过的吗 at 2025年08月19日

    我安装了 stagehand 的库,然后 python 直接调用库来用就行了。但是感觉这个工具不太靠谱,粗看原理就是把 dom 结构全部发给语言大模型,然后让大模型把关键信息找出来再返回,一方面像上面那个大佬说的:不太稳定和执行缓慢。另一方面我是觉得 token 的消耗有点大,本地部署估计挺悬,非满血的大模型出来的效果更难保证。所以感觉这工具有点像坤肋

  • 行业动态 - 二十七期 at 2025年08月18日

    组织架构调整好像不是什么好词,裁员前兆?

  • stagehand 有体验过的吗 at 2025年08月18日

    我主要是遇到:

    1. enable_thinking=False
    2. 使用结构化输出 (response_format) 时,【dashscope 要求消息中必须包含 "json" 关键词
    3. 这框架把千问模型的地址默认为国际地址,换成国内的需要自己设置下

    这三个问题,在我各种瞎调下,是可以跑了,就是这个 token 的消耗还挺大,感觉实用程度有待商榷

    import asyncio
    import os
    from stagehand import Stagehand, StagehandConfig
    from dotenv import load_dotenv
    import litellm
    
    # 保存原始completion函数
    original_completion = litellm.completion
    
    # 创建一个新的completion函数,确保总是包含enable_thinking=False,并修复Dashscope的json要求
    def patched_completion(*args, **kwargs):
        # 确保extra_body存在并且包含enable_thinking=False
        if "extra_body" not in kwargs or kwargs["extra_body"] is None:
            kwargs["extra_body"] = {}
        kwargs["extra_body"]["enable_thinking"] = False
    
    
        # 修复Dashscope的json要求 - 确保messages中包含"json"关键词
        if "response_format" in kwargs and kwargs["response_format"] is not None:
            # 检查是否是json_schema格式
            if hasattr(kwargs["response_format"], '__dict__') or isinstance(kwargs["response_format"], dict):
                # 确保系统消息中包含json关键词
                if "messages" in kwargs and len(kwargs["messages"]) > 0:
                    system_message = kwargs["messages"][0]
                    if system_message["role"] == "system" and "json" not in system_message["content"].lower():
                        # 添加json关键词到系统消息中
                        system_message["content"] += " Respond in JSON format."
    
        try:
            result = original_completion(*args, **kwargs)
            return result
        except Exception as e:
            raise
    
    # 替换litellm.completion
    litellm.completion = patched_completion
    
    load_dotenv()
    
    async def main():
        # 确保环境变量正确设置
        os.environ['DASHSCOPE_API_BASE'] = "https://dashscope.aliyuncs.com/compatible-mode/v1"
    
        # 检查API密钥
        api_key = os.getenv("DASHSCOPE_API_KEY")
        if not api_key:
            print("错误: 未找到DASHSCOPE_API_KEY环境变量")
            return
    
        # 配置 Stagehand 使用 DashScope 的 Qwen 模型
        config = StagehandConfig(
            env="LOCAL",
            model_name="dashscope/qwen3-14b",
            model_api_key=os.getenv("DASHSCOPE_API_KEY"),
            headless=False,              # 显示浏览器窗口
            verbose=3,                   # 最详细的日志输出
            debug_dom=True,              # 启用DOM调试
            dom_settle_timeout_ms=60000, # 增加DOM稳定超时时间
            wait_for_network_idle_ms=5000, # 等待网络空闲的时间
            local_browser_launch_options={  # 本地浏览器启动选项
                "slow_mo": 100,          # 减慢操作速度以便观察
                "devtools": True,        # 打开开发者工具
                "args": [
                    "--window-size=1920,1080",  # 设置窗口大小
                    "--disable-web-security",   # 禁用网络安全限制
                    "--disable-features=IsolateOrigins,site-per-process"  # 禁用某些隔离功能
                ]
            }
        )
    
        # 初始化 Stagehand
        stagehand = Stagehand(config)
    
        try:
            await stagehand.init()
            page = stagehand.page
    
            print("=== 必应搜索测试任务 ===")
    
            # 1. 访问必应
            print("1. 正在访问必应...")
            await page.goto("https://cn.bing.com/")
            print("   已访问必应")
    
            # 等待页面加载完成
            await asyncio.sleep(3)
    
            # 2. 输入搜索词
            print("2. 正在输入搜索词...")
            await page.act("在搜索框中输入搜索词'天气'")
            print("   已输入搜索词")
    
            # 等待输入完成
            await asyncio.sleep(2)
    
            # 3. 点击搜索
            print("3. 正在点击搜索按钮...")
            await page.act("点击搜索按钮")
            print("   已点击搜索按钮")
    
            # 等待搜索结果页面加载
            await asyncio.sleep(5)
    
            # 验证操作结果
            print("4. 正在验证搜索结果...")
            title = await page.title()
            print(f"   当前页面标题: {title}")
    
            # 获取页面URL验证是否跳转
            current_url = page.url
            print(f"   当前页面URL: {current_url}")
    
            # 提取页面主要内容
            print("5. 正在提取搜索结果...")
            content = await page.extract("提取页面中与天气相关的主要信息", schema=None)
            print(f"   搜索结果: {content}")
    
            # 保持浏览器打开一段时间以便观察
            print("6. 保持浏览器打开10秒钟以便观察...")
            await asyncio.sleep(10)
    
            print("=== 必应搜索测试完成 ===")
    
        except Exception as e:
            print(f"发生错误: {e}")
            import traceback
            traceback.print_exc()
    
        finally:
            input("按回车键关闭浏览器...")
            await stagehand.close()
    
    if __name__ == "__main__":
        asyncio.run(main())
    

  • 顶不住,我也觉得页面好丑
    这个是之前在豆包上生成的?样式都出问题了

    1. 理清业务,按照业务的特性,对表单进行不同流程分类的拆分

    2. 对分类好的表单,做关键特性识别:必填、输入规则、默认值、是否有联动依赖、交互等了解清楚

    3.等价类划分的用例,用正交表缩减用例量

    你去看用例设计的那些基础理论,然后与产品开发多沟通,基本能完成测试的

  • 这世界上最可怕的就是明明工资设置得不高,但是面试时按全栈高级研发的角度去问,这类工贼是最恶心的

  • stagehand 有体验过的吗 at 2025年08月17日

    你能发下你的代码看下吗?

  • stagehand 有体验过的吗 at 2025年08月15日

    大佬成功了吗? 我之前试了千问和 deepseek 都不行,这个配置那个时候我看到了,但是一直返回这个报错

    {"error":{"message":"This response_format type is unavailable now","type":"invalid_request_error","param":null,"code":"invalid_request_error"}} 
    

    Stagehand 会将网页的 dom 结构发送给 llm 进行分析,这可能包含页面上的敏感信息, 你这是公司要用,还是自己调研的?

  • stagehand 有体验过的吗 at 2025年08月15日

    大佬,你那边可以用吗?
    我用 deepseek 做调试时,一直给我返回 deepseek api 目前不支持 Stagehand 所需的特定 response_format 类型的报错

  • 如果 AI 辅助能提高公司盈利能力,那它就是必需品,如已经有公司公费给程序员买 cursor。
    但现在更多是用人部门随手加上去的,也不用太在意,因为面试你的人,在测试领域,他自己也不知道能干嘛

  • stagehand 有体验过的吗 at 2025年08月13日

    我帮你试了下,直接安装就可以用了,就是这个模型好像只能用国外的

    1. 安装
    pip install stagehand
    python -m playwright install  #playWright相关依赖
    pip install python-dotenv
    

    2.设置环境变量,项目文件夹里创建.env 文件

    # 前面这两个配置呢,是如果你要用云端Browserbase调试,就配置
    export BROWSERBASE_API_KEY="your_browserbase_api_key"
    export BROWSERBASE_PROJECT_ID="your_browserbase_project_id"
    
    # 这个是你要用的大模型密钥
    export MODEL_API_KEY="your_model_api_key"  # OpenAI, Anthropic, etc.
    

    3.本地创建文件,如 demo.py

    import asyncio
    import os
    from stagehand import Stagehand, StagehandConfig
    from dotenv import load_dotenv
    
    #读取.env配置文件
    load_dotenv()
    
    async def main():
        config = StagehandConfig(
            env="LOCAL",    #你这里想要用本地浏览器就local,如果是云的就用"BROWSERBASE"
    
           # 这两个配置是云端调试时使用,如果是本地就可以注释掉了
            api_key=os.getenv("BROWSERBASE_API_KEY"),       
            project_id=os.getenv("BROWSERBASE_PROJECT_ID"),
    
           #填写你要用的模型,密钥在.env文件配置
            model_name="gpt-4o",
            model_api_key=os.getenv("MODEL_API_KEY")
    
          # 这里你可以做这些配置
                 headless=True,   #打开调试窗口
                 verbose=3,
                 debug_dom=True
        )
    
        stagehand = Stagehand(config)
    
        try:
            await stagehand.init()
            page = stagehand.page
    
            await page.goto("填写你要跳转的网页地址")
            await page.act("自然语言写明你要的操作")
    
            result = await page.extract("extract the main heading of the page")
    
            print(f"Extracted: {result}")
    
        finally:
            await stagehand.close()
    
    if __name__ == "__main__":
        asyncio.run(main())
    
    

    4 运行 python demo.py 即可

    5 相关流程顺序:

    1. 页面导航page.goto(url)
    2. 页面观察observe()
    3. 页面执行操作act()
    4. 页面数据提取extract()
    
    eg:
    # 1. 使用 observe() 找到元素
    search_box = await page.observe("找到页面顶部的搜索框")
    
    # 2. 使用 act() 执行操作
    await page.act("在搜索框中输入'人工智能发展'并按下回车键")
    
    # 3. 等待页面加载完成
    await page.wait_for_load_state("networkidle")
    
    # 4. 使用 extract() 提取数据
    introduction = await page.extract("提取关于deepseek的全部文章链接")
    

    6 核心方法
    observe() 方法用于分析当前页面,根据自然语言指令识别和定位特定的页面元素。它不会执行任何操作,只是返回关于找到元素的信息。

    # 查找页面上的登录按钮
    login_button = await page.observe("找到登录按钮")
    
    # 查找特定的文章链接
    article_link = await page.observe("找到关于AI的最新文章链接")
    
    # 查找搜索框
    search_box = await page.observe("找到页面顶部的搜索输入框")
    
    

    act() 方法用于在页面上执行具体的操作,如点击、输入文本、导航等。它接受自然语言指令并将其转换为具体的浏览器操作。

    # 点击按钮
    await page.act("点击登录按钮")
    
    # 输入文本
    await page.act("在搜索框中输入'人工智能'")
    
    # 导航操作
    await page.act("点击第一篇文章链接")
    
    # 复合操作
    await page.act("填写用户名为'user123',密码为'password123',然后点击登录")
    

    extract() 方法用于从页面中提取信息。如果不指定特定的数据格式,它可以返回自然语言描述的内容。

    # 直接用自然语言提取信息
    content = await page.extract("提取页面的主要内容")
    print(content)
    
    # 提取特定信息
    title = await page.extract("提取文章标题")
    author = await page.extract("提取作者姓名")
    summary = await page.extract("提取文章摘要")
    

    就这个模型我用 deepseek 整不了,只能用 gpt 的,貌似没有兼容

  • 仅楼主可见
  • 老哥也是大起大落过,特别是这个【2015 年生过一场大病】
    据我认识的人来说,生过大病的人都会看事情看的很透,对生活看得很开

  • 为何你的发言,总让我感觉到一股浓浓的【阿里味】???

  • 小孩子不懂事,测着玩的

  • 好的

  • 多拜神,祈求来贵人

  • 就像一楼说的

    1. 设立主流程冒烟用例
    2. 不符合就需要公告到相关领导

    规则和流程其实不需要写太多,实际情况复杂多变,类似你设立的【基础质量不达标】这个,事实上你发现超 45 个 bug 了,那实际工作量就已经做了,不管是打回还是修复后重新验证,工作量都差不多。

    而且需要认清一个现实是,项目打回并不是换开发,
    现实就是你依然得和这个开发一起磨合,打回几次都改变不了上线日期,
    类似 2 楼那些阿里味的条条框框(术语堆砌、宏大叙事、强调体系文化、落地路径模糊、内部视角浓厚)看看就行了,短期解决不了任何问题,长期也是需要大量的资源投入

    对广大中小型公司、创业公司或处于快速迭代、生存压力下的团队来说,这套东西会水土不服

  • whoa! You're right!👍