npm package 'vscode-extension-tester'

Popularity: Medium (more popular than 90% of all packages)
Description: Webdriver Testing for VSCode Extensions
Installation: npm install vscode-extension-tester
Last version: 5.3.0 (Download)
Homepage: https://github.com/redhat-developer/vscode-extension-tester#readme
Size: 182.59 kB
License: Apache-2.0
Keywords: webdriver, test, vscode, extension

Activity

Last modified: January 24, 2023 3:10 PM (5 days ago)
Versions released in one year: 10
Weekly downloads: 11,380
01/30/202204/24/202207/31/202203,5007,00010,50014,00001234released versions / week
  • Versions released
  • Weekly downloads

What's new in version 5.1.0

Delta between version 5.0.0 and version 5.1.0

Source: Github
Commits:
  • 092ccd31b2a5859976ed72dc6ecd523e1cff1431, September 20, 2022 9:10 AM:
    Enable dependabot for GHA
  • f0cc681c2cd22d2e0e0a9e550ef95bbbb9018490, September 25, 2022 10:37 AM:
    Provide custom issue template
  • 9c11a2a12d393dd440cb0c095898a3dd64846b98, September 25, 2022 4:33 PM:
    Stabilize TerminalView.getText() method for VSCode insider
    
    Signed-off-by: Dominik Jelinek <djelinek@redhat.com>
  • ebeb10feac716e6019d31eca78bac7ffaaeb6c34, September 27, 2022 11:55 AM:
    Merge pull request #500 from ssbarnea/chore/test
    
    Enable dependabot for GHA
  • f5448ad1eac9bc0e92235f259a342f79b66196d0, September 27, 2022 12:08 PM:
    Merge pull request #508 from redhat-developer/issue-template
    
    Provide custom issue template
  • 6e53aa431b26e792bdf7f81e3764bf5a550882c4, September 27, 2022 12:09 PM:
    Merge pull request #509 from redhat-developer/insider-fix
    
    Stabilize TerminalView.getText() method for VSCode insider
  • 4c7415645aafa8366666b21e4fb45b97c86eb5ce, September 27, 2022 11:56 AM:
    Bump actions/upload-artifact from 2 to 3
    
    Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3.
    - [Release notes](https://github.com/actions/upload-artifact/releases)
    - [Commits](https://github.com/actions/upload-artifact/compare/v2...v3)
    
    ---
    updated-dependencies:
    - dependency-name: actions/upload-artifact
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
  • 2c13a4acd684e2ec7cce7cb77813155153f26f7f, September 27, 2022 11:56 AM:
    Bump actions/checkout from 2 to 3
    
    Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.
    - [Release notes](https://github.com/actions/checkout/releases)
    - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
    - [Commits](https://github.com/actions/checkout/compare/v2...v3)
    
    ---
    updated-dependencies:
    - dependency-name: actions/checkout
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
  • 972659852c463d622ff16ceadcc7d0327d820f4d, October 4, 2022 2:21 PM:
    Bump actions/setup-node from 1 to 3.5.0
    
    Bumps [actions/setup-node](https://github.com/actions/setup-node) from 1 to 3.5.0.
    - [Release notes](https://github.com/actions/setup-node/releases)
    - [Commits](https://github.com/actions/setup-node/compare/v1...v3.5.0)
    
    ---
    updated-dependencies:
    - dependency-name: actions/setup-node
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...
    
    Signed-off-by: dependabot[bot] <support@github.com>
  • 5871ba26be880a017acde89160572c011c06a141, September 22, 2022 12:54 PM:
    Apply min/max feature to API
    
    Signed-off-by: Marian Lorinc <mlorinc@redhat.com>
  • f9eb420cd2afdf07d8ce674791a60ba880ff0017, October 4, 2022 2:59 PM:
    Merge pull request #516 from redhat-developer/dependabot/github_actions/actions/setup-node-3.5.0
    
    Bump actions/setup-node from 1 to 3.5.0
  • 9fe41ef6f9fc03d7655ea9bc83fd7296d82a1527, October 18, 2022 8:35 AM:
    Add Disconnect button click to DebugToolBar
    
    Signed-off-by: Marian Lorinc <mlorinc@redhat.com>
  • 959f2c2bcbfd2932df1c1e6fbf19d11b928c95f4, October 25, 2022 8:33 AM:
    Get all visible markers (#502)
    
    * renamed getAllMarkers to getAllVisibleMarkers
    
    * renamed getAllMarkers to getAllVisibleMarkers
    
    * added .skip() to a few tests in bottomBar-test.ts
  • d0ecbfd44a8d2a6616594ae7dcb41540165ebc9b, October 25, 2022 8:34 AM:
    Update GH actions workflows, add workflow badges to readme (#523)
    
    * Update GH actions workflow
    
    * Add workflow badges to readme file
    
    Signed-off-by: Dominik Jelinek <djelinek@redhat.com>
  • c7669b26cb46029a036b4869b519459b45ef51a8, October 26, 2022 9:34 AM:
    Upgrade got dependency to 11.8.5 version
    
    it avoids having a CVE in transitive dependencies
    not upgrading to 12.x as it requires more work given API breakage. This
    could be done in another iteration.
    
    fixes #507
    
    Signed-off-by: Aurélien Pupier <apupier@redhat.com>
  • 7ae7d4dc74ef151382ffbb1782e383c6747d7583, October 26, 2022 12:14 PM:
    Upversion page-objects to 3.1.0
    
    Signed-off-by: Dominik Jelinek <djelinek@redhat.com>
  • c0855719464b74c5b8adde076e757dfd633962a7, October 26, 2022 12:33 PM:
    Upversion locators to 3.1.0
    
    Signed-off-by: Dominik Jelinek <djelinek@redhat.com>
  • 77dc5f74961b40cf6f6ad74ddfa5f26443eb7981, October 26, 2022 12:35 PM:
    5.1.0
Files changed:
.github/ISSUE_TEMPLATE/custom.md CHANGED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: Custom issue template
3
+ about: Extester issue template to gain most important information
4
+ title: ''
5
+ labels: NEW_ISSUE
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ > Define issue title **short** and **most specific** to the problem.
11
+
12
+ > Tag each new issue with relevant **LABELS** (*bug*, *enhancement*, etc.).
13
+
14
+ > Replace all **???** with relevant information.
15
+
16
+ ## Expected Behavior
17
+ - ???
18
+
19
+ ## Actual Behavior
20
+ - ???
21
+
22
+ ## Steps to Reproduce the Problem
23
+
24
+ 1. ???
25
+ 2. ???
26
+ 3. ???
27
+
28
+ ## Specifications
29
+
30
+ - VSCode version: ???
31
+ - ExTester version: ???
32
+ - Platform:
33
+ - [ ] Linux
34
+ - [ ] macOS
35
+ - [ ] Windows
.github/dependabot.yml CHANGED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ version: 2
3
+ updates:
4
+ - package-ecosystem: "github-actions"
5
+ directory: "/"
6
+ schedule:
7
+ interval: daily
8
+ open-pull-requests-limit: 3
9
+ labels:
10
+ - "skip-changelog"
.github/workflows/insiders.yml CHANGED
@@ -1,18 +1,20 @@
1
- name: Nightly Insiders
2
 
3
  on:
4
  schedule:
5
  - cron: "0 0 * * *"
 
 
6
  workflow_dispatch:
7
 
8
  jobs:
9
  test:
10
  runs-on: ubuntu-latest
11
 
12
  steps:
13
- - uses: actions/checkout@v2
14
  - name: Setup Node
15
- uses: actions/setup-node@v1
16
  with:
17
  node-version: 16
18
  - name: Setup Dependencies
@@ -31,8 +33,8 @@ jobs:
31
  Xvfb -ac :99 -screen 0 1920x1080x16 &
32
  npm run ci-test
33
  - name: Upload screenshots
34
- uses: actions/upload-artifact@v2
35
  if: failure()
36
- with:
37
  name: screenshots
38
  path: ~/test/**/screenshots/*.png
1
+ name: Insiders CI
2
 
3
  on:
4
  schedule:
5
  - cron: "0 0 * * *"
6
+ push:
7
+ branches: [ master ]
8
  workflow_dispatch:
9
 
10
  jobs:
11
  test:
12
  runs-on: ubuntu-latest
13
 
14
  steps:
15
+ - uses: actions/checkout@v3
16
  - name: Setup Node
17
+ uses: actions/setup-node@v3
18
  with:
19
  node-version: 16
20
  - name: Setup Dependencies
33
  Xvfb -ac :99 -screen 0 1920x1080x16 &
34
  npm run ci-test
35
  - name: Upload screenshots
36
+ uses: actions/upload-artifact@v3
37
  if: failure()
38
+ with:
39
  name: screenshots
40
  path: ~/test/**/screenshots/*.png
.github/workflows/linux.yml CHANGED
@@ -12,14 +12,14 @@ jobs:
12
 
13
  strategy:
14
  matrix:
15
- node: [16]
16
- version: [min, 1.68.1, 1.69.2, 1.70.2, max]
17
  fail-fast: false
18
 
19
  steps:
20
- - uses: actions/checkout@v2
21
  - name: Setup Node
22
- uses: actions/setup-node@v1
23
  with:
24
  node-version: ${{ matrix.node }}
25
  - name: Setup Dependencies
@@ -38,8 +38,8 @@ jobs:
38
  Xvfb -ac :99 -screen 0 1920x1080x16 &
39
  npm run ci-test
40
  - name: Upload screenshots
41
- uses: actions/upload-artifact@v2
42
  if: failure()
43
- with:
44
  name: screenshots-${{ matrix.version }}
45
  path: ~/test/**/screenshots/*.png
12
 
13
  strategy:
14
  matrix:
15
+ node: [ 16 ]
16
+ version: [ min, 1.68.1, 1.69.2, 1.70.2, max ]
17
  fail-fast: false
18
 
19
  steps:
20
+ - uses: actions/checkout@v3
21
  - name: Setup Node
22
+ uses: actions/setup-node@v3
23
  with:
24
  node-version: ${{ matrix.node }}
25
  - name: Setup Dependencies
38
  Xvfb -ac :99 -screen 0 1920x1080x16 &
39
  npm run ci-test
40
  - name: Upload screenshots
41
+ uses: actions/upload-artifact@v3
42
  if: failure()
43
+ with:
44
  name: screenshots-${{ matrix.version }}
45
  path: ~/test/**/screenshots/*.png
.github/workflows/mac.yml CHANGED
@@ -12,14 +12,14 @@ jobs:
12
 
13
  strategy:
14
  matrix:
15
- node: [16]
16
- version: [max]
17
  fail-fast: false
18
 
19
  steps:
20
- - uses: actions/checkout@v2
21
  - name: Setup Node
22
- uses: actions/setup-node@v1
23
  with:
24
  node-version: ${{ matrix.node }}
25
  - name: Setup Dependencies
@@ -33,3 +33,9 @@ jobs:
33
  env:
34
  CODE_VERSION: ${{ matrix.version }}
35
  run: npm test
 
 
 
 
 
 
12
 
13
  strategy:
14
  matrix:
15
+ node: [ 16 ]
16
+ version: [ max ]
17
  fail-fast: false
18
 
19
  steps:
20
+ - uses: actions/checkout@v3
21
  - name: Setup Node
22
+ uses: actions/setup-node@v3
23
  with:
24
  node-version: ${{ matrix.node }}
25
  - name: Setup Dependencies
33
  env:
34
  CODE_VERSION: ${{ matrix.version }}
35
  run: npm test
36
+ - name: Upload screenshots
37
+ uses: actions/upload-artifact@v3
38
+ if: failure()
39
+ with:
40
+ name: screenshots-${{ matrix.version }}
41
+ path: ~/test/**/screenshots/*.png
.github/workflows/windows.yml CHANGED
@@ -12,14 +12,14 @@ jobs:
12
 
13
  strategy:
14
  matrix:
15
- node: [16]
16
- version: [max]
17
  fail-fast: false
18
 
19
  steps:
20
- - uses: actions/checkout@v2
21
  - name: Setup Node
22
- uses: actions/setup-node@v1
23
  with:
24
  node-version: ${{ matrix.node }}
25
  - name: Setup Dependencies
@@ -32,4 +32,10 @@ jobs:
32
  - name: Run Tests
33
  env:
34
  CODE_VERSION: ${{ matrix.version }}
35
- run: npm test
 
 
 
 
 
 
12
 
13
  strategy:
14
  matrix:
15
+ node: [ 16 ]
16
+ version: [ max ]
17
  fail-fast: false
18
 
19
  steps:
20
+ - uses: actions/checkout@v3
21
  - name: Setup Node
22
+ uses: actions/setup-node@v3
23
  with:
24
  node-version: ${{ matrix.node }}
25
  - name: Setup Dependencies
32
  - name: Run Tests
33
  env:
34
  CODE_VERSION: ${{ matrix.version }}
35
+ run: npm test
36
+ - name: Upload screenshots
37
+ uses: actions/upload-artifact@v3
38
+ if: failure()
39
+ with:
40
+ name: screenshots-${{ matrix.version }}
41
+ path: ~/test/**/screenshots/*.png
CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
  # Change Log
2
 
 
 
 
 
 
 
 
3
  ## 5.0.0 (September 19 2022)
4
  - Included support for VSCode 1.70.2, 1.71.2
5
  - Add placeholder min/max values to --code_version option
1
  # Change Log
2
 
3
+ ## 5.1.0 (October 26 2022)
4
+ - Added GitHub Actions badges into package readme file
5
+ - Added getAllVisibleMarkers instead unstable getAllAMarkers in ProblemsView component
6
+ - Added Disconnect button click to DebugToolBar component
7
+ - Applied min/max placeholder feature to API
8
+ - Fixed TerminalView.getText() method
9
+
10
  ## 5.0.0 (September 19 2022)
11
  - Included support for VSCode 1.70.2, 1.71.2
12
  - Add placeholder min/max values to --code_version option
README.md CHANGED
@@ -1,6 +1,10 @@
1
- [![Build Status](https://travis-ci.org/redhat-developer/vscode-extension-tester.svg?branch=master)](https://travis-ci.org/redhat-developer/vscode-extension-tester)
 
2
 
3
- # vscode-extension-tester
 
 
 
4
 
5
  VSCode Extension Tester is a package designed to help you run UI tests for your VS Code extensions using [selenium-webdriver](https://www.npmjs.com/package/selenium-webdriver).
6
 
1
+ #### Stable VSCode
2
+ [![Linux CI](https://github.com/redhat-developer/vscode-extension-tester/actions/workflows/linux.yml/badge.svg)](https://github.com/redhat-developer/vscode-extension-tester/actions/workflows/linux.yml) [![MacOS CI](https://github.com/redhat-developer/vscode-extension-tester/actions/workflows/mac.yml/badge.svg)](https://github.com/redhat-developer/vscode-extension-tester/actions/workflows/mac.yml) [![Windows CI](https://github.com/redhat-developer/vscode-extension-tester/actions/workflows/windows.yml/badge.svg)](https://github.com/redhat-developer/vscode-extension-tester/actions/workflows/windows.yml)
3
 
4
+ #### Insider VSCode
5
+ [![Nightly Insiders](https://github.com/redhat-developer/vscode-extension-tester/actions/workflows/insiders.yml/badge.svg)](https://github.com/redhat-developer/vscode-extension-tester/actions/workflows/insiders.yml)
6
+
7
+ # vscode-extension-tester [![npm version](https://badge.fury.io/js/vscode-extension-tester.svg?style=flat)](https://badge.fury.io/js/vscode-extension-tester) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=flat)](https://github.com/redhat-developer/vscode-extension-tester/blob/master/LICENSE)
8
 
9
  VSCode Extension Tester is a package designed to help you run UI tests for your VS Code extensions using [selenium-webdriver](https://www.npmjs.com/package/selenium-webdriver).
10
 
locators/lib/1.37.0.ts CHANGED
@@ -51,7 +51,8 @@ const bottomBar = {
51
  collapseAll: By.className('collapse-all'),
52
  markerRow: By.className('monaco-list-row'),
53
  rowLabel: 'aria-label',
54
- markerTwistie: By.className('monaco-tl-twistie')
 
55
  },
56
  TerminalView: {
57
  constructor: By.id('workbench.panel.terminal'),
51
  collapseAll: By.className('collapse-all'),
52
  markerRow: By.className('monaco-list-row'),
53
  rowLabel: 'aria-label',
54
+ markerTwistie: By.className('monaco-tl-twistie'),
55
+ changeCount: By.className('monaco-count-badge')
56
  },
57
  TerminalView: {
58
  constructor: By.id('workbench.panel.terminal'),
locators/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
  {
2
  "name": "vscode-extension-tester-locators",
3
- "version": "3.0.0",
4
  "lockfileVersion": 2,
5
  "requires": true,
6
  "packages": {
7
  "": {
8
  "name": "vscode-extension-tester-locators",
9
- "version": "3.0.0",
10
  "license": "Apache-2.0",
11
  "devDependencies": {
12
  "@types/node": "^16.11.7",
@@ -16,13 +16,13 @@
16
  "typescript": "4.4.2"
17
  },
18
  "peerDependencies": {
19
- "monaco-page-objects": "^3.0.0",
20
  "selenium-webdriver": "^4.2.0"
21
  }
22
  },
23
  "../page-objects": {
24
  "name": "monaco-page-objects",
25
- "version": "3.0.0",
26
  "dev": true,
27
  "license": "Apache-2.0",
28
  "dependencies": {
1
  {
2
  "name": "vscode-extension-tester-locators",
3
+ "version": "3.1.0",
4
  "lockfileVersion": 2,
5
  "requires": true,
6
  "packages": {
7
  "": {
8
  "name": "vscode-extension-tester-locators",
9
+ "version": "3.1.0",
10
  "license": "Apache-2.0",
11
  "devDependencies": {
12
  "@types/node": "^16.11.7",
16
  "typescript": "4.4.2"
17
  },
18
  "peerDependencies": {
19
+ "monaco-page-objects": "^3.1.0",
20
  "selenium-webdriver": "^4.2.0"
21
  }
22
  },
23
  "../page-objects": {
24
  "name": "monaco-page-objects",
25
+ "version": "3.1.0",
26
  "dev": true,
27
  "license": "Apache-2.0",
28
  "dependencies": {
locators/package.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "vscode-extension-tester-locators",
3
- "version": "3.0.0",
4
  "description": "Pluggable object locators for vscode extension tester",
5
  "main": "out/index.js",
6
  "types": "out/index.d.ts",
@@ -36,7 +36,7 @@
36
  "typescript": "4.4.2"
37
  },
38
  "peerDependencies": {
39
- "monaco-page-objects": "^3.0.0",
40
  "selenium-webdriver": "^4.2.0"
41
  }
42
  }
1
  {
2
  "name": "vscode-extension-tester-locators",
3
+ "version": "3.1.0",
4
  "description": "Pluggable object locators for vscode extension tester",
5
  "main": "out/index.js",
6
  "types": "out/index.d.ts",
36
  "typescript": "4.4.2"
37
  },
38
  "peerDependencies": {
39
+ "monaco-page-objects": "^3.1.0",
40
  "selenium-webdriver": "^4.2.0"
41
  }
42
  }
package-lock.json CHANGED
@@ -1,29 +1,29 @@
1
  {
2
  "name": "vscode-extension-tester",
3
- "version": "5.0.0",
4
  "lockfileVersion": 2,
5
  "requires": true,
6
  "packages": {
7
  "": {
8
  "name": "vscode-extension-tester",
9
- "version": "5.0.0",
10
  "license": "Apache-2.0",
11
  "dependencies": {
12
  "@types/selenium-webdriver": "^4.1.1",
13
  "commander": "^8.0.0",
14
  "compare-versions": "^3.6.0",
15
  "fs-extra": "^10.0.0",
16
  "glob": "^7.1.7",
17
- "got": "^11.8.2",
18
  "hpagent": "^0.1.2",
19
  "js-yaml": "^4.1.0",
20
- "monaco-page-objects": "^3.0.0",
21
  "sanitize-filename": "^1.6.3",
22
  "selenium-webdriver": "^4.2.0",
23
  "targz": "^1.0.1",
24
  "unzip-stream": "^0.3.0",
25
  "vsce": "^2.11.0",
26
- "vscode-extension-tester-locators": "^3.0.0"
27
  },
28
  "bin": {
29
  "extest": "out/cli.js"
@@ -112,17 +112,13 @@
112
  "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==",
113
  "dev": true
114
  },
115
- "node_modules/@types/json-buffer": {
116
- "version": "3.0.0",
117
- "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz",
118
- "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ=="
119
- },
120
  "node_modules/@types/keyv": {
121
- "version": "3.1.4",
122
- "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
123
- "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
 
124
  "dependencies": {
125
- "@types/node": "*"
126
  }
127
  },
128
  "node_modules/@types/minimatch": {
@@ -655,11 +651,14 @@
655
  }
656
  },
657
  "node_modules/clone-response": {
658
- "version": "1.0.2",
659
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
660
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
661
  "dependencies": {
662
  "mimic-response": "^1.0.0"
 
 
 
663
  }
664
  },
665
  "node_modules/code-point-at": {
@@ -701,18 +700,6 @@
701
  "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
702
  "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
703
  },
704
- "node_modules/compress-brotli": {
705
- "version": "1.3.8",
706
- "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz",
707
- "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==",
708
- "dependencies": {
709
- "@types/json-buffer": "~3.0.0",
710
- "json-buffer": "~3.0.1"
711
- },
712
- "engines": {
713
- "node": ">= 12"
714
- }
715
- },
716
  "node_modules/concat-map": {
717
  "version": "0.0.1",
718
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -1544,11 +1531,10 @@
1544
  }
1545
  },
1546
  "node_modules/keyv": {
1547
- "version": "4.2.7",
1548
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.7.tgz",
1549
- "integrity": "sha512-HeOstD8SXvtWoQhMMBCelcUuZsiV7T7MwsADtOXT0KuwYP9nCxrSoMDeLXNDTLN3VFSuRp38JzoGbbTboq3QQw==",
1550
  "dependencies": {
1551
- "compress-brotli": "^1.3.8",
1552
  "json-buffer": "3.0.1"
1553
  }
1554
  },
@@ -1769,9 +1755,9 @@
1769
  }
1770
  },
1771
  "node_modules/monaco-page-objects": {
1772
- "version": "3.0.0",
1773
- "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.0.0.tgz",
1774
- "integrity": "sha512-WD1T7SM55IlS3RuGgeYvd0PqRcFOUIZt551ecQZmSmwLapM0wNTfYfFOCstRKs+Yg+eHgSkyYYKBb1GTb7qaCQ==",
1775
  "dependencies": {
1776
  "clipboardy": "^2.3.0",
1777
  "clone-deep": "^4.0.1",
@@ -2242,11 +2228,14 @@
2242
  "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
2243
  },
2244
  "node_modules/responselike": {
2245
- "version": "2.0.0",
2246
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
2247
- "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
2248
  "dependencies": {
2249
  "lowercase-keys": "^2.0.0"
 
 
 
2250
  }
2251
  },
2252
  "node_modules/rimraf": {
@@ -2770,11 +2759,11 @@
2770
  }
2771
  },
2772
  "node_modules/vscode-extension-tester-locators": {
2773
- "version": "3.0.0",
2774
- "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.0.0.tgz",
2775
- "integrity": "sha512-O5RPfGALjzqEqY9J3RfyqzKWMjFSI+BmZGPpHP3zVVvtvXYTVzDZXij1dM2xGEQpkdfqOj+FXvEw+/acnUN7lQ==",
2776
  "peerDependencies": {
2777
- "monaco-page-objects": "^3.0.0",
2778
  "selenium-webdriver": "^4.2.0"
2779
  }
2780
  },
@@ -3106,17 +3095,12 @@
3106
  "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==",
3107
  "dev": true
3108
  },
3109
- "@types/json-buffer": {
3110
- "version": "3.0.0",
3111
- "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz",
3112
- "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ=="
3113
- },
3114
  "@types/keyv": {
3115
- "version": "3.1.4",
3116
- "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
3117
- "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
3118
  "requires": {
3119
- "@types/node": "*"
3120
  }
3121
  },
3122
  "@types/minimatch": {
@@ -3515,9 +3499,9 @@
3515
  }
3516
  },
3517
  "clone-response": {
3518
- "version": "1.0.2",
3519
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
3520
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
3521
  "requires": {
3522
  "mimic-response": "^1.0.0"
3523
  }
@@ -3552,15 +3536,6 @@
3552
  "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
3553
  "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
3554
  },
3555
- "compress-brotli": {
3556
- "version": "1.3.8",
3557
- "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz",
3558
- "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==",
3559
- "requires": {
3560
- "@types/json-buffer": "~3.0.0",
3561
- "json-buffer": "~3.0.1"
3562
- }
3563
- },
3564
  "concat-map": {
3565
  "version": "0.0.1",
3566
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -4163,11 +4138,10 @@
4163
  }
4164
  },
4165
  "keyv": {
4166
- "version": "4.2.7",
4167
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.7.tgz",
4168
- "integrity": "sha512-HeOstD8SXvtWoQhMMBCelcUuZsiV7T7MwsADtOXT0KuwYP9nCxrSoMDeLXNDTLN3VFSuRp38JzoGbbTboq3QQw==",
4169
  "requires": {
4170
- "compress-brotli": "^1.3.8",
4171
  "json-buffer": "3.0.1"
4172
  }
4173
  },
@@ -4333,9 +4307,9 @@
4333
  }
4334
  },
4335
  "monaco-page-objects": {
4336
- "version": "3.0.0",
4337
- "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.0.0.tgz",
4338
- "integrity": "sha512-WD1T7SM55IlS3RuGgeYvd0PqRcFOUIZt551ecQZmSmwLapM0wNTfYfFOCstRKs+Yg+eHgSkyYYKBb1GTb7qaCQ==",
4339
  "requires": {
4340
  "clipboardy": "^2.3.0",
4341
  "clone-deep": "^4.0.1",
@@ -4698,9 +4672,9 @@
4698
  "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
4699
  },
4700
  "responselike": {
4701
- "version": "2.0.0",
4702
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
4703
- "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
4704
  "requires": {
4705
  "lowercase-keys": "^2.0.0"
4706
  }
@@ -5103,9 +5077,9 @@
5103
  }
5104
  },
5105
  "vscode-extension-tester-locators": {
5106
- "version": "3.0.0",
5107
- "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.0.0.tgz",
5108
- "integrity": "sha512-O5RPfGALjzqEqY9J3RfyqzKWMjFSI+BmZGPpHP3zVVvtvXYTVzDZXij1dM2xGEQpkdfqOj+FXvEw+/acnUN7lQ==",
5109
  "requires": {}
5110
  },
5111
  "which": {
1
  {
2
  "name": "vscode-extension-tester",
3
+ "version": "5.1.0",
4
  "lockfileVersion": 2,
5
  "requires": true,
6
  "packages": {
7
  "": {
8
  "name": "vscode-extension-tester",
9
+ "version": "5.1.0",
10
  "license": "Apache-2.0",
11
  "dependencies": {
12
  "@types/selenium-webdriver": "^4.1.1",
13
  "commander": "^8.0.0",
14
  "compare-versions": "^3.6.0",
15
  "fs-extra": "^10.0.0",
16
  "glob": "^7.1.7",
17
+ "got": "^11.8.5",
18
  "hpagent": "^0.1.2",
19
  "js-yaml": "^4.1.0",
20
+ "monaco-page-objects": "^3.1.0",
21
  "sanitize-filename": "^1.6.3",
22
  "selenium-webdriver": "^4.2.0",
23
  "targz": "^1.0.1",
24
  "unzip-stream": "^0.3.0",
25
  "vsce": "^2.11.0",
26
+ "vscode-extension-tester-locators": "^3.1.0"
27
  },
28
  "bin": {
29
  "extest": "out/cli.js"
112
  "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==",
113
  "dev": true
114
  },
 
 
 
 
 
115
  "node_modules/@types/keyv": {
116
+ "version": "4.2.0",
117
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-4.2.0.tgz",
118
+ "integrity": "sha512-xoBtGl5R9jeKUhc8ZqeYaRDx04qqJ10yhhXYGmJ4Jr8qKpvMsDQQrNUvF/wUJ4klOtmJeJM+p2Xo3zp9uaC3tw==",
119
+ "deprecated": "This is a stub types definition. keyv provides its own type definitions, so you do not need this installed.",
120
  "dependencies": {
121
+ "keyv": "*"
122
  }
123
  },
124
  "node_modules/@types/minimatch": {
651
  }
652
  },
653
  "node_modules/clone-response": {
654
+ "version": "1.0.3",
655
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
656
+ "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
657
  "dependencies": {
658
  "mimic-response": "^1.0.0"
659
+ },
660
+ "funding": {
661
+ "url": "https://github.com/sponsors/sindresorhus"
662
  }
663
  },
664
  "node_modules/code-point-at": {
700
  "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
701
  "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
702
  },
 
 
 
 
 
 
 
 
 
 
 
 
703
  "node_modules/concat-map": {
704
  "version": "0.0.1",
705
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1531
  }
1532
  },
1533
  "node_modules/keyv": {
1534
+ "version": "4.5.0",
1535
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz",
1536
+ "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==",
1537
  "dependencies": {
 
1538
  "json-buffer": "3.0.1"
1539
  }
1540
  },
1755
  }
1756
  },
1757
  "node_modules/monaco-page-objects": {
1758
+ "version": "3.1.0",
1759
+ "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.1.0.tgz",
1760
+ "integrity": "sha512-B0ylDy9UcCeOkYHoWziimJDcBzgWPJHBrjYzKtBMjEw++Oo3eFJ00RN1XDjgzW6o7+wlG25M/atJ9010QfLoFw==",
1761
  "dependencies": {
1762
  "clipboardy": "^2.3.0",
1763
  "clone-deep": "^4.0.1",
2228
  "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
2229
  },
2230
  "node_modules/responselike": {
2231
+ "version": "2.0.1",
2232
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
2233
+ "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
2234
  "dependencies": {
2235
  "lowercase-keys": "^2.0.0"
2236
+ },
2237
+ "funding": {
2238
+ "url": "https://github.com/sponsors/sindresorhus"
2239
  }
2240
  },
2241
  "node_modules/rimraf": {
2759
  }
2760
  },
2761
  "node_modules/vscode-extension-tester-locators": {
2762
+ "version": "3.1.0",
2763
+ "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.1.0.tgz",
2764
+ "integrity": "sha512-Q4gfJHnA1Kf6W0UOSE16jvPB+hk0aQ1r9b9bjM311r30hsdHkzBpAYw58YS8ZfzB7AgA4Jum/SM9q4WM2fwedg==",
2765
  "peerDependencies": {
2766
+ "monaco-page-objects": "^3.1.0",
2767
  "selenium-webdriver": "^4.2.0"
2768
  }
2769
  },
3095
  "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==",
3096
  "dev": true
3097
  },
 
 
 
 
 
3098
  "@types/keyv": {
3099
+ "version": "4.2.0",
3100
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-4.2.0.tgz",
3101
+ "integrity": "sha512-xoBtGl5R9jeKUhc8ZqeYaRDx04qqJ10yhhXYGmJ4Jr8qKpvMsDQQrNUvF/wUJ4klOtmJeJM+p2Xo3zp9uaC3tw==",
3102
  "requires": {
3103
+ "keyv": "*"
3104
  }
3105
  },
3106
  "@types/minimatch": {
3499
  }
3500
  },
3501
  "clone-response": {
3502
+ "version": "1.0.3",
3503
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
3504
+ "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
3505
  "requires": {
3506
  "mimic-response": "^1.0.0"
3507
  }
3536
  "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
3537
  "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
3538
  },
 
 
 
 
 
 
 
 
 
3539
  "concat-map": {
3540
  "version": "0.0.1",
3541
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
4138
  }
4139
  },
4140
  "keyv": {
4141
+ "version": "4.5.0",
4142
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz",
4143
+ "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==",
4144
  "requires": {
 
4145
  "json-buffer": "3.0.1"
4146
  }
4147
  },
4307
  }
4308
  },
4309
  "monaco-page-objects": {
4310
+ "version": "3.1.0",
4311
+ "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.1.0.tgz",
4312
+ "integrity": "sha512-B0ylDy9UcCeOkYHoWziimJDcBzgWPJHBrjYzKtBMjEw++Oo3eFJ00RN1XDjgzW6o7+wlG25M/atJ9010QfLoFw==",
4313
  "requires": {
4314
  "clipboardy": "^2.3.0",
4315
  "clone-deep": "^4.0.1",
4672
  "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
4673
  },
4674
  "responselike": {
4675
+ "version": "2.0.1",
4676
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
4677
+ "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
4678
  "requires": {
4679
  "lowercase-keys": "^2.0.0"
4680
  }
5077
  }
5078
  },
5079
  "vscode-extension-tester-locators": {
5080
+ "version": "3.1.0",
5081
+ "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.1.0.tgz",
5082
+ "integrity": "sha512-Q4gfJHnA1Kf6W0UOSE16jvPB+hk0aQ1r9b9bjM311r30hsdHkzBpAYw58YS8ZfzB7AgA4Jum/SM9q4WM2fwedg==",
5083
  "requires": {}
5084
  },
5085
  "which": {
package.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "vscode-extension-tester",
3
- "version": "5.0.0",
4
  "description": "Webdriver Testing for VSCode Extensions",
5
  "main": "out/extester.js",
6
  "types": "out/extester.d.ts",
@@ -56,16 +56,16 @@
56
  "compare-versions": "^3.6.0",
57
  "fs-extra": "^10.0.0",
58
  "glob": "^7.1.7",
59
- "got": "^11.8.2",
60
  "hpagent": "^0.1.2",
61
  "js-yaml": "^4.1.0",
62
- "monaco-page-objects": "^3.0.0",
63
  "sanitize-filename": "^1.6.3",
64
  "selenium-webdriver": "^4.2.0",
65
  "targz": "^1.0.1",
66
  "unzip-stream": "^0.3.0",
67
  "vsce": "^2.11.0",
68
- "vscode-extension-tester-locators": "^3.0.0"
69
  },
70
  "peerDependencies": {
71
  "mocha": ">=5.2.0"
1
  {
2
  "name": "vscode-extension-tester",
3
+ "version": "5.1.0",
4
  "description": "Webdriver Testing for VSCode Extensions",
5
  "main": "out/extester.js",
6
  "types": "out/extester.d.ts",
56
  "compare-versions": "^3.6.0",
57
  "fs-extra": "^10.0.0",
58
  "glob": "^7.1.7",
59
+ "got": "^11.8.5",
60
  "hpagent": "^0.1.2",
61
  "js-yaml": "^4.1.0",
62
+ "monaco-page-objects": "^3.1.0",
63
  "sanitize-filename": "^1.6.3",
64
  "selenium-webdriver": "^4.2.0",
65
  "targz": "^1.0.1",
66
  "unzip-stream": "^0.3.0",
67
  "vsce": "^2.11.0",
68
+ "vscode-extension-tester-locators": "^3.1.0"
69
  },
70
  "peerDependencies": {
71
  "mocha": ">=5.2.0"
page-objects/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
  {
2
  "name": "monaco-page-objects",
3
- "version": "3.0.0",
4
  "lockfileVersion": 2,
5
  "requires": true,
6
  "packages": {
7
  "": {
8
  "name": "monaco-page-objects",
9
- "version": "3.0.0",
10
  "license": "Apache-2.0",
11
  "dependencies": {
12
  "clipboardy": "^2.3.0",
1
  {
2
  "name": "monaco-page-objects",
3
+ "version": "3.1.0",
4
  "lockfileVersion": 2,
5
  "requires": true,
6
  "packages": {
7
  "": {
8
  "name": "monaco-page-objects",
9
+ "version": "3.1.0",
10
  "license": "Apache-2.0",
11
  "dependencies": {
12
  "clipboardy": "^2.3.0",
page-objects/package.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "monaco-page-objects",
3
- "version": "3.0.0",
4
  "description": "Page Objects for Monaco Editor",
5
  "main": "out/index.js",
6
  "types": "out/index.d.ts",
1
  {
2
  "name": "monaco-page-objects",
3
+ "version": "3.1.0",
4
  "description": "Page Objects for Monaco Editor",
5
  "main": "out/index.js",
6
  "types": "out/index.d.ts",
page-objects/src/components/bottomBar/ProblemsView.ts CHANGED
@@ -13,7 +13,7 @@ export class ProblemsView extends AbstractElement {
13
 
14
  /**
15
  * Set the filter using the input box on the problems view
16
- * @param pattern filter to use, prefferably a glob pattern
17
  * @returns Promise resolving when the filter pattern is filled in
18
  */
19
  async setFilter(pattern: string): Promise<void> {
@@ -23,7 +23,7 @@ export class ProblemsView extends AbstractElement {
23
 
24
  /**
25
  * Clear all filters
26
- * @returns Promise resolving to the filter field WebElement
27
  */
28
  async clearFilter(): Promise<WebElement> {
29
  const filterField = await this.enclosingItem.findElement(ProblemsView.locators.BottomBarPanel.actions)
@@ -44,12 +44,22 @@ export class ProblemsView extends AbstractElement {
44
  }
45
 
46
  /**
47
- * Get all markers from the problems view with the given type.
 
 
 
 
 
 
 
 
 
 
48
  * To get all markers regardless of type, use MarkerType.Any
49
  * @param type type of markers to retrieve
50
  * @returns Promise resolving to array of Marker objects
51
  */
52
- async getAllMarkers(type: MarkerType): Promise<Marker[]> {
53
  const markers: Marker[] = [];
54
  const elements = await this.findElements(ProblemsView.locators.ProblemsView.markerRow);
55
  for (const element of elements) {
@@ -61,6 +71,14 @@ export class ProblemsView extends AbstractElement {
61
  }
62
  return markers;
63
  }
 
 
 
 
 
 
 
 
64
  }
65
 
66
  /**
@@ -79,7 +97,7 @@ export class Marker extends ElementWithContexMenu {
79
  async getType(): Promise<MarkerType> {
80
  const twist = await this.findElement(ProblemsView.locators.ProblemsView.markerTwistie);
81
  if ((await twist.getAttribute('class')).indexOf('collapsible') > -1) {
82
- return MarkerType.File;
83
  }
84
  const text = await this.getText();
85
  if (text.startsWith('Error')) {
13
 
14
  /**
15
  * Set the filter using the input box on the problems view
16
+ * @param pattern filter to use, preferably a glob pattern
17
  * @returns Promise resolving when the filter pattern is filled in
18
  */
19
  async setFilter(pattern: string): Promise<void> {
23
 
24
  /**
25
  * Clear all filters
26
+ * @returns Promise resolving to the filter field WebElement
27
  */
28
  async clearFilter(): Promise<WebElement> {
29
  const filterField = await this.enclosingItem.findElement(ProblemsView.locators.BottomBarPanel.actions)
44
  }
45
 
46
  /**
47
+ * @deprecated The method should not be used and getAllVisibleMarkers() should be used instead.
48
+ */
49
+ async getAllMarkers(type: MarkerType): Promise<Marker[]> {
50
+ return this.getAllVisibleMarkers(type);
51
+ }
52
+
53
+ /**
54
+ * Get all visible markers from the problems view with the given type.
55
+ * Warning: this only returns the markers that are visible, and not the
56
+ * entire list, so calls to this function may change depending on the
57
+ * environment in which the tests are running in.
58
  * To get all markers regardless of type, use MarkerType.Any
59
  * @param type type of markers to retrieve
60
  * @returns Promise resolving to array of Marker objects
61
  */
62
+ async getAllVisibleMarkers(type: MarkerType): Promise<Marker[]> {
63
  const markers: Marker[] = [];
64
  const elements = await this.findElements(ProblemsView.locators.ProblemsView.markerRow);
65
  for (const element of elements) {
71
  }
72
  return markers;
73
  }
74
+
75
+ /**
76
+ * Gets the count badge
77
+ * @returns Promise resolving to the WebElement representing the count badge
78
+ */
79
+ async getCountBadge(): Promise<WebElement> {
80
+ return await this.findElement(ProblemsView.locators.ProblemsView.changeCount);
81
+ }
82
  }
83
 
84
  /**
97
  async getType(): Promise<MarkerType> {
98
  const twist = await this.findElement(ProblemsView.locators.ProblemsView.markerTwistie);
99
  if ((await twist.getAttribute('class')).indexOf('collapsible') > -1) {
100
+ return MarkerType.File;
101
  }
102
  const text = await this.getText();
103
  if (text.startsWith('Error')) {
page-objects/src/components/bottomBar/Views.ts CHANGED
@@ -123,7 +123,9 @@ export class TerminalView extends ChannelView {
123
  const workbench = new Workbench();
124
  await workbench.executeCommand('terminal select all');
125
  await workbench.getDriver().sleep(500);
126
- await workbench.executeCommand('terminal copy selection');
 
 
127
  await workbench.getDriver().sleep(500);
128
  const text = clipboard.readSync();
129
  clipboard.writeSync('');
123
  const workbench = new Workbench();
124
  await workbench.executeCommand('terminal select all');
125
  await workbench.getDriver().sleep(500);
126
+ const menu = await this.openContextMenu();
127
+ await workbench.getDriver().sleep(500);
128
+ await menu.select('Copy');
129
  await workbench.getDriver().sleep(500);
130
  const text = clipboard.readSync();
131
  clipboard.writeSync('');
page-objects/src/components/workbench/DebugToolbar.ts CHANGED
@@ -44,6 +44,13 @@ export class DebugToolbar extends AbstractElement {
44
  await (await this.getButton('continue')).click();
45
  }
46
 
 
 
 
 
 
 
 
47
  /**
48
  * Click Pause
49
  */
@@ -89,4 +96,4 @@ export class DebugToolbar extends AbstractElement {
89
  private async getButton(name: string): Promise<WebElement> {
90
  return this.findElement(DebugToolbar.locators.DebugToolbar.button(name));
91
  }
92
- }
44
  await (await this.getButton('continue')).click();
45
  }
46
 
47
+ /**
48
+ * Click Disconnect
49
+ */
50
+ async disconnect(): Promise<void> {
51
+ await (await this.getButton('disconnect')).click();
52
+ }
53
+
54
  /**
55
  * Click Pause
56
  */
96
  private async getButton(name: string): Promise<WebElement> {
97
  return this.findElement(DebugToolbar.locators.DebugToolbar.button(name));
98
  }
99
+ }
page-objects/src/locators/locators.ts CHANGED
@@ -1,5 +1,5 @@
1
  import { By } from "selenium-webdriver";
2
- import { DeepPartial } from 'ts-essentials';
3
 
4
  /**
5
  * Type definitions for all used locators
@@ -55,6 +55,7 @@ export interface Locators {
55
  markerRow: By
56
  rowLabel: string
57
  markerTwistie: By
 
58
  }
59
  TerminalView: {
60
  constructor: By
@@ -299,7 +300,7 @@ export interface Locators {
299
  ctor: By
300
  button: (title: string) => By
301
  }
302
-
303
  // Status Bar
304
  StatusBar: {
305
  constructor: By
306
- -- sample-projects/helloworld-sample/LICENSE.md
1
  import { By } from "selenium-webdriver";
2
+ import { DeepPartial } from 'ts-essentials';
3
 
4
  /**
5
  * Type definitions for all used locators
55
  markerRow: By
56
  rowLabel: string
57
  markerTwistie: By
58
+ changeCount: By
59
  }
60
  TerminalView: {
61
  constructor: By
300
  ctor: By
301
  button: (title: string) => By
302
  }
303
+
304
  // Status Bar
305
  StatusBar: {
306
  constructor: By
307
+ ++ sample-projects/helloworld-sample/LICENSE.md
sample-projects/helloworld-sample/src/ui-test/bottomBar-test.ts CHANGED
@@ -10,7 +10,7 @@ describe('Bottom Bar Example Tests', () => {
10
  // init the bottom bar page object
11
  bottomBar = new BottomBarPanel();
12
 
13
- // make sure the panel is open
14
  await bottomBar.toggle(true);
15
  });
16
 
@@ -22,7 +22,7 @@ describe('Bottom Bar Example Tests', () => {
22
  // wait condition for problem markers to exist within problems view
23
  async function problemsExist(view: ProblemsView) {
24
  // search for markers regardless of type until some are found
25
- const markers = await view.getAllMarkers(MarkerType.Any);
26
  return markers.length > 0;
27
  }
28
 
@@ -41,25 +41,27 @@ describe('Bottom Bar Example Tests', () => {
41
  await view.getDriver().wait(() => { return problemsExist(view); }, 15000);
42
  });
43
 
 
 
44
  // now we can look at the error markers
45
- it('Error markers are displayed', async () => {
46
  // generally, there are 3 marker types (warning, error, and file - file just contains other markers though)
47
- // we want to see the errors
48
- const errors = await view.getAllMarkers(MarkerType.Error);
49
 
50
  // assert that there are errors (there should be about 8 in the file)
51
  expect(errors.length).is.greaterThan(5);
52
  });
53
 
54
  // we can make sure no warnings are present at the same time
55
- it('There are no warnings', async () => {
56
- const warnings = await view.getAllMarkers(MarkerType.Warning);
57
  expect(warnings).is.empty;
58
  });
59
 
60
  // there is also a file marker (out problematic file that contains the errors)
61
- it('There is a file marker', async () => {
62
- const files = await view.getAllMarkers(MarkerType.File);
63
  const file = files[0];
64
 
65
  // we can get the text of the marker
@@ -71,13 +73,31 @@ describe('Bottom Bar Example Tests', () => {
71
  await file.toggleExpand(true);
72
  });
73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  // we can also define filtering for problems
75
  it('Filtering works', async () => {
76
  // set filter to something more specific
77
  await view.setFilter('aa');
78
  // wait a bit for the filter to apply
79
  await new Promise(res => setTimeout(res, 1000));
80
- const errors = await view.getAllMarkers(MarkerType.Error);
81
 
82
  // now there should be just a single error
83
  expect(errors.length).equals(1);
@@ -108,7 +128,7 @@ describe('Bottom Bar Example Tests', () => {
108
  it('Clear the output channel', async () => {
109
  await view.clearText();
110
  const text = await view.getText();
111
-
112
  // now the log is technically empty, it just contains a newline character
113
  expect(text).equals('\n');
114
  });
10
  // init the bottom bar page object
11
  bottomBar = new BottomBarPanel();
12
 
13
+ // make sure the panel is open
14
  await bottomBar.toggle(true);
15
  });
16
 
22
  // wait condition for problem markers to exist within problems view
23
  async function problemsExist(view: ProblemsView) {
24
  // search for markers regardless of type until some are found
25
+ const markers = await view.getAllVisibleMarkers(MarkerType.Any);
26
  return markers.length > 0;
27
  }
28
 
41
  await view.getDriver().wait(() => { return problemsExist(view); }, 15000);
42
  });
43
 
44
+ // These tests use getAllVisibleMarkers() and are unreliable and should not be included.
45
+ //
46
  // now we can look at the error markers
47
+ it.skip('Error markers are displayed', async () => {
48
  // generally, there are 3 marker types (warning, error, and file - file just contains other markers though)
49
+ // we want to see the errors
50
+ const errors = await view.getAllVisibleMarkers(MarkerType.Error);
51
 
52
  // assert that there are errors (there should be about 8 in the file)
53
  expect(errors.length).is.greaterThan(5);
54
  });
55
 
56
  // we can make sure no warnings are present at the same time
57
+ it.skip('There are no warnings', async () => {
58
+ const warnings = await view.getAllVisibleMarkers(MarkerType.Warning);
59
  expect(warnings).is.empty;
60
  });
61
 
62
  // there is also a file marker (out problematic file that contains the errors)
63
+ it.skip('There is a file marker', async () => {
64
+ const files = await view.getAllVisibleMarkers(MarkerType.File);
65
  const file = files[0];
66
 
67
  // we can get the text of the marker
73
  await file.toggleExpand(true);
74
  });
75
 
76
+ it('Markers are displayed', async () => {
77
+ // Need to throttle this test in order for VS Code to load/display all of the errors
78
+ // and warnings.
79
+ await new Promise(res => setTimeout((res), 3000));
80
+
81
+ const markers = await view.getAllVisibleMarkers(MarkerType.Any);
82
+ const badgeElement = await view.getCountBadge();
83
+ const badgeText = await badgeElement.getText();
84
+
85
+ // getAllVisibleMarkers() only returns the **visible** markers, so we can't rely on the count,
86
+ // but we should be able to rely on at least one appearing.
87
+ expect(markers.length).is.greaterThan(0);
88
+
89
+ // Regardless of how many are visible, the first row contains the summary, and the badge
90
+ // contains the count.
91
+ expect(badgeText).equals("19");
92
+ });
93
+
94
  // we can also define filtering for problems
95
  it('Filtering works', async () => {
96
  // set filter to something more specific
97
  await view.setFilter('aa');
98
  // wait a bit for the filter to apply
99
  await new Promise(res => setTimeout(res, 1000));
100
+ const errors = await view.getAllVisibleMarkers(MarkerType.Error);
101
 
102
  // now there should be just a single error
103
  expect(errors.length).equals(1);
128
  it('Clear the output channel', async () => {
129
  await view.clearText();
130
  const text = await view.getText();
131
+
132
  // now the log is technically empty, it just contains a newline character
133
  expect(text).equals('\n');
134
  });
src/cli.ts CHANGED
@@ -1,7 +1,7 @@
1
  #!/usr/bin/env node
2
 
3
  import { program } from 'commander';
4
- import { ExTester, VSCODE_VERSION_MAX, VSCODE_VERSION_MIN } from './extester';
5
  import { ReleaseQuality } from './util/codeUtil';
6
  const pjson = require('../package.json');
7
 
@@ -15,8 +15,7 @@ program.command('get-vscode')
15
  .option('-t, --type <type>', 'Type of VSCode release (stable/insider)')
16
  .action(withErrors(async (cmd) => {
17
  const extest = new ExTester(cmd.storage, codeStream(cmd.type));
18
- const version = loadCodeVersion(cmd.code_version);
19
- await extest.downloadCode(version);
20
  }));
21
 
22
  program.command('get-chromedriver')
@@ -26,8 +25,7 @@ program.command('get-chromedriver')
26
  .option('-t, --type <type>', 'Type of VSCode release (stable/insider)')
27
  .action(withErrors(async (cmd) => {
28
  const extest = new ExTester(cmd.storage, codeStream(cmd.type));
29
- const version = loadCodeVersion(cmd.code_version);
30
- await extest.downloadChromeDriver(version);
31
  }));
32
 
33
  program.command('install-vsix')
@@ -67,8 +65,7 @@ program.command('setup-tests')
67
  .option('-i, --install_dependencies', 'Automatically install extensions your extension depends on', false)
68
  .action(withErrors(async (cmd) => {
69
  const extest = new ExTester(cmd.storage, codeStream(cmd.type), cmd.extensions_dir);
70
- const vscodeVersion = loadCodeVersion(cmd.code_version);
71
- await extest.setupRequirements({vscodeVersion, useYarn: cmd.yarn, installDependencies: cmd.install_dependencies});
72
  }));
73
 
74
  program.command('run-tests <testFiles>')
@@ -85,8 +82,7 @@ program.command('run-tests <testFiles>')
85
  .option('-r --open_resource <resources...>', 'Open resources in VS Code. Multiple files and folders can be specified.')
86
  .action(withErrors(async (testFiles, cmd) => {
87
  const extest = new ExTester(cmd.storage, codeStream(cmd.type), cmd.extensions_dir);
88
- const vscodeVersion = loadCodeVersion(cmd.code_version);
89
- await extest.runTests(testFiles, {vscodeVersion, settings: cmd.code_settings, cleanup: cmd.uninstall_extension, config: cmd.mocha_config, logLevel: cmd.log_level, offline: cmd.offline, resources: cmd.open_resource ?? []});
90
  }));
91
 
92
  program.command('setup-and-run <testFiles>')
@@ -105,17 +101,11 @@ program.command('setup-and-run <testFiles>')
105
  .option('-r --open_resource <resources...>', 'Open resources in VS Code. Multiple files and folders can be specified.')
106
  .action(withErrors(async (testFiles, cmd) => {
107
  const extest = new ExTester(cmd.storage, codeStream(cmd.type), cmd.extensions_dir);
108
- const vscodeVersion = loadCodeVersion(cmd.code_version);
109
- await extest.setupAndRunTests(testFiles, vscodeVersion, {useYarn: cmd.yarn, installDependencies: cmd.install_dependencies}, {settings: cmd.code_settings, cleanup: cmd.uninstall_extension, config: cmd.mocha_config, logLevel: cmd.log_level, resources: cmd.open_resource ?? []});
110
  }));
111
 
112
  program.parse(process.argv);
113
 
114
- function loadCodeVersion(version: string | undefined) {
115
- const code_version = process.env.CODE_VERSION ? process.env.CODE_VERSION : version;
116
- return code_version && code_version.toLowerCase() === 'max' ? VSCODE_VERSION_MAX : (code_version && code_version.toLowerCase() === 'min' ? VSCODE_VERSION_MIN : code_version);
117
- }
118
-
119
  function withErrors(command: (...args: any[]) => Promise<void>) {
120
  return async (...args: any[]) => {
121
  try {
1
  #!/usr/bin/env node
2
 
3
  import { program } from 'commander';
4
+ import { ExTester } from './extester';
5
  import { ReleaseQuality } from './util/codeUtil';
6
  const pjson = require('../package.json');
7
 
15
  .option('-t, --type <type>', 'Type of VSCode release (stable/insider)')
16
  .action(withErrors(async (cmd) => {
17
  const extest = new ExTester(cmd.storage, codeStream(cmd.type));
18
+ await extest.downloadCode(cmd.code_version);
 
19
  }));
20
 
21
  program.command('get-chromedriver')
25
  .option('-t, --type <type>', 'Type of VSCode release (stable/insider)')
26
  .action(withErrors(async (cmd) => {
27
  const extest = new ExTester(cmd.storage, codeStream(cmd.type));
28
+ await extest.downloadChromeDriver(cmd.code_version);
 
29
  }));
30
 
31
  program.command('install-vsix')
65
  .option('-i, --install_dependencies', 'Automatically install extensions your extension depends on', false)
66
  .action(withErrors(async (cmd) => {
67
  const extest = new ExTester(cmd.storage, codeStream(cmd.type), cmd.extensions_dir);
68
+ await extest.setupRequirements({vscodeVersion: cmd.code_version, useYarn: cmd.yarn, installDependencies: cmd.install_dependencies});
 
69
  }));
70
 
71
  program.command('run-tests <testFiles>')
82
  .option('-r --open_resource <resources...>', 'Open resources in VS Code. Multiple files and folders can be specified.')
83
  .action(withErrors(async (testFiles, cmd) => {
84
  const extest = new ExTester(cmd.storage, codeStream(cmd.type), cmd.extensions_dir);
85
+ await extest.runTests(testFiles, {vscodeVersion: cmd.code_version, settings: cmd.code_settings, cleanup: cmd.uninstall_extension, config: cmd.mocha_config, logLevel: cmd.log_level, offline: cmd.offline, resources: cmd.open_resource ?? []});
 
86
  }));
87
 
88
  program.command('setup-and-run <testFiles>')
101
  .option('-r --open_resource <resources...>', 'Open resources in VS Code. Multiple files and folders can be specified.')
102
  .action(withErrors(async (testFiles, cmd) => {
103
  const extest = new ExTester(cmd.storage, codeStream(cmd.type), cmd.extensions_dir);
104
+ await extest.setupAndRunTests(testFiles, cmd.code_version, {useYarn: cmd.yarn, installDependencies: cmd.install_dependencies}, {settings: cmd.code_settings, cleanup: cmd.uninstall_extension, config: cmd.mocha_config, logLevel: cmd.log_level, resources: cmd.open_resource ?? []});
 
105
  }));
106
 
107
  program.parse(process.argv);
108
 
 
 
 
 
 
109
  function withErrors(command: (...args: any[]) => Promise<void>) {
110
  return async (...args: any[]) => {
111
  try {
src/extester.ts CHANGED
@@ -46,7 +46,7 @@ export class ExTester {
46
  * @param version version to download, default latest
47
  */
48
  async downloadCode(version: string = 'latest'): Promise<void> {
49
- return this.code.downloadVSCode(version);
50
  }
51
 
52
  /**
@@ -89,7 +89,7 @@ export class ExTester {
89
  * @param vscodeVersion selected versio nof VSCode, default latest
90
  */
91
  async downloadChromeDriver(vscodeVersion: string = 'latest'): Promise<void> {
92
- const chromiumVersion = await this.code.getChromiumVersion(vscodeVersion);
93
  await this.chrome.downloadChromeDriverForChromiumVersion(chromiumVersion);
94
  }
95
 
@@ -101,10 +101,12 @@ export class ExTester {
101
  */
102
  async setupRequirements(options: SetupOptions = DEFAULT_SETUP_OPTIONS, offline = false): Promise<void> {
103
  const { useYarn, vscodeVersion, installDependencies } = options;
104
- console.log(`Downloading VSCode: ${options.vscodeVersion}`);
 
 
105
  if (!offline) {
106
- await this.downloadCode(vscodeVersion);
107
- await this.downloadChromeDriver(vscodeVersion);
108
  } else {
109
  console.log('Attempting Setup in offline mode');
110
  const expectedChromeVersion = (await this.code.checkOfflineRequirements()).split('.')[0];
@@ -143,6 +145,22 @@ export class ExTester {
143
  * @returns Promise resolving to the mocha process exit code - 0 for no failures, 1 otherwise
144
  */
145
  async runTests(testFilesPattern: string, runOptions: RunOptions = DEFAULT_RUN_OPTIONS): Promise<number> {
 
146
  return this.code.runTests(testFilesPattern, runOptions);
147
  }
148
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  * @param version version to download, default latest
47
  */
48
  async downloadCode(version: string = 'latest'): Promise<void> {
49
+ return this.code.downloadVSCode(loadCodeVersion(version));
50
  }
51
 
52
  /**
89
  * @param vscodeVersion selected versio nof VSCode, default latest
90
  */
91
  async downloadChromeDriver(vscodeVersion: string = 'latest'): Promise<void> {
92
+ const chromiumVersion = await this.code.getChromiumVersion(loadCodeVersion(vscodeVersion));
93
  await this.chrome.downloadChromeDriverForChromiumVersion(chromiumVersion);
94
  }
95
 
101
  */
102
  async setupRequirements(options: SetupOptions = DEFAULT_SETUP_OPTIONS, offline = false): Promise<void> {
103
  const { useYarn, vscodeVersion, installDependencies } = options;
104
+
105
+ const vscodeParsedVersion = loadCodeVersion(vscodeVersion);
106
+ console.log(`Downloading VSCode: ${vscodeParsedVersion}`);
107
  if (!offline) {
108
+ await this.downloadCode(vscodeParsedVersion);
109
+ await this.downloadChromeDriver(vscodeParsedVersion);
110
  } else {
111
  console.log('Attempting Setup in offline mode');
112
  const expectedChromeVersion = (await this.code.checkOfflineRequirements()).split('.')[0];
145
  * @returns Promise resolving to the mocha process exit code - 0 for no failures, 1 otherwise
146
  */
147
  async runTests(testFilesPattern: string, runOptions: RunOptions = DEFAULT_RUN_OPTIONS): Promise<number> {
148
+ runOptions.vscodeVersion = loadCodeVersion(runOptions.vscodeVersion);
149
  return this.code.runTests(testFilesPattern, runOptions);
150
  }
151
+ }
152
+
153
+ export function loadCodeVersion(version: string | undefined): string {
154
+ const code_version = process.env.CODE_VERSION ? process.env.CODE_VERSION : version;
155
+
156
+ if (code_version !== undefined) {
157
+ if (code_version.toLowerCase() === 'max') {
158
+ return VSCODE_VERSION_MAX;
159
+ }
160
+ if (code_version.toLowerCase() === 'min') {
161
+ return VSCODE_VERSION_MIN;
162
+ }
163
+ return code_version;
164
+ }
165
+ return 'latest';
166
+ }
test/test-project/src/test/bottomBar/problemsView-test.ts CHANGED
@@ -31,58 +31,58 @@ import { expect } from 'chai';
31
  });
32
 
33
  it('get all markers works', async () => {
34
- const markers = await view.getAllMarkers(MarkerType.Any);
35
  expect(markers.length).greaterThan(1);
36
  });
37
 
38
  it('get warnings works', async () => {
39
- const markers = await view.getAllMarkers(MarkerType.Warning);
40
  expect(markers).empty;
41
  });
42
 
43
  it('get errors works', async () => {
44
- const markers = await view.getAllMarkers(MarkerType.Error);
45
  expect(markers.length).equals(1);
46
  });
47
 
48
  it('get files works', async () => {
49
- const markers = await view.getAllMarkers(MarkerType.File);
50
  expect(markers.length).equals(1);
51
  });
52
 
53
  it('filtering works', async () => {
54
  await view.setFilter('aaaa');
55
  await view.getDriver().sleep(500);
56
- const markers = await view.getAllMarkers(MarkerType.Any);
57
  expect(markers.length).equals(2);
58
  });
59
 
60
  describe('Marker', () => {
61
  it('getType works', async () => {
62
- const markers = await view.getAllMarkers(MarkerType.Error);
63
  expect(await markers[0].getType()).equals(MarkerType.Error);
64
  });
65
 
66
  it('getText works', async () => {
67
- const markers = await view.getAllMarkers(MarkerType.File);
68
  expect(await markers[0].getText()).has.string('test-file.ts');
69
  });
70
 
71
  it('toggleExpand works', async () => {
72
- const marker = (await view.getAllMarkers(MarkerType.File))[0];
73
  await marker.toggleExpand(false);
74
- let markers = await view.getAllMarkers(MarkerType.Any);
75
  expect(markers.length).equals(1);
76
 
77
 
78
  await marker.toggleExpand(true);
79
- markers = await view.getAllMarkers(MarkerType.Any);
80
  expect(markers.length).equals(2);
81
  });
82
  });
83
  });
84
 
85
  async function problemsExist(view: ProblemsView) {
86
- const markers = await view.getAllMarkers(MarkerType.Any);
87
  return markers.length > 0;
88
  }
31
  });
32
 
33
  it('get all markers works', async () => {
34
+ const markers = await view.getAllVisibleMarkers(MarkerType.Any);
35
  expect(markers.length).greaterThan(1);
36
  });
37
 
38
  it('get warnings works', async () => {
39
+ const markers = await view.getAllVisibleMarkers(MarkerType.Warning);
40
  expect(markers).empty;
41
  });
42
 
43
  it('get errors works', async () => {
44
+ const markers = await view.getAllVisibleMarkers(MarkerType.Error);
45
  expect(markers.length).equals(1);
46
  });
47
 
48
  it('get files works', async () => {
49
+ const markers = await view.getAllVisibleMarkers(MarkerType.File);
50
  expect(markers.length).equals(1);
51
  });
52
 
53
  it('filtering works', async () => {
54
  await view.setFilter('aaaa');
55
  await view.getDriver().sleep(500);
56
+ const markers = await view.getAllVisibleMarkers(MarkerType.Any);
57
  expect(markers.length).equals(2);
58
  });
59
 
60
  describe('Marker', () => {
61
  it('getType works', async () => {
62
+ const markers = await view.getAllVisibleMarkers(MarkerType.Error);
63
  expect(await markers[0].getType()).equals(MarkerType.Error);
64
  });
65
 
66
  it('getText works', async () => {
67
+ const markers = await view.getAllVisibleMarkers(MarkerType.File);
68
  expect(await markers[0].getText()).has.string('test-file.ts');
69
  });
70
 
71
  it('toggleExpand works', async () => {
72
+ const marker = (await view.getAllVisibleMarkers(MarkerType.File))[0];
73
  await marker.toggleExpand(false);
74
+ let markers = await view.getAllVisibleMarkers(MarkerType.Any);
75
  expect(markers.length).equals(1);
76
 
77
 
78
  await marker.toggleExpand(true);
79
+ markers = await view.getAllVisibleMarkers(MarkerType.Any);
80
  expect(markers.length).equals(2);
81
  });
82
  });
83
  });
84
 
85
  async function problemsExist(view: ProblemsView) {
86
+ const markers = await view.getAllVisibleMarkers(MarkerType.Any);
87
  return markers.length > 0;
88
  }

Readme

Stable VSCode

Insider VSCode

vscode-extension-tester

VSCode Extension Tester is a package designed to help you run UI tests for your VS Code extensions using selenium-webdriver.

The first part is to automate all the necessary setup steps to launch webdriver tests:

  • Download a test instance of VS Code
  • Download the appropriate version of ChromeDriver
  • Package and install your extension into the VS Code instance
  • Launch the VS Code instance using webdriver
  • Run your tests

The second part is to provide an extendable page object API for more convenient test writing.

Usage

Simply install it into your extension devDependencies to get started:

npm install --save-dev vscode-extension-tester

Make sure to check out the wiki for detailed instructions.

For the whole API reference, you can generate typedoc by running

npm run doc

The results can then be found in the 'docs' directory.

Migrating to 4.0

ExTester API

In the 4.0 update, the ExTester API was revamped. If you are not using the API to launch your tests, no action is needed here.

The methods setupRequirements, runTests and setupAndRunTests have had their arguments changed from the long telescope list to structured objects.

The new signatures now involve SetupOptions and RunOptions objects respectively:

  • setupRequirements(options: SetupOptions)
  • runTests(options: RunOptions)
  • setupAndRunTests(testFilesPattern: string, vscodeVersion: string = 'latest', setupOptions: SetupOptions, runOptions: RunOptions) (though here the options don't include vscode version)

Both interfaces are exported and contain the list of options you would use as arguments in their respective methods. Any argument that used to have a default value is marked as optional in the interfaces.

Changing Page Objects

A few page objects have had slight changes to their API. Others have had their inner workings changed that may influence tests with tight timeouts.

  • Context Menus now wait for all their items to load before you can manipulate them
    • this will not affect any APIs, but will slow down tests, so be careful if your test timeouts are tight
  • Settings Editor waits for the whole page to finish loading when searching for a setting
    • once again, test time is going to increase, care about timeouts
  • Action Bar & its items methods are now all asynchronous
    • ActionBar methods getViewControl and getGlobalAction are now async, make sure to await them
    • ViewControl and ActionsItem method getTitle is now async, make sure to await
    • ViewControl and ActionsItem contructors were changed to take a WebElement directly, instead of a title
      • hopefully, noone was using these directly, but if you do, use ActionBar#getViewControl or getGlobalAction instead to get the proper object

Requirements

Extension Tester runs with all its features on Linux and Windows OSes. MacOS support is limited, due to the title bar and context menus being native only, therefore unavailable for webdriver to handle.

In order to run the tests successfully you will need the following:

  • Nodejs 11 or newer

Building the native module also requires python and possibly a c/c++ compiler

  • GCC or similar for linux
  • MS Built Tools for windows
  • Xcode command line tools for macos

NOTE: Some Linux (CentOS-based) users have reported their tests getting stuck on launch. This is likely due to a missing dependency on ChromeDriver that runs underneath. If such a scenario occurs, we recommend installing the Chrome browser rpm, since it depends on all the required libraries.

VS Code Version Support & Backward Compatibility

Extension Tester currently supports the latest 5 minor releases of VS Code (subject to change if VS Code 2.x ever comes out).

Additionally, the oldest release of VS Code that can be successfully used with Extension Tester is 1.37.0. Older versions of VS Code might not work at all.

Versions older than the supported 5 latest releases, but still newer than 1.37.0 will most likely work just fine. However, if they stop working over time, there will be no more fixes to make them work. Unless you'd like to contribute these.

Get Involved

If you'd like to help us get better, we appreciate it!

Check out our Contribution Guide on how to do that.