Skip to content

Commit 845e178

Browse files
authored
me-17957: test if video on autoplay on scroll page is playing (#763)
* vp test: test if video on autoplay on scroll page is playing * vp test: remove waitForTimeout and use expect toPass * vp test: remove waitForTimeout and use expect toPass * vp test: added BaseComponent and modified accordingly
1 parent 753f115 commit 845e178

File tree

5 files changed

+109
-8
lines changed

5 files changed

+109
-8
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { Locator, Page } from '@playwright/test';
2+
3+
/**
4+
* Base component constructor interface
5+
*
6+
* selector is optional in order to allow default selector usage.
7+
* For example:
8+
*
9+
* constructor(dataProps: IBaseComponent) {
10+
* const baseComponentProps: IBaseComponent = dataProps;
11+
* baseComponentProps.selector = dataProps?.selector ?? "//*<SOME DEFAULT SELECTOR>";
12+
* super(baseComponentProps);
13+
* ...
14+
* }
15+
*/
16+
export interface IBaseComponent {
17+
page: Page;
18+
selector: string;
19+
parentSelector?: string;
20+
iframeSelector?: string;
21+
}
22+
/**
23+
* Base class for an POM component class
24+
* such as buttons, dropList, etc
25+
*/
26+
export class BaseComponent {
27+
get locator(): Locator {
28+
return this._locator;
29+
}
30+
31+
get props(): IBaseComponent {
32+
return this._props;
33+
}
34+
35+
private readonly _locator: Locator;
36+
private readonly _props: IBaseComponent;
37+
38+
constructor(basePageProps: IBaseComponent) {
39+
if (!basePageProps.selector) {
40+
throw Error(`Missing selector in basePageProps`);
41+
}
42+
const elementSelector: string = basePageProps.parentSelector ? `${basePageProps.parentSelector}${basePageProps.selector}` : basePageProps.selector;
43+
44+
this._props = basePageProps;
45+
this._locator = basePageProps.iframeSelector
46+
? basePageProps.page.frameLocator(basePageProps.iframeSelector).locator(elementSelector)
47+
: basePageProps.page.locator(elementSelector);
48+
}
49+
}
Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
import { Page } from '@playwright/test';
2+
import { BaseComponent } from './BaseComponent';
23

34
/**
45
* Video component
56
*/
6-
export class VideoComponent {
7-
private page: Page;
8-
private readonly videoSelector: string;
7+
export class VideoComponent extends BaseComponent{
98

109
constructor(page: Page, videoSelector: string) {
11-
this.page = page;
12-
this.videoSelector = videoSelector;
10+
super({ page, selector: videoSelector });
1311
}
1412

1513
/**
1614
* Click the play button if necessary in case video is not autoplay
1715
*/
1816
public async clickPlay(): Promise<void> {
19-
const videoPlayButtonLocator = this.page.locator(`${this.videoSelector}/following-sibling::button[contains(@class, "vjs-big-play-button")]`);
17+
const videoPlayButtonLocator = this.props.page.locator(`${this.props.selector}/following-sibling::button[contains(@class, "vjs-big-play-button")]`);
2018
// Click the play button to start the video
2119
return videoPlayButtonLocator.click();
2220
}
@@ -25,11 +23,11 @@ export class VideoComponent {
2523
* Checks if video element is paused
2624
*/
2725
public async isPaused(): Promise<boolean> {
28-
return this.page.evaluate((selector: string) => {
26+
return this.props.page.evaluate((selector: string) => {
2927
console.log('Evaluating selector in browser context:', selector); // Logs selector in browser context
3028
const xpathResult = document.evaluate(selector, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
3129
const video = xpathResult.singleNodeValue as HTMLVideoElement | null;
3230
return video.paused;
33-
}, this.videoSelector);
31+
}, this.props.selector);
3432
}
3533
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { vpTest } from '../fixtures/vpTest';
2+
import { expect, test } from '@playwright/test';
3+
import { waitForPageToLoadWithTimeout } from '../src/helpers/waitForPageToLoadWithTimeout';
4+
import { getLinkByName } from '../testData/pageLinksData';
5+
import { ExampleLinkName } from '../testData/ExampleLinkNames';
6+
7+
// Link to autoplay on scroll page
8+
const link = getLinkByName(ExampleLinkName.AutoplayOnScroll);
9+
/**
10+
* Testing if video on autoplay on scroll page is playing.
11+
* First making sure that video is not playing before scrolling.
12+
* Then, scroll until video element is visible and make sure video is playing by checking that is pause return false.
13+
*/
14+
vpTest(`Test if video on autoplay on scroll page is playing as expected`, async ({ page, pomPages }) => {
15+
await test.step('Navigate to autoplay on scroll page by clicking on link', async () => {
16+
await pomPages.mainPage.clickLinkByName(link.name);
17+
await waitForPageToLoadWithTimeout(page, 5000);
18+
});
19+
await test.step('Validating that the video is not playing before scrolling (in case isPause is true)', async () => {
20+
expect(await pomPages.autoplayOnScrollPage.autoplayOnScrollVideoComponent.isPaused()).toEqual(true);
21+
});
22+
await test.step('Scroll until the video element is visible', async () => {
23+
await pomPages.autoplayOnScrollPage.autoplayOnScrollVideoComponent.locator.scrollIntoViewIfNeeded();
24+
});
25+
await test.step('Validating that the video is auto playing after scrolling (in case isPause is false)', async () => {
26+
await expect(async () => {
27+
expect(await pomPages.autoplayOnScrollPage.autoplayOnScrollVideoComponent.isPaused()).toEqual(false);
28+
}).toPass({ intervals: [500], timeout: 3000 });
29+
})
30+
});

test/e2e/src/pom/PageManager.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { MainPage } from './mainPage';
55
import { AnalyticsPage } from './analyticsPage';
66
import { ApiAndEventsPage } from './apiAndEventsPage';
77
import { AudioPlayerPage } from './audioPlayerPage';
8+
import { AutoplayOnScrollPage } from './autoplayOnScrollPage';
89

910
/**
1011
* Page manager,
@@ -64,5 +65,12 @@ export class PageManager {
6465
public get audioPlayerPage(): AudioPlayerPage {
6566
return this.getPage(AudioPlayerPage);
6667
}
68+
69+
/**
70+
* Returns autoplay on scroll page object
71+
*/
72+
public get autoplayOnScrollPage(): AutoplayOnScrollPage {
73+
return this.getPage(AutoplayOnScrollPage);
74+
}
6775
}
6876
export default PageManager;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Page } from '@playwright/test';
2+
import { VideoComponent } from '../../components/videoComponent';
3+
import { BasePage } from './BasePage';
4+
const AUTOPLAY_ON_SCROLL_PAGE_VIDEO_SELECTOR = '//*[@id="player_html5_api"]';
5+
6+
/**
7+
* Video player examples autoplay on scroll page object
8+
*/
9+
export class AutoplayOnScrollPage extends BasePage {
10+
public autoplayOnScrollVideoComponent: VideoComponent;
11+
12+
constructor(page: Page) {
13+
super(page);
14+
this.autoplayOnScrollVideoComponent = new VideoComponent(page, AUTOPLAY_ON_SCROLL_PAGE_VIDEO_SELECTOR);
15+
}
16+
}

0 commit comments

Comments
 (0)