2020-04-24 02:23:58 +03:00
# Contributing
2020-03-08 04:29:22 +03:00
- [How to Contribute ](#how-to-contribute )
* [Getting Code ](#getting-code )
* [Code reviews ](#code-reviews )
* [Code Style ](#code-style )
* [API guidelines ](#api-guidelines )
* [Commit Messages ](#commit-messages )
* [Writing Documentation ](#writing-documentation )
* [Adding New Dependencies ](#adding-new-dependencies )
* [Running & Writing Tests ](#running--writing-tests )
* [Public API Coverage ](#public-api-coverage )
2020-03-22 03:58:08 +03:00
- [Contributor License Agreement ](#contributor-license-agreement )
* [Code of Conduct ](#code-of-conduct )
2020-03-08 04:29:22 +03:00
2020-04-24 02:23:58 +03:00
## How to Contribute
2020-03-08 04:29:22 +03:00
2023-08-26 09:13:59 +03:00
We strongly recommend that you open an issue before beginning any code modifications. This is particularly important if the changes involve complex logic or if the existing code isn't immediately clear. By doing so, we can discuss and agree upon the best approach to address a bug or implement a feature, ensuring that our efforts are aligned.
2020-04-24 02:23:58 +03:00
### Getting Code
2020-03-08 04:29:22 +03:00
2023-06-02 11:04:41 +03:00
Make sure you're running Node.js 16+ and NPM 8+, to verify and upgrade NPM do:
2022-10-04 13:17:25 +03:00
```bash
node --version
npm --version
npm i -g npm@latest
```
2020-03-08 04:29:22 +03:00
1. Clone this repository
```bash
git clone https://github.com/microsoft/playwright
cd playwright
```
2. Install dependencies
```bash
2022-10-04 13:17:25 +03:00
npm ci
2020-03-08 04:29:22 +03:00
```
2020-07-08 08:38:59 +03:00
3. Build Playwright
```bash
npm run build
```
4. Run all Playwright tests locally. For more information about tests, read [Running & Writing Tests ](#running--writing-tests ).
2020-03-08 04:29:22 +03:00
```bash
npm test
```
2020-04-24 02:23:58 +03:00
### Code reviews
2020-03-08 04:29:22 +03:00
All submissions, including submissions by project members, require review. We
use GitHub pull requests for this purpose. Consult
[GitHub Help ](https://help.github.com/articles/about-pull-requests/ ) for more
information on using pull requests.
2020-04-24 02:23:58 +03:00
### Code Style
2020-03-08 04:29:22 +03:00
2021-12-08 09:58:33 +03:00
- Coding style is fully defined in [.eslintrc ](https://github.com/microsoft/playwright/blob/main/.eslintrc.js )
2020-03-08 04:29:22 +03:00
- Comments should be generally avoided. If the code would not be understood without comments, consider re-writing the code to make it self-explanatory.
To run code linter, use:
```bash
npm run eslint
```
2020-04-24 02:23:58 +03:00
### API guidelines
2020-03-08 04:29:22 +03:00
When authoring new API methods, consider the following:
- Expose as little information as needed. When in doubt, don’ t expose new information.
- Methods are used in favor of getters/setters.
- The only exception is namespaces, e.g. `page.keyboard` and `page.coverage`
2021-10-21 15:29:12 +03:00
- All string literals must be lowercase. This includes event names and option values.
2020-03-08 04:29:22 +03:00
- Avoid adding "sugar" API (API that is trivially implementable in user-space) unless they're **very** common.
2020-04-24 02:23:58 +03:00
### Commit Messages
2020-03-08 04:29:22 +03:00
Commit messages should follow the Semantic Commit Messages format:
```
label(namespace): title
description
footer
```
1. *label* is one of the following:
- `fix` - playwright bug fixes.
- `feat` - playwright features.
- `docs` - changes to docs, e.g. `docs(api.md): ..` to change documentation.
- `test` - changes to playwright tests infrastructure.
- `devops` - build-related work, e.g. CI related patches and general changes to the browser build infrastructure
2020-05-10 03:43:24 +03:00
- `chore` - everything that doesn't fall under previous categories
2020-03-08 04:29:22 +03:00
2. *namespace* is put in parenthesis after label and is optional. Must be lowercase.
3. *title* is a brief summary of changes.
4. *description* is **optional** , new-line separated from title and is in present tense.
5. *footer* is **optional** , new-line separated from *description* and contains "fixes" / "references" attribution to github issues.
Example:
```
fix(firefox): make sure session cookies work
2021-10-21 15:29:12 +03:00
This patch fixes session cookies in the firefox browser.
2020-03-08 04:29:22 +03:00
Fixes #123 , fixes #234
```
2020-04-24 02:23:58 +03:00
### Writing Documentation
2020-03-08 04:29:22 +03:00
2021-12-08 09:58:33 +03:00
All API classes, methods, and events should have a description in [`docs/src` ](https://github.com/microsoft/playwright/blob/main/docs/src ). There's a [documentation linter ](https://github.com/microsoft/playwright/tree/main/utils/doclint ) which makes sure documentation is aligned with the codebase.
2020-03-08 04:29:22 +03:00
To run the documentation linter, use:
```bash
npm run doc
```
2022-06-29 02:24:28 +03:00
To build the documentation site locally and test how your changes will look in practice:
1. Clone the [microsoft/playwright.dev ](https://github.com/microsoft/playwright.dev ) repo
1. Follow [the playwright.dev README instructions to "roll docs" ](https://github.com/microsoft/playwright.dev/#roll-docs ) against your local `playwright` repo with your changes in progress
1. Follow [the playwright.dev README instructions to "run dev server" ](https://github.com/microsoft/playwright.dev/#run-dev-server ) to view your changes
2020-04-24 02:23:58 +03:00
### Adding New Dependencies
2020-03-08 04:29:22 +03:00
For all dependencies (both installation and development):
- **Do not add** a dependency if the desired functionality is easily implementable.
- If adding a dependency, it should be well-maintained and trustworthy.
A barrier for introducing new installation dependencies is especially high:
- **Do not add** installation dependency unless it's critical to project success.
2020-04-24 02:23:58 +03:00
### Running & Writing Tests
2020-03-08 04:29:22 +03:00
- Every feature should be accompanied by a test.
- Every public api event/method should be accompanied by a test.
- Tests should be *hermetic* . Tests should not depend on external services.
- Tests should work on all three platforms: Mac, Linux and Win. This is especially important for screenshot tests.
2021-12-08 09:58:33 +03:00
Playwright tests are located in [`tests` ](https://github.com/microsoft/playwright/blob/main/tests ) and use `@playwright/test` test runner.
2020-03-08 04:29:22 +03:00
These are integration tests, making sure public API methods and events work as expected.
- To run all tests:
```bash
2023-05-25 23:32:49 +03:00
npx playwright install
2020-03-08 04:29:22 +03:00
npm run test
```
2023-05-25 23:32:49 +03:00
Be sure to run `npm run build` or let `npm run watch` run before you re-run the
tests after making your changes to check them.
2020-03-08 04:29:22 +03:00
- To run all tests in Chromium
```bash
npm run ctest # also `ftest` for firefox and `wtest` for WebKit
```
2023-05-25 23:32:49 +03:00
- To run the Playwright test runner tests
```bash
npm run ttest
npm run ttest -- --grep "specific test"
```
2022-02-02 03:08:08 +03:00
- To run a specific test, substitute `it` with `it.only` , or use the `--grep 'My test'` CLI parameter:
2020-03-08 04:29:22 +03:00
```js
2020-05-07 22:33:35 +03:00
...
2021-01-06 23:41:17 +03:00
// Using "it.only" to run a specific test
it.only('should work', async ({server, page}) => {
2020-05-07 22:33:35 +03:00
const response = await page.goto(server.EMPTY_PAGE);
expect(response.ok).toBe(true);
});
2022-02-02 03:08:08 +03:00
// or
playwright test --config=xxx --grep 'should work'
2020-03-08 04:29:22 +03:00
```
2021-01-06 23:41:17 +03:00
- To disable a specific test, substitute `it` with `it.skip` :
2020-03-08 04:29:22 +03:00
```js
2020-05-07 22:33:35 +03:00
...
2021-01-06 23:41:17 +03:00
// Using "it.skip" to skip a specific test
it.skip('should work', async ({server, page}) => {
2020-05-07 22:33:35 +03:00
const response = await page.goto(server.EMPTY_PAGE);
expect(response.ok).toBe(true);
});
2020-03-08 04:29:22 +03:00
```
2021-04-01 21:13:50 +03:00
- To run tests in non-headless (headed) mode:
2020-03-08 04:29:22 +03:00
```bash
2022-05-10 19:03:47 +03:00
npm run ctest -- --headed
2020-03-08 04:29:22 +03:00
```
- To run tests with custom browser executable, specify `CRPATH` , `WKPATH` or `FFPATH` env variable that points to browser executable:
```bash
CRPATH=< path-to-executable > npm run ctest
```
- To run tests in slow-mode:
```bash
2022-05-10 19:03:47 +03:00
SLOW_MO=500 npm run wtest -- --headed
2020-03-08 04:29:22 +03:00
```
2020-04-24 00:28:40 +03:00
- When should a test be marked with `skip` or `fail` ?
- **`skip(condition)`**: This test *should * **never*** work* for `condition`
where `condition` is usually a certain browser like `FFOX` (for Firefox),
`WEBKIT` (for WebKit), and `CHROMIUM` (for Chromium).
For example, the [alt-click downloads test ](https://github.com/microsoft/playwright/blob/471ccc72d3f0847caa36f629b394a028c7750d93/test/download.spec.js#L86 ) is marked
with `skip(FFOX)` since an alt-click in Firefox will not produce a download
even if a person was driving the browser.
- **`fail(condition)`**: This test *should * **eventually*** work* for `condition`
where `condition` is usually a certain browser like `FFOX` (for Firefox),
`WEBKIT` (for WebKit), and `CHROMIUM` (for Chromium).
For example, the [alt-click downloads test ](https://github.com/microsoft/playwright/blob/471ccc72d3f0847caa36f629b394a028c7750d93/test/download.spec.js#L86 ) is marked
with `fail(CHROMIUM || WEBKIT)` since Playwright performing these actions
currently diverges from what a user would experience driving a Chromium or
WebKit.
2020-04-24 02:23:58 +03:00
## Contributor License Agreement
2020-03-22 03:58:08 +03:00
This project welcomes contributions and suggestions. Most contributions require you to agree to a
Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
When you submit a pull request, a CLA bot will automatically determine whether you need to provide
a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions
provided by the bot. You will only need to do this once across all repos using our CLA.
2020-04-24 02:23:58 +03:00
### Code of Conduct
2020-03-22 03:58:08 +03:00
This project has adopted the [Microsoft Open Source Code of Conduct ](https://opensource.microsoft.com/codeofconduct/ ).
For more information see the [Code of Conduct FAQ ](https://opensource.microsoft.com/codeofconduct/faq/ ) or
contact [opencode@microsoft.com ](mailto:opencode@microsoft.com ) with any additional questions or comments.