|
1 | 1 | // Imports |
2 | 2 | import path from 'path'; |
| 3 | +import { Page } from 'puppeteer'; |
3 | 4 |
|
4 | 5 | // Helper functions used in multiple tests |
5 | 6 | const currentFocusID = () => page.evaluate(() => document.activeElement.id); |
6 | 7 | const menuOpen = () => page.waitForSelector('#menu', { visible: true }); |
7 | 8 | const menuClosed = () => page.waitForSelector('#menu', { hidden: true }); |
| 9 | +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); |
| 10 | + |
| 11 | +const menuIsOpen = async (page: Page) => |
| 12 | + await page.evaluate(() => { |
| 13 | + const element = document.querySelector('#menu'); |
| 14 | + const style = getComputedStyle(element); |
| 15 | + const rect = element.getBoundingClientRect(); |
| 16 | + |
| 17 | + return style.visibility !== 'hidden' && !!(rect.bottom || rect.top || rect.height || rect.width); |
| 18 | + }); |
8 | 19 |
|
9 | 20 | // Tests |
10 | 21 | beforeEach(async () => { |
@@ -82,17 +93,17 @@ it('leaves the menu open if you click inside of it', async () => { |
82 | 93 | }); |
83 | 94 |
|
84 | 95 | await page.click('#menu-item-3'); |
85 | | - await new Promise((resolve) => setTimeout(resolve, 1000)); // visibility: hidden is delayed via CSS |
86 | | - await menuOpen(); // times out if menu closes |
| 96 | + await sleep(1000); // visibility: hidden is delayed via CSS |
| 97 | + expect(await menuIsOpen(page)).toBe(true); |
87 | 98 |
|
88 | 99 | const { xOffset, yOffset } = await page.evaluate((el: HTMLElement) => { |
89 | 100 | const { left: xOffset, top: yOffset } = el.getBoundingClientRect(); |
90 | 101 | return { xOffset, yOffset }; |
91 | 102 | }, await page.$('#menu')); |
92 | 103 |
|
93 | 104 | await page.mouse.click(xOffset + 2, yOffset + 2); // Click just inside the top left corner (`page.click()` clicks the center, which is a link to NPM) |
94 | | - await new Promise((resolve) => setTimeout(resolve, 1000)); // visibility: hidden is delayed via CSS |
95 | | - await menuOpen(); // times out if menu closes |
| 105 | + await sleep(1000); // visibility: hidden is delayed via CSS |
| 106 | + expect(await menuIsOpen(page)).toBe(true); |
96 | 107 |
|
97 | 108 | expect(true).toBe(true); |
98 | 109 | }); |
|
0 commit comments