Run test
一.命令行
选项
1.–test-meta , –fixture-meta
- 根据元数据过滤测试用例
二.Runner
1.filter
runner.filter((testName, fixtureName, fixturePath, testMeta, fixtureMeta) => {
    return fixturePath.startsWith('D') &&
        testName.match(someRe) &&
        fixtureName.match(anotherRe) &&
        testMeta.mobile === 'true' &&
        fixtureMeta.env === 'staging';
});
三.Skip Tests
1.fixture.skip and test.skip
- 跳过指定用例
example
fixture.skip `Fixture 1`; // All tests in this fixture are skipped
test('Fixture 1 - Test 1', () => {});
test('Fixture 1 - Test 2', () => {});
fixture `Fixture 2`;
test('Fixture 2 - Test 1', () => {});
test.skip('Fixture 2 - Test 2', () => {}); // This test is skipped
test('Fixture 2 - Test 3', () => {});
2.fixtrue.only and test.only
- 只执行指定用例
example
fixture.only `Fixture 1`;
test('Fixture 1 - Test 1', () => {});
test('Fixture 1 - Test 2', () => {});
fixture `Fixture 2`;
test('Fixture 2 - Test 1', () => {});
test.only('Fixture 2 - Test 2', () => {});
test('Fixture 2 - Test 3', () => {});
// Only tests in 'Fixture 1' and the 'Fixture 2 - Test 2' test are run
思考: 是否可以写明跳过的条件和原因?
Report
1.自定义测试报告
安装依赖
npm install -g yo
npm install -g generator-testcafe-reporter
创建报告文件夹
mkdir my-reporter
cd my-reporter
2.显示测试用例元数据meta
Fixtures
1.声明fixtures
2.打开网页
fixture 'myfixture'
   .page 'http://www.baidu.com';
3.指定测试元数据
相当于pytest.mark
fixture `My fixture`
    .meta('fixtureID', 'f-0001')
    .meta({ author: 'John', creationDate: '05/03/2018' });
Initialization and Clean-Up 初始化和清理
- 指定函数在fixture之前/测试用例执行之前或之后运行,这些函数被称为hooks.
    Test Hooks
- 测试用例级别的fixture
    1.fixture.beforeEach and fixture.afterEach
- 为每一个测试用例声明hooks
 examplefixture `My fixture` .page `http://example.com` .beforeEach( async t => { await t .useRole(admin) .click('#open-management-console'); }) .afterEach( async t => { await t.click('#delete-data'); });2.test.before and test.after
- 为指定测试用例指定hooks,当声明了before 或者 after, 对应的fixture.beforeEach and fixture.afterEach 将被覆盖,且不执行。
 exampletest .before( async t => { await t .useRole(admin) .click('#open-management-console'); }) ('MyTest', async t => { /* ... */ }) .after( async t => { await t.click('#delete-data'); });Fixture Hooks
- 在第一个用例之前执行 或者 在最后一个用例之后执行
 1.fixture.before and fixture.afte
 examplefixture `My fixture` .page `http://example.com` .before( async ctx => { utils.populateDb(ctx.dbName); }) .after( async ctx => { utils.dropDb(ctx.dbName); });如何在hooks 和测试用例之间共享数据?
测试用例
1.声明测试用例
test('test1',async t=>{
  /*test code*/
  });
2.每个用例打开指定页面
test.page
test1
     .page 'http://devexpress.github.io/'
     ('test1',async t=>{
       /*test code*/
      });
3.指定测试元数据
相当于pytest.mark
test
    .meta('testID', 't-0005')
    .meta({ severity: 'critical', testedAPIVersion: '1.0' })
    ('MyTest', async t => { /* ... */});
Select Page Elements
1.member tables
源码: addFilterMethods
| Method | Description | 
|---|---|
| nth | Finds an element by its index. | 
| withText | Finds an element whose content includes the specified text. | 
| withExactText | Finds an element with the specified text. | 
| withAttribute | Finds an element with the specified attribute or attribute value. | 
| filterVisible | Selects visible elements. | 
| filterHidden | Selects hidden elements. | 
| filter | Finds elements that match the specified CSS selector or predicate. | 
| find | Finds a descendant node that matches the specified CSS selector or predicate. | 
| parent | Selects parent elements. | 
| child | Selects child elements. | 
| sibling | Selects sibling elements. | 
| nextSibling | Selects succeeding sibling elements. | 
| prevSibling | Selects preceding sibling elements. | 
2.Use Selectors
1. 检查元素是否存在 exists
example
`
Selector(‘#submit-button’).exists;
`
2.显示匹配的数量 count
example
`
Selector(‘.column.col-2 label’).count;
`
3.获取元素节点状态 Obtain Element State
如获取元素ID,attributes等;
注意: 这些方法和属性是异步的,所以在使用之前使用await
截屏 screenshots
测试用例执行失败时截屏
1.命令行
testcafe chrome ./ -s takeOnFails=true
2.runner.screenshots
runner.screenshots({
  takeOnFails:true
  });
3.配置文件
{
  "screenshots":{
    "takeOnFails":true
  }
}
截屏选项
Option|Type|Description|Default Value
:–:|:–:|:–:|:–:
path|String	|The base directory where screenshots are saved.	|./screenshots
takeOnFails|	Boolean|	true to take a screenshot whenever a test fails.	|false
pathPattern	|String	|A pattern that defines how TestCafe composes the relative path to a screenshot file. See Screenshot and Video Directories.	|See Default Path Pattern.
fullPage	|String	|true to capture the full page, including content that is not visible due to overflow.	|false
截图文件名自定义参数
Placeholder|Description
:–:|:–:
${DATE}	|测试开始日期
${TIME}	|测试开始时间
${TEST_INDEX}	|The test’s index.
${FILE_INDEX}	|The screenshot file’s index.
${QUARANTINE_ATTEMPT}	|The quarantine attempt’s number. If the quarantine mode is disabled, the ${QUARANTINE_ATTEMPT}| placeholder’s value is 1.
${FIXTURE}	|The fixture’s name.
${TEST}	|测试用例名称
${USERAGENT}	|包含 ${BROWSER}, ${BROWSER_VERSION}, ${OS}, and ${OS_VERSION} (separated by underscores).
${BROWSER}	|浏览器名称
${BROWSER_VERSION}	|浏览器版本
${OS}	|操作系统名称
${OS_VERSION}	|操作系统版本
${TEST_ID}|	Resolves to test-${TEST_INDEX} if TestCafe can associate this screenshot or video with a specific test; resolves to an empty string otherwise (for instance, when a single video is recorded for the entire test run).
${RUN_ID}|	Resolves to run-${QUARANTINE_ATTEMPT} for screenshots taken when quarantine mode is enabled; resolves to an empty string for videos and for screenshots taken when quarantine mode is disabled.
录屏
注意:录屏只允许在谷歌浏览器,火狐浏览器,edge浏览器,当你使用远程浏览器测试时无法录屏
安装软件 FFmpeg library
use
1.命令行
testcafe chrome ./ –video artifacts/videos
2.runner.screenshots
runner.video('artifacts/videos');
3.配置文件
{
  "videoPath":"artifacts/videos"
}
录屏选项
Option|	Type|		Description|		Default Value
:–:|:–:|	:–:|:–:
failedOnly	|	Boolean	|	默认为false,当为true时只记录失败的用例。|		false
singleFile|		Boolean|		默认为false,当为true时所有录屏在同一个MP4文件|		false
ffmpegPath	|	String	|	The path to the FFmpeg codec executable.	|	Auto-detected
pathPattern	|	String|		A pattern that defines how TestCafe composes the relative path to a video file.|	 See Screenshot and Video Directories.	See Default Path Pattern.

