Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
export default class mediaroundedcorners {
constructor(page) {
this.page = page;
// Media rounded corners styles for both images and madia block UI locators
this.mediaRoundedCornerImageGroup = page.locator('.section.three-up.s-spacing');
this.firstimagerow = this.mediaRoundedCornerImageGroup.locator('.media-row').nth(0);
this.secondimagerow = this.mediaRoundedCornerImageGroup.locator('.media-row').nth(1);
this.thirdimagerow = this.mediaRoundedCornerImageGroup.locator('.media-row').nth(2);
this.image_SmallRoundedCorners = this.mediaRoundedCornerImageGroup.locator('.media.s-rounded-corners-image.con-block.has-bg').first();
this.image_MediumRoundedCorners = this.mediaRoundedCornerImageGroup.locator('media.m-rounded-corners-image.con-block.has-bg');
this.image_LargeRoundedCorners = this.mediaRoundedCornerImageGroup.locator('media.l-rounded-corners-image.con-block.has-bg');
this.mediaRoundedBlockGroup = page.locator('.section.two-up.s-spacing').first();
this.firstMediaBlock = this.mediaRoundedBlockGroup.locator('.media.l-rounded-corners.con-block.has-bg');
this.secondMediaBlock = this.mediaRoundedBlockGroup.locator('.media.large.dark.m-rounded-corners.s-rounded-corners-image.con-block.has-bg.media-reverse-mobile');
this.imageWithInBlock = this.mediaRoundedBlockGroup.locator('//img[@src="./media_15701a692530b54cb77445d12a98ec8d5b498e188.jpeg?width=750&format=jpeg&optimize=medium"]');
this.fullRoundedCornersBlock = page.locator('.media.l-rounded-corners.full-rounded-corners-image.con-block');
this.fullRoundedcornerimage = this.fullRoundedCornersBlock.locator('//img[@src="./media_1f320de06e9c6a05dc899e773a62d93cf1149bb40.jpeg?width=750&format=jpeg&optimize=medium"]');
// image & block rounded corner css property
this.cssProperties = {
smallRoundedCorners: { 'border-radius': '4px' },
mediumRoundedCorners: { 'border-radius': '8px' },
largeRoundedCorners: { 'border-radius': '16px' },
fullRoundedCorners: { 'border-radius': '50%' },
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
module.exports = {
name: 'mediaroundedcorners',
features: [
{
tcid: '0',
name: 'media-roundedsmall',
path: '/drafts/Automation-PW/blocks/round-media-block?georouting=off',
tags: '@cc @cc-mediarounded @cc-imageroundedcornersmall',
},
{
tcid: '1',
name: 'media-roundedmedium',
path: '/drafts/Automation-PW/blocks/round-media-block?georouting=off',
tags: '@cc @cc-mediarounded @cc-imageroundedcornermedium',
},
{
tcid: '2',
name: 'media-roundedlarge',
path: '/drafts/Automation-PW/blocks/round-media-block?georouting=off',
tags: '@cc @cc-mediarounded @cc-imageroundedcornerlarge',
},
],
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { expect, test } from '@playwright/test';
import { features } from './mediablockroundedcorners.spec.js';
import Mediaroundcorners from './mediablockroundedcorners.page.js';

let roundcorners;
test.describe('verify media rounder corners features for media block and its images', () => {
test.beforeEach(async ({ page }) => {
roundcorners = new Mediaroundcorners(page);
});
test(`${features[0].name},${features[0].tags}`, async ({ page, baseURL }) => {
console.info(`[Test Page]: ${baseURL}${features[0].path}`);
await test.step('media block image with small 4x rounded corners', async () => {
await page.goto(`${baseURL}${features[0].path}`);
await page.waitForLoadState('domcontentloaded');
await expect(page).toHaveURL(`${baseURL}${features[0].path}`);
});
await test.step('media block image with small 4x rounded corners style', async () => {
await page.waitForLoadState();
await expect(await roundcorners.mediaRoundedCornerImageGroup).toBeTruthy();
await expect(await roundcorners.image_SmallRoundedCorners).toBeTruthy();
});
});
test(`${features[1].name},${features[1].tags}`, async ({ page, baseURL }) => {
console.info(`[Test Page]: ${baseURL}${features[1].path}`);
await test.step('media block image with medium 8x rounded corners', async () => {
await page.goto(`${baseURL}${features[1].path}`);
await page.waitForLoadState('domcontentloaded');
await expect(page).toHaveURL(`${baseURL}${features[1].path}`);
});
await test.step('media block image with Medium 8x rounded corners style', async () => {
await page.waitForLoadState();
await expect(await roundcorners.mediaRoundedCornerImageGroup).toBeTruthy();
await expect(await roundcorners.image_MediumRoundedCorners).toBeTruthy();
});
});

test(`${features[2].name},${features[2].tags}`, async ({ page, baseURL }) => {
console.info(`[Test Page]: ${baseURL}${features[2].path}`);
await test.step('media block image with large 16x rounded corners', async () => {
await page.goto(`${baseURL}${features[2].path}`);
await page.waitForLoadState('domcontentloaded');
await expect(page).toHaveURL(`${baseURL}${features[2].path}`);
});
await test.step('media block image with large 16x rounded corners style', async () => {
await page.waitForLoadState();
await expect(await roundcorners.mediaRoundedCornerImageGroup).toBeTruthy();
await expect(await roundcorners.image_LargeRoundedCorners).toBeTruthy();
});
});
});
30 changes: 30 additions & 0 deletions nala/blocks/merchtable/merchtable.page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
export default class merchtable {
constructor(page) {
this.page = page;
// merch table page UI selectors to check 3 column layout
this.merchTableSection = page.locator('.section.table-merch-section');
this.firstColumn = this.merchTableSection.locator('.col.col-1.col-heading');
this.secondColumn = this.merchTableSection.locator('.col.col-2.col-heading.light');
this.thirdColumn = this.merchTableSection.locator('.col.col-3.col-heading.dark');
this.productMnemonics = page.locator('//img[@src="./media_139dede8055046fb80034053bbe235aaadc823b7a.png?width=750&format=png&optimize=medium"]').first();
// @merchtable-headrowitems
this.FirstRowHeading = page.locator('.row.row-1.row-heading');
this.firstColumnHeading = this.FirstRowHeading.locator('.col.col-1.col-heading');
this.secondColumnHeading = this.FirstRowHeading.locator('.col.col-2.col-heading.light');
this.thirdColumnHeading = this.FirstRowHeading.locator('.col.col-3.col-heading.dark');
this.fixedColumnheading = page.locator('//div[@class="section-head-title col col-1"]//strong[text()="Includes:"]');
// @merchtable-rowheadprices
this.ccIndividaulProductPrice = page.locator('.price.price-optical').nth(0);
this.ccStudentProductPrice = page.locator('.price.price-optical').nth(1);
this.ccTeamsProductPrice = page.locator('.price').nth(2);
this.freeTrialBtn = page.locator('.con-button.outline.button-l').first();
this.buyNowBtn = page.locator('.con-button.blue.button-l').first();
// @merchtable-appdetails
this.listOfAppsInRows1 = page.locator('.col-merch-content').nth(0);
this.appPhotoshop = this.listOfAppsInRows1.locator('//p[text()="Photoshop"]').nth(0);
this.listOfAppsInRows2 = page.locator('.col-merch-content').nth(4);
this.appFresco = this.listOfAppsInRows1.locator('//p[text()="fresco"]').nth(1);
this.listOfAppsInRows3 = page.locator('.col-merch-content').nth(8);
this.appPhotoshopExpress = this.listOfAppsInRows1.locator('//p[text()="Photoshop Express"]').nth(2);
}
}
35 changes: 35 additions & 0 deletions nala/blocks/merchtable/merchtable.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
module.exports = {
name: 'merchtable',
features: [
{
tcid: '0',
name: '@merchtable-3column-layout-block',
path: '/drafts/Automation-PW/merch-table?georouting=off',
tags: '@cc @cc-merchtable @cc-merchtableui',
},
{
tcid: '1',
name: '@merchtable-headrowitems',
path: '/drafts/Automation-PW/merch-table?georouting=off',
tags: '@cc @cc-merchtable @cc-merchtableheadrow',
},
{
tcid: '2',
name: '@merchtable-rowheadprices',
path: '/drafts/Automation-PW/merch-table?georouting=off',
tags: '@cc @cc-merchtable @cc-merchtableprices',
data: {
ccIndividualPrice: 'US$54.99/mo',
ccStudentPrice: 'US$9.99/mo',
ccTeamsprice: 'US$22.99/mo',
ccTeamsStrikeThrough: 'Regularly at US$54.99 per month',
},
},
{
tcid: '3',
name: '@merchtable-appdetails',
path: '/drafts/Automation-PW/merch-table?georouting=off',
tags: '@cc @cc-merchtable @cc-appdeatilsinrows',
},
],
};
79 changes: 79 additions & 0 deletions nala/blocks/merchtable/merchtable.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { expect, test } from '@playwright/test';
import { features } from './merchtable.spec.js';
import Merchtable from './merchtable.page.js';

let merchtable;
test.describe('verify merch table colum layout, headings, CSS styles, images rendering, price CTAs', () => {
test.beforeEach(async ({ page }) => {
merchtable = new Merchtable(page);
});
// Test merch table block to be shown 3 column layout when placed on page
test(`${features[0].name},${features[0].tags}`, async ({ page, baseURL }) => {
console.info(`[Test Page]: ${baseURL}${features[0].path}`);
await test.step('merch table should have 3 column layout when authored', async () => {
await page.goto(`${baseURL}${features[0].path}`);
await page.waitForLoadState('domcontentloaded');
await expect(page).toHaveURL(`${baseURL}${features[0].path}`);
});
await test.step('step-2: 3 columns should showup with memonics', async () => {
await page.waitForLoadState();
expect(await merchtable.merchTableSection).toBeTruthy();
expect(await merchtable.firstColumn).toBeTruthy();
expect(await merchtable.secondColumn).toBeTruthy();
expect(await merchtable.thirdColumn).toBeTruthy();
expect(await merchtable.productMnemonics).toBeTruthy();
});
});

// Test merch table first row in the 3 column has heading
test(`${features[1].name},${features[1].tags}`, async ({ page, baseURL }) => {
console.info(`[Test Page]: ${baseURL}${features[1].path}`);
await test.step('merch table first row in the 3 column has product headings', async () => {
await page.goto(`${baseURL}${features[1].path}`);
await page.waitForLoadState('domcontentloaded');
await expect(page).toHaveURL(`${baseURL}${features[1].path}`);
});
await test.step('step-2: 3 columns first row is head column', async () => {
await page.waitForLoadState();
expect(await merchtable.fixedColumnheading).toBeTruthy();
expect(await merchtable.firstColumnHeading).toBeTruthy();
expect(await merchtable.secondColumnHeading).toBeTruthy();
expect(await merchtable.thirdColumnHeading).toBeTruthy();
});
});

// Test merch table column heading showing valid prodcut price with CTAs
test(`${features[2].name},${features[2].tags}`, async ({ page, baseURL }) => {
console.info(`[Test Page]: ${baseURL}${features[2].path}`);
const { data } = features[2];
await test.step('merch table column heading has valid product prices and CTAs', async () => {
await page.goto(`${baseURL}${features[2].path}`);
await page.waitForLoadState('domcontentloaded');
await expect(page).toHaveURL(`${baseURL}${features[2].path}`);
});
await test.step('step-2: product price checks with CTAs', async () => {
await page.waitForLoadState();
await expect(merchtable.freeTrialBtn).toBeVisible();
await expect(merchtable.buyNowBtn).toBeVisible();
await expect(merchtable.ccIndividaulProductPrice).toContainText(data.ccIndividualPrice);
await expect(merchtable.ccStudentProductPrice).toContainText(data.ccStudentPrice);
await expect(merchtable.ccTeamsProductPrice).toContainText(data.ccTeamsprice);
});
});

// Test merch table app details rows in each product column
test(`${features[3].name},${features[3].tags}`, async ({ page, baseURL }) => {
console.info(`[Test Page]: ${baseURL}${features[3].path}`);
await test.step('merch table had product details in each column', async () => {
await page.goto(`${baseURL}${features[3].path}`);
await page.waitForLoadState('domcontentloaded');
await expect(page).toHaveURL(`${baseURL}${features[3].path}`);
});
await test.step('step-2: apps display in the colums as list', async () => {
await page.waitForLoadState();
expect(await merchtable.appPhotoshop).toBeTruthy();
expect(await merchtable.appFresco).toBeTruthy();
expect(await merchtable.appPhotoshopExpress).toBeTruthy();
});
});
});
21 changes: 21 additions & 0 deletions nala/blocks/photoshop-unity/photoshop-unity.page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export default class CCPhotoshopUnity {
constructor(page) {
this.page = page;

this.unityBlock = page.locator('.upload-block.unity-enabled');
this.uploadButton = this.unityBlock.locator("div.upload-grid.desktop-up button[type='button']");
this.fileInput = this.unityBlock.locator('input[type="file"][id="file-upload"]').first();
this.dropZone = this.unityBlock.locator('div.upload-grid.desktop-up >> div.drop-zone');
this.alertContent = this.unityBlock.locator('div.upload-grid.desktop-up div.alert-content');
this.dragAndDropText = this.unityBlock.locator('div.drop-zone p:has-text("Drag and drop an image")');
this.videoElement = this.unityBlock.locator('div.upload-grid.desktop-up video');
this.OnlineVideoElement = this.unityBlock.locator('div.media-container video');
this.OnlinedropZoneText = this.unityBlock.locator('div.upload-grid.desktop-up div.drop-zone p:nth-child(1)');
this.OnlineAgreementText = this.unityBlock.locator("//div[@class='upload-grid desktop-up']//p[contains(text(),'By uploading your')]");
this.dropZoneParagraph = this.unityBlock.locator("div[class='upload-grid desktop-up'] div[class='drop-zone'] p").first();
this.uploadDisclaimer = this.unityBlock.locator('div.upload-grid.desktop-up p', { hasText: 'By uploading your image or video' });
this.removeBackgroundButton = page.locator('sp-action-button:has-text("Remove background")');
this.progressHolder = page.locator('div.progress-holder');
this.photoshopPreviewHeading = page.locator('h2#one-moment-as-we-take-you-to-photoshop-preview:has-text("One moment")').nth(0);
}
}
11 changes: 11 additions & 0 deletions nala/blocks/photoshop-unity/photoshop-unity.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module.exports = {
name: 'CC-Photoshop-Unity-Widget',
features: [
{
tcid: '0',
name: '@CC-PhotoshopUnity-UI',
path: '/drafts/automation-pw/online?georouting=off',
tags: '@cc @cc-PSUnitywidget @cc-removeBGCheckUI',
},
],
};
31 changes: 31 additions & 0 deletions nala/blocks/photoshop-unity/photoshop-unity.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { expect, test } from '@playwright/test';
import { features } from './photoshop-unity.spec.js';
import CCPhotoshopUnity from './photoshop-unity.page.js';

let ccPhotoshopUnity;

test.describe('Verify Photoshop Unity Widget functionality on Stage', () => {
test.beforeEach(async ({ page }) => {
ccPhotoshopUnity = new CCPhotoshopUnity(page);
});
// close the page after each test
test.afterEach(async ({ page }) => {
await page.close();
});

// check the page load and UI elements
test(`${features[0].name}, ${features[0].tags}`, async ({ page, baseURL }) => {
console.log(`Running test: ${features[0].name}`);
await test.step('Check page load and UI elements', async () => {
await page.goto(`${baseURL}${features[0].path}`);
await page.waitForLoadState('domcontentloaded');
await expect(page).toHaveURL(`${baseURL}${features[0].path}`);
await expect(ccPhotoshopUnity.uploadButton).toBeTruthy();
await expect(ccPhotoshopUnity.dropZone).toBeVisible();
await expect(ccPhotoshopUnity.dragAndDropText).toBeVisible();
await expect(ccPhotoshopUnity.videoElement).toBeVisible();
await expect(ccPhotoshopUnity.dropZoneParagraph).toBeVisible();
await expect(ccPhotoshopUnity.uploadDisclaimer).toBeVisible();
});
});
});
15 changes: 15 additions & 0 deletions nala/blocks/promobar/promobar.page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
export default class promocloseaction {
constructor(page) {
this.page = page;
// promobar with close action UI elements
this.promoBar = page.locator('.foreground.container').last();
this.promoBarMobile = this.promoBar.locator('.mobile-up.promo-text');
this.promoBarTablet = this.promoBar.locator('.tablet-up.promo-text');
this.promoBarDesktop = this.promoBar.locator('.desktop-up.promo-text');
this.PromoText = this.promoBarDesktop.locator('.text-area').nth(0);
this.promosticky = page.locator('.section.promo-sticky-section.popup.static-links.sticky-bottom');
this.promoNotSticky = page.locator('.section.promo-sticky-section.popup.static-links.sticky-bottom.close-sticky-section');
this.promoCTA = page.locator('.body-s.action-area').last();
this.promoClose = page.locator('.promo-close');
}
}
24 changes: 24 additions & 0 deletions nala/blocks/promobar/promobar.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
module.exports = {
name: 'promocloseaction',
features: [
{
tcid: '0',
name: '@promocloseaction-page',
path: '/drafts/Automation-PW/blocks/promocloseaction-pageload?georouting=off',
tags: '@cc @cc-promocloseaction @cc-promoui',
},
{
tcid: '1',
name: '@promocloseaction-closebuttonfunction',
path: '/drafts/Automation-PW/blocks/promocloseaction-pageload?georouting=off',
tags: '@cc @cc-promocloseaction @cc-promoclosefeature',
},
{
tcid: '2',
name: '@promocloseaction-getstart-CTA',
path: '/drafts/Automation-PW/blocks/promocloseaction-pageload?georouting=off',
tags: '@cc @cc-promocloseaction @cc-promogetctaaction',
url: 'https://www.adobe.com/creativecloud/plan-recommender/quiz.html',
},
],
};
Loading
Loading