Browser Provider
Browser Provider 允许您自动化网页浏览器的交互,用于测试和抓取目的。
此提供者使用 Playwright 控制无头 Chrome 浏览器,使您能够导航网页、与元素交互并提取数据。
先决条件
Playwright 是 promptfoo 的对等依赖项,因此您需要单独安装它:
npm install playwright @playwright/browser-chromium playwright-extra puppeteer-extra-plugin-stealth
配置
要使用无头浏览器提供者,请将提供者 id
设置为 browser
,并提供一个配置对象,其中包含一系列要执行的步骤。
providers:
- id: browser
config:
steps:
- action: navigate
args:
url: 'https://example.com'
- action: type
args:
selector: '#search-input'
text: '{{prompt}}'
- action: click
args:
selector: '#search-button'
- action: extract
args:
selector: '#results'
name: searchResults
responseParser: 'data.searchResults'
支持的操作
无头浏览器提供者支持以下操作:
navigate
:导航到指定 URLclick
:点击元素type
:在输入字段中输入文本screenshot
:截取页面截图extract
:从元素中提取文本内容wait
:等待指定时间waitForNewChildren
:等待元素的新子元素
操作详情
navigate
url
:要导航到的 URL
click
selector
:要点击的元素的 CSS 选择器
extract
selector
:要提取文本的元素的 CSS 选择器
screenshot
filename
:保存截图的文件名
type
selector
:输入元素的 CSS 选择器text
:要输入到输入中的文本
可以使用以下占位符发送特殊字符:
<enter>
<tab>
<escape>
wait
ms
:等待的毫秒数
waitForNewChildren
parentSelector
:等待新子元素的父元素的 CSS 选择器delay
:检查新子元素前的等待毫秒数timeout
:等待新子元素的最大毫秒数
响应解析
使用 responseParser
配置选项从结果中提取特定数据。解析器接收一个包含两个属性的对象:
extracted
:包含从extract
操作中命名的结果的对象finalHtml
:所有操作完成后页面的最终 HTML 内容
变量和模板
您可以在配置中使用 Nunjucks 模板,包括 {{prompt}}
变量和测试上下文中传递的任何其他变量。
providers:
- id: browser
config:
steps:
- action: navigate
args:
url: 'https://example.com/search?q={{prompt}}'
- action: extract
args:
selector: '#first-result'
name: topResult
responseParser: 'extracted.topResult'
tests:
- vars:
prompt: 'What is the capital of France?'
作为库使用
如果您将 promptfoo 用作 node 库,您可以提供等效的提供者配置:
{
// ...
providers: [{
id: 'browser',
config: {
steps: [
{ action: 'navigate', args: { url: 'https://example.com' } },
{ action: 'type', args: { selector: '#search', text: '{{prompt}}' } },
{ action: 'click', args: { selector: '#submit' } },
{ action: 'extract', args: { selector: '#results' }, name: 'searchResults' }
],
responseParser: (extracted, finalHtml) => extracted.searchResults,
}
}],
}
参考
支持的配置选项:
选项 | 类型 | 描述 |
---|---|---|
headless | boolean | 是否在无头模式下运行浏览器。默认为 true 。 |
cookies | string | { name: string; value: string; domain?: string; path?: string; }[] | 要在浏览器上设置的字符串或cookie数组 |
responseParser | string | Function | 用于解析响应的函数或函数字符串表示。接收一个包含extracted 和finalHtml 参数的对象,并应返回一个ProviderResponse |
steps | BrowserAction[] | 要在浏览器中执行的操作数组 |
timeoutMs | number | 等待浏览器操作完成的最大时间(以毫秒为单位) |
注意:配置中的所有字符串值都支持Nunjucks模板。这意味着您可以使用{{prompt}}
变量或测试上下文中传递的任何 其他变量。
支持的浏览器操作
配置中的steps
数组可以包含以下操作:
操作 | 描述 | 必需参数 | 可选参数 |
---|---|---|---|
navigate | 导航到指定URL | url : string | |
click | 点击一个元素 | selector : string | |
extract | 从元素中提取文本内容 | selector : string, name : string | |
screenshot | 截取页面截图 | path : string | fullPage : boolean |
type | 在输入字段中输入文本 | selector : string, text : string | |
wait | 等待指定的时间 | ms : number | |
waitForNewChildren | 等待在父元素下出现新的子元素 | parentSelector : string | delay : number, timeout : number |
steps
数组中的每个操作应具有以下结构:
{
action: string;
args: {
[key: string]: any;
};
name?: string;
}
steps
数组中的每个步骤应具有以下结构:
action
: 指定要执行的操作类型(例如,'navigate', 'click', 'type')。args
: 包含操作所需的和可选的参数。name
(可选):用于在'extract'操作中命名提取的内容。
步骤按顺序执行,实现复杂的网页交互。
args
中的所有字符串值都支持Nunjucks模板,允许使用{{prompt}}
等变量。
测试Streamlit应用程序
Streamlit应用程序遵循一个常见模式,其中使用data-testid
属性来标识元素。
以下是一个示例配置:
providers:
- id: browser
config:
headless: true # 设置为false以查看浏览器
steps:
# 加载页面 - 确保如果它在iframe中,获取完整的URL!
- action: navigate
args:
url: 'https://doc-chat-llm.streamlit.app/~/+/'
# 输入消息并按下回车
- action: type
args:
selector: 'textarea'
text: '{{prompt}} <enter>'
# 等待响应
- action: wait
args:
ms: 5000
# 读取响应
- action: extract
args:
selector: 'div.stChatMessage:last-of-type'
name: response
responseParser: 'extracted.response'
故障排除
Iframes
如果您使用选择器与页面交互并且它一直超时,可能是因为元素在iframe中。
如果是这种情况,请尝试使用navigate
操作直接加载iframe内容。
查看浏览器
如果您想在运行时查看浏览器,可以在配置中将headless
选项设置为false
。
providers:
- id: browser
config:
headless: false
调试
如果您在运行测试时遇到问题,请将headless
设置为false
,浏览器将打开。然后您可以在浏览器控制台中查看发生了什么。
此外,设置环境变量 LOG_LEVEL=debug
将在评估过程中将调试信息打印到控制台。