| import { |
| expectPlausibleInAction, |
| hideCurrentTab, |
| hideAndShowCurrentTab |
| } from './support/test-utils' |
| import { test, expect } from '@playwright/test' |
| import { LOCAL_SERVER_ADDR } from './support/server' |
|
|
| test.describe('scroll depth (engagement events)', () => { |
| test('sends scroll_depth in the pageleave payload when navigating to the next page', async ({ |
| page |
| }) => { |
| await expectPlausibleInAction(page, { |
| action: () => page.goto('/scroll-depth.html'), |
| expectedRequests: [{ n: 'pageview' }] |
| }) |
|
|
| await page.evaluate(() => window.scrollBy(0, 300)) |
| await page.evaluate(() => window.scrollBy(0, 0)) |
|
|
| await expectPlausibleInAction(page, { |
| action: () => page.click('#navigate-away'), |
| expectedRequests: [ |
| { n: 'engagement', u: `${LOCAL_SERVER_ADDR}/scroll-depth.html`, sd: 20 } |
| ] |
| }) |
| }) |
|
|
| test('sends scroll depth on hash navigation', async ({ page }) => { |
| await expectPlausibleInAction(page, { |
| action: () => page.goto('/scroll-depth-hash.html'), |
| expectedRequests: [{ n: 'pageview' }] |
| }) |
|
|
| await expectPlausibleInAction(page, { |
| action: () => page.click('#about-link'), |
| expectedRequests: [ |
| { |
| n: 'engagement', |
| u: `${LOCAL_SERVER_ADDR}/scroll-depth-hash.html`, |
| sd: 100 |
| }, |
| { |
| n: 'pageview', |
| u: `${LOCAL_SERVER_ADDR}/scroll-depth-hash.html#about` |
| } |
| ] |
| }) |
|
|
| await expectPlausibleInAction(page, { |
| action: () => page.click('#home-link'), |
| expectedRequests: [ |
| { |
| n: 'engagement', |
| u: `${LOCAL_SERVER_ADDR}/scroll-depth-hash.html#about`, |
| sd: 34 |
| }, |
| { n: 'pageview', u: `${LOCAL_SERVER_ADDR}/scroll-depth-hash.html#home` } |
| ] |
| }) |
| }) |
|
|
| test('document height gets reevaluated after window load', async ({ |
| page |
| }) => { |
| await expectPlausibleInAction(page, { |
| action: () => page.goto('/scroll-depth-slow-window-load.html'), |
| expectedRequests: [{ n: 'pageview' }] |
| }) |
|
|
| |
| await page.waitForFunction(() => { |
| return document.getElementById('slow-image').complete |
| }) |
|
|
| await expectPlausibleInAction(page, { |
| action: () => page.click('#navigate-away'), |
| expectedRequests: [ |
| { |
| n: 'engagement', |
| u: `${LOCAL_SERVER_ADDR}/scroll-depth-slow-window-load.html`, |
| sd: 24 |
| } |
| ] |
| }) |
| }) |
|
|
| test('dynamically loaded content affects documentHeight', async ({ |
| page |
| }) => { |
| await expectPlausibleInAction(page, { |
| action: () => page.goto('/scroll-depth-dynamic-content-load.html'), |
| expectedRequests: [{ n: 'pageview' }] |
| }) |
|
|
| |
| await expectPlausibleInAction(page, { |
| action: () => page.click('#navigate-away'), |
| expectedRequests: [ |
| { |
| n: 'engagement', |
| u: `${LOCAL_SERVER_ADDR}/scroll-depth-dynamic-content-load.html`, |
| sd: 14 |
| } |
| ] |
| }) |
| }) |
|
|
| test('document height gets reevaluated on scroll', async ({ page }) => { |
| await expectPlausibleInAction(page, { |
| action: () => page.goto('/scroll-depth-content-onscroll.html'), |
| expectedRequests: [{ n: 'pageview' }] |
| }) |
|
|
| |
| |
| |
| await page.waitForTimeout(3100) |
|
|
| |
| await page.evaluate(() => window.scrollBy(0, document.body.scrollHeight)) |
|
|
| |
| await expect(page.getByText('Navigate away')).toBeVisible() |
|
|
| await page.evaluate(() => window.scrollBy(0, 1000)) |
|
|
| await expectPlausibleInAction(page, { |
| action: () => page.click('#navigate-away'), |
| expectedRequests: [ |
| { |
| n: 'engagement', |
| u: `${LOCAL_SERVER_ADDR}/scroll-depth-content-onscroll.html`, |
| sd: 80 |
| } |
| ] |
| }) |
| }) |
|
|
| test('sends scroll depth when minimizing the tab', async ({ page }) => { |
| await expectPlausibleInAction(page, { |
| action: () => page.goto('/scroll-depth.html'), |
| expectedRequests: [{ n: 'pageview' }] |
| }) |
|
|
| await page.evaluate(() => window.scrollBy(0, 300)) |
| await page.waitForTimeout(100) |
|
|
| await expectPlausibleInAction(page, { |
| action: () => hideCurrentTab(page), |
| expectedRequests: [ |
| { n: 'engagement', u: `${LOCAL_SERVER_ADDR}/scroll-depth.html`, sd: 20 } |
| ] |
| }) |
| }) |
|
|
| test('re-sends engagement events only when user has scrolled in-between', async ({ |
| page, |
| browserName |
| }) => { |
| test.skip(browserName === 'webkit', 'flaky') |
|
|
| await expectPlausibleInAction(page, { |
| action: async () => { |
| await page.goto('/scroll-depth.html') |
| await hideAndShowCurrentTab(page) |
| }, |
| expectedRequests: [ |
| { n: 'pageview' }, |
| { n: 'engagement', u: `${LOCAL_SERVER_ADDR}/scroll-depth.html`, sd: 14 } |
| ] |
| }) |
|
|
| await expectPlausibleInAction(page, { |
| action: () => hideAndShowCurrentTab(page), |
| expectedRequests: [], |
| refutedRequests: [{ n: 'engagement' }] |
| }) |
|
|
| await page.evaluate(() => window.scrollBy(0, 300)) |
|
|
| await expectPlausibleInAction(page, { |
| action: () => hideCurrentTab(page), |
| expectedRequests: [ |
| { n: 'engagement', u: `${LOCAL_SERVER_ADDR}/scroll-depth.html`, sd: 20 } |
| ] |
| }) |
| }) |
|
|
| test('gets correct scroll depth when script has no async', async ({ |
| page |
| }) => { |
| await expectPlausibleInAction(page, { |
| action: async () => { |
| await page.goto('/no-async.html') |
| await hideAndShowCurrentTab(page) |
| }, |
| expectedRequests: [ |
| { n: 'pageview' }, |
| { n: 'engagement', u: `${LOCAL_SERVER_ADDR}/no-async.html`, sd: 100 } |
| ] |
| }) |
|
|
| await page.waitForTimeout(1000) |
| }) |
| }) |
|
|