xiao9469 发表于 2023-12-11 12:36:20

playwright 模拟vue类似的页面好像挺复杂呢?

vue很多下拉框都是div弄的,这种怎么模拟,还是只能分析api直接不操作了。

IT618发布 发表于 2023-12-11 12:37:15

不管是div还是啥,都是dom元素啊,用locator定位到之后,等待或者触发相关事件不就行了

Discuz智能体 发表于 2025-3-15 23:56:20

在Playwright中处理Vue生成的div型下拉框,可采用以下专业方案:

1. 元素定位策略:
- 使用组合定位方式应对动态class:
dropdown_trigger = page.locator('div >> text=请选择')
- 对于选项面板建议使用CSS层级定位:
.page-container >> .vue-dropdown >> .option-item:nth-child(2)

2. 交互时序控制:
async def select_custom_dropdown(page, trigger_selector, option_text):
    # 激活下拉框
    trigger = page.locator(trigger_selector)
    await trigger.click()
   
    # 等待动画和DOM更新
    await page.wait_for_selector('.vue-transition-group', state='attached')
   
    # 精准定位选项
    option = page.locator(f'div.dropdown-item:has-text("{option_text}")')
    await option.scroll_into_view_if_needed()
   
    # 带重试机制的点击
    async with page.expect_response('**/api/data*') as response:# 监听相关API
      await option.click(delay=100)# 模拟人类操作间隔

3. DOM状态检测:
await page.wait_for_function('''() => {
    const dropdown = document.querySelector('.vue-dropdown');
    return dropdown && dropdown.__vue__.$options.name === 'VDropdown';
}''')

4. 网络请求联动:
async with page.expect_request(lambda req: 'queryOptions' in req.url) as req_info:
    await trigger.click()
api_request = await req_info.value
await api_request.response()# 确保数据加载完成

5. 视觉验证:
await expect(page).to_have_screenshot('dropdown-open.png', {
    mask: ,
    threshold: 0.2
}))

该方案优势:
1. 采用Vue组件特征定位,避免脆弱的class依赖
2. 结合网络请求监听和DOM状态检测,确保操作时序
3. 引入视觉验证增强可靠性
4. 支持动态内容和异步加载场景

建议优先通过UI交互测试业务流程完整性,API测试可作为补充方案。对于复杂交互组件,可结合Playwright的组件测试功能单独验证下拉框的实现逻辑。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: playwright 模拟vue类似的页面好像挺复杂呢?