Home Manual Reference Source

src/page_objects/web/chat/chat.page.js

import BasePage from "../../base.page.js";
import NavPanel from "../general/nav.panel.js";

/** 
 * ChatPage
 * @extends BasePage
 */
class ChatPage extends BasePage {
  /**
   * @param {args} args Args from controller
   */
  constructor(args) {
    super(args);
    this.navPanel = new NavPanel(args);
  }

  // PAGE ELEMENTS
  /* eslint-disable require-jsdoc, max-len */
  chatWindowHeader() {
    return this.element(
      "div[class^=components-Chat-ChatConversationHeader__chatWindowHeaderTitle]"
    );
  }

  chatMessageField() {
    return this.element("textarea#chatMessageField");
  }

  conversationWindow() {
    return this.element("div#conversationWindow");
  }

  newChatButton() {
    return this.element(
      "button[class^=components-Chat-ChatList__chatListHeaderButton]"
    );
  }

  chatContactSearchBar() {
    return this.element("input#chatContactSearch");
  }

  messageDivs() {
    return this.elements(
      `div[class^=components-Chat-ChatMessageGroup__messageItem]`
    );
  }

  contactsListItems(contactName) {
    return this.element(`li#chatContactListItem=${contactName}`);
  }

  contactSearchResult(contactName) {
    return this.element(
      `//div[contains(@class, 'components-Contacts-ContactListItem__overflowContainer') and contains(string(), '${contactName}')]`
    );
  }
  /* eslint-enable require-jsdoc, max-len */

  // PAGE FUNCTIONS

  /**
   * Visits this page
   */
  async visit() {
    await this.navPanel.chat().click();
  }

  /** 
   * Start a new chat with contact
   * @param {String} name Name of contact to start chat with
   */
  async startNewChatWithContact(name) {
    await this.newChatButton().click();
    await this.chatContactSearchBar().setValue(name);
    await this.contactSearchResult(name).click();
  }

  /** 
   * Get the first element in collection of elements
   * @returns {Array} Array of message objects 
   * @example
   * { 
   *   from: 'User 2', 
   *   timestamp: '12:20 PM', 
   *   message: 'hey, did you see the game?' 
   * }
   */
  async getChatMessages() {
    await this.pause(2000);

    const msgDivs = await this.messageDivs().all();
    return Promise.all(
      msgDivs.map(async div => {
        const innerDivs = await div.elements("div");
        const messageLabelDiv = await innerDivs.first();

        const fromElement = await messageLabelDiv.element(
          "span[class^=components-Chat-ChatMessageGroup__from]"
        );
        const timestampElement = await messageLabelDiv.element(
          "span[class^=components-Chat-ChatMessageGroup__timeStamp]"
        );
        const messageContentElement = await innerDivs.last();

        const from = await fromElement.getText();
        const timestamp = await timestampElement.getText();
        const messageContent = await messageContentElement.getText();

        return {
          from: from,
          timestamp: timestamp,
          message: messageContent
        };
      })
    );
  }

  /**
   * Send chat message on current chat page
   * @param {String} message Text of message to send
   */
  async sendChatMessage(message) {
    await this.chatMessageField().setValue(message);
    await this.keys("Enter");
  }

  /**
   * Clicks contact with provided name
   * @param {String} name Name of contact
   */
  async clickContact(name) {
    try {
      await this.contactsListItems(name).click();
    } catch (err) {
      throw new Error(`Could not click contact named '${name}' (${err})`);
    }
  }
}

export default ChatPage;