cypress-layout-inspector
Version:
Simple utility to provide layout testing functionality to Cypress
202 lines (142 loc) • 8.41 kB
Markdown
<div align="center">
<h1>cypress-layout-inspector</h1>
<img width="80px" height="80px" alt="detective" src="https://raw.githubusercontent.com/msmps/cypress-layout-inspector/master/media/detective.png" />
</div>
<hr />
[![Build Status][build-badge]][build]
[![Downloads per month][downloads-badge]][package]
[![version][version-badge]][package]
[![Semantic Release][semantic-badge]][semantic]
[![Watch on GitHub][github-watch-badge]][github-watch]
[![Star on GitHub][github-star-badge]][github-star]
[![Tweet][twitter-badge]][twitter]
## Table of Contents
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
- [Installation](#installation)
- [Usage](#usage)
- [Configuration](#configuration)
- [Assertions](#assertions)
- [Alignment](#alignment)
- [Dimensions](#dimensions)
- [Positioning](#positioning)
- [Styling](#styling)
- [Contributors ✨](#contributors-)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
## Installation
This module is distributed via [npm][npm] which is bundled with [node] and should be installed as one of your project's `devDependencies`:
```
npm install --save-dev cypress-layout-inspector
```
This has been tested thoroughly with the [Cypress.io][cypress-io] E2E test runner **v4.0.0+**
## Usage
`cypress-layout-inspector` extends the `chai` assertion library.
Add this line to your project's `cypress/support/e2e.js`:
```javascript
import "cypress-layout-inspector/add-support";
```
You can now use all of `cypress-layout-inspector`'s assertions.
To show some examples (from [cypress/e2e/position.spec.js](cypress/e2e/position.spec.js)):
```javascript
it("block-2 should be positioned right of block-1", () => {
cy.get(".block-2").should("be.rightOf", ".block-1", 50);
});
it("block-3 should be positioned left of block-4", () => {
cy.get(".block-3").should("be.leftOf", ".block-4", 50);
});
```
## Configuration
To configure `cypress-layout-inspector`, use the following custom command:
```javascript
cy.configureLayoutInspector(config);
```
`cypress-layout-inspector` uses `getBoundingClientRect()` behind the scenes which returns size equal to an elements (width/height + padding + border-width) in the case that the standard box model is being used, or (width/height) only if box-sizing: border-box has been set on it.
If you would like to use the standard box model but exclude padding in the total you can achieve this by doing the following:
```javascript
before(() => {
cy.configureLayoutInspector({
excludePadding: true,
threshold: 5,
});
});
```
## Assertions
### Alignment
#### `horizontallyAligned(element[, edge])`
| argument | type | options | default |
| ----------- | ------ | ------------------------------------ | ------- |
| **element** | string | - | - |
| **edge** | string | `'top', 'bottom', 'centered', 'all'` | `'all'` |
#### `verticallyAligned(element[, edge])`
| argument | type | options | default |
| ----------- | ------ | ------------------------------------ | ------- |
| **element** | string | - | - |
| **edge** | string | `'left', 'right', 'centered', 'all'` | `'all'` |
#### `overflowing([, direction])`
| argument | type | options | default |
| ------------- | ------ | ------------------------------------- | ------- |
| **direction** | string | `'vertically', 'horizontally', 'any'` | `'any'` |
#### `overlapping(element)`
| argument | type | options | default |
| ----------- | ------ | ------- | ------- |
| **element** | string | - | - |
### Dimensions
The following width and height assertions are chain-able and can be used with the .gt, .within and .lt methods
#### `width(measure)`
#### `height(measure)`
| argument | type | options | default |
| ----------- | ------ | ------- | ------- |
| **measure** | number | - | - |
### Positioning
The following assertions will check an elements distance is >= 0 if no distance is set
#### `rightOf(element[, distance])`
#### `leftOf(element[, distance])`
#### `above(element[, distance])`
#### `below(element[, distance])`
| argument | type | options | default |
| ------------ | ------ | ------- | ------- |
| **element** | string | - | - |
| **distance** | number | - | - |
#### `inside(element[, distances { top, left, bottom, right }])`
| argument | type | options | default |
| ------------- | ------ | ------- | ------- |
| **element** | string | - | - |
| **distances** | object | - | - |
### Styling
#### `style(property, value)`
| argument | type | options | default |
| ------------ | ------ | ------- | ------- |
| **property** | string | - | - |
| **value** | string | - | - |
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://github.com/msmps"><img src="https://avatars1.githubusercontent.com/u/7691252?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matt Simpson</b></sub></a><br /><a href="https://github.com/msmps/cypress-layout-inspector/commits?author=msmps" title="Code">💻</a> <a href="https://github.com/msmps/cypress-layout-inspector/commits?author=msmps" title="Documentation">📖</a> <a href="#ideas-msmps" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/msmps/cypress-layout-inspector/commits?author=msmps" title="Tests">⚠️</a></td>
<td align="center"><a href="https://github.com/satueveliina"><img src="https://avatars0.githubusercontent.com/u/526499?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Satu</b></sub></a><br /><a href="https://github.com/msmps/cypress-layout-inspector/commits?author=satueveliina" title="Code">💻</a> <a href="https://github.com/msmps/cypress-layout-inspector/commits?author=satueveliina" title="Documentation">📖</a> <a href="#ideas-satueveliina" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://github.com/david-boydell"><img src="https://avatars3.githubusercontent.com/u/36667923?v=4?s=100" width="100px;" alt=""/><br /><sub><b>david-boydell</b></sub></a><br /><a href="#ideas-david-boydell" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
[npm]: https://www.npmjs.com/
[node]: https://www.nodejs.org/
[cypress-io]: https://www.cypress.io/
[build-badge]: https://img.shields.io/github/workflow/status/msmps/cypress-layout-inspector/cypress-layout-inspector%20tests?style=flat-square
[build]: https://github.com/msmps/cypress-layout-inspector/actions
[version-badge]: https://img.shields.io/npm/v/cypress-layout-inspector?style=flat-square
[package]: https://www.npmjs.com/package/cypress-layout-inspector
[downloads-badge]: https://img.shields.io/npm/dm/cypress-layout-inspector?style=flat-square
[semantic-badge]: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg?style=flat-square
[semantic]: https://github.com/semantic-release/semantic-release
[github-watch-badge]: https://img.shields.io/github/watchers/msmps/cypress-layout-inspector.svg?style=social
[github-watch]: https://github.com/msmps/cypress-layout-inspector/watchers
[github-star-badge]: https://img.shields.io/github/stars/msmps/cypress-layout-inspector.svg?style=social
[github-star]: https://github.com/msmps/cypress-layout-inspector/stargazers
[twitter]: https://twitter.com/intent/tweet?text=Check%20out%20cypress-layout-inspector%20by%20%40msmps_%20https%3A%2F%2Fgithub.com%2Fmsmps%2Fcypress-layout-inspector%20%F0%9F%95%B5%EF%B8%8F%E2%80%8D%E2%99%82%EF%B8%8F
[twitter-badge]: https://img.shields.io/twitter/url/https/github.com/msmps/cypress-layout-inspector.svg?style=social