src/page_objects/web/profile/profile.page.js
import BasePage from "../../base.page.js";
/**
* ProfilePage
* @extends BasePage
*/
class ProfilePage extends BasePage {
/**
* @param {args} args Args from controller
*/
constructor(args) {
super(args);
}
// PAGE ELEMENTS
/* eslint-disable require-jsdoc, max-len */
username() {
return this.element(
"textarea[class^=components-SettingsModal-ProfileSettings__userNameInput]"
);
}
copyMeetingLinkButton() {
return this.element("button[Copy link]");
}
additionalNumbersLink() {
return this.element("a=Additional numbers");
}
nameEditSubmitButton() {
return this.element('button[type="submit"]');
}
nameEditCancelButton() {
return this.element('button[type="button"]');
}
allInfo() {
return this.elements(
"section[class^=components-SettingsModal-ProfileSettings__profileSection] dl"
);
}
/* eslint-enable require-jsdoc, max-len */
// PAGE FUNCTIONS
/** Private helper function to parseMyProfile that takes a string with all the
* information from the phone number element in My Profile and parses out the
* phone numbers into objects
* @param {String} allPhoneInfo String with newline chars and subheadings
* @return {Object} Object with number and extension
*/
_parsePhoneNumbers(allPhoneInfo) {
return allPhoneInfo.map(phoneNumber => {
const matchedText = phoneNumber.match(/(.+) extension (.+)/);
const number = matchedText[1];
const extension = matchedText[2];
return { number: number, extension: extension };
});
}
/* eslint-disable max-statements */
/**
* Parse information from My Profile
* @return {Object} containing username, meeting link, array of phone number
* objects, and video address
* @example Returns {
* name: 'KylieAdmin',
* meetingLink: 'https://call.lifesizecloudbeta.com/extension/8480359'
* phoneInfo: { extensionsMatch: true, extension: 8480359},
* videoAddress: '8480359@lifesizecloudbeta.com'
* }
* @todo Clean this up. We can probably declare additional elements at top.
*/
async parseMyProfile() {
const allInfo = await this.allInfo().all();
const name = await this.username().getText();
// Meeting Link
const meetingLinkElement = await allInfo[0].element("dd");
const meetingLinkText = await meetingLinkElement.getText();
const meetingLink = meetingLinkText.match(/(.+)Copy link/)[1];
// Phone numbers and extensions
const phoneDds = await allInfo[1].elements("dd");
const allPhoneDds = await phoneDds.all();
const allPhoneText = await Promise.all(
allPhoneDds.map(async e => await e.getText())
);
allPhoneText.pop(); // get rid of last element
const phoneInfo = await this._parsePhoneNumbers(allPhoneText);
// Video address
const videoAddressElement = await allInfo[2].element("dd");
const videoAddress = await videoAddressElement.getText();
return {
name,
meetingLink,
phoneInfo,
videoAddress
};
}
/* eslint-enable max-statements */
/**
* Open page for viewing additional numbers
*/
async goToAdditionalNumbers() {
await this.additionalNumbersLink().click();
}
/**
* Copy meeting link to clipboard
*/
async copyMeetingLink() {
await this.copyMeetingLinkButton().click();
}
/**
* Change username, and submit.
* @param {String} newName New username with desired changes
*/
async editNameSubmit(newName) {
await this.username().click();
await this.username().setValue(newName);
await this.nameEditSubmitButton().click();
}
/**
* Change username, and cancel.
* @param {String} newName New username with changes
*/
async editNameCancel(newName) {
await this.username().click();
await this.username().setValue(newName);
await this.nameEditCancelButton().click();
}
/**
* Get text from username element
* @return {String} text from username element
*/
async usernameText() {
return await this.username().getText();
}
}
export default ProfilePage;