aboutsummaryrefslogblamecommitdiff
path: root/e2e/lib/Page.ts
blob: 31605cbf6126b9293e47fe9b93013e480667cdb5 (plain) (tree)
1
2
3
4
5
6
7
8






                                                          



                  














                                                                                       
                                                                  








                                                    
                                                                                 







                                                                                                    
                                                                                 




















                                                                                            











                                                                                           

                                                                               



                                                                                 







                                                                   
                                                                                





                                                                                        
import { WebDriver, By, until } from 'selenium-webdriver';
import { Console } from './Console';

type Hint = {
  displayed: boolean,
  text: string,
};

type Selection = {
  from: number,
  to: number,
};

export default class Page {
  private constructor(private webdriver: WebDriver) {
  }

  static async currentContext(webdriver: WebDriver): Promise<Page> {
    await Page.waitForConsoleLoaded(webdriver);
    return new Page(webdriver);
  }

  static async navigateTo(webdriver: WebDriver, url: string): Promise<Page> {
    await webdriver.navigate().to(url);
    await Page.waitForConsoleLoaded(webdriver);
    return new Page(webdriver);
  }

  async sendKeys(...keys: Array<string|number|Promise<string|number>>): Promise<void> {
    const body = await this.webdriver.findElement(By.css('body'));
    await body.sendKeys(...keys);
  }

  async navigateTo(url: string): Promise<Page> {
    await this.webdriver.navigate().to(url);
    await Page.waitForConsoleLoaded(this.webdriver);
    return new Page(this.webdriver);
  }

  async showConsole(): Promise<Console> {
    const iframe = this.webdriver.findElement(By.css('#vimvixen-console-frame'));

    await this.sendKeys(':');
    await this.webdriver.wait(until.elementIsVisible(iframe));
    await this.webdriver.switchTo().frame(0);
    await this.webdriver.wait(until.elementLocated(By.css('input.vimvixen-console-command-input')));
    return new Console(this.webdriver);
  }

  async getConsole(): Promise<Console> {
    const iframe = this.webdriver.findElement(By.css('#vimvixen-console-frame'));

    await this.webdriver.wait(until.elementIsVisible(iframe));
    await this.webdriver.switchTo().frame(0);
    return new Console(this.webdriver);
  }

  async getScrollX(): Promise<number> {
    return await this.webdriver.executeScript(() => window.pageXOffset);
  }

  getScrollY(): Promise<number> {
    return this.webdriver.executeScript(() => window.pageYOffset);
  }

  scrollTo(x: number, y: number): Promise<void> {
    return this.webdriver.executeScript(`window.scrollTo(${x}, ${y})`);
  }

  pageHeight(): Promise<number> {
    return this.webdriver.executeScript(() => window.document.documentElement.clientHeight);
  }

  async getSelection(): Promise<Selection> {
    const obj = await this.webdriver.executeScript(`return window.getSelection();`) as any;
    return { from: obj.anchorOffset, to: obj.focusOffset };
  }

  async clearSelection(): Promise<void> {
    await this.webdriver.executeScript(`window.getSelection().removeAllRanges()`);
  }

  async switchToTop(): Promise<void> {
    await this.webdriver.switchTo().defaultContent();
  }

  async waitAndGetHints(): Promise<Hint[]> {
    await this.webdriver.wait(until.elementsLocated(By.css('.vimvixen-hint')));

    const elements = await this.webdriver.findElements(By.css(`.vimvixen-hint`));
    const hints = [];
    for (const e of elements) {
      const display = await e.getCssValue('display');
      const text = await e.getText();
      hints.push({
        displayed: display !== 'none',
        text: text,
      });
    }
    return hints;
  }

  private static async waitForConsoleLoaded(webdriver: WebDriver) {
    const topFrame = await webdriver.executeScript(() => window.top === window);
    if (!topFrame) {
      return;
    }
    await webdriver.wait(until.elementLocated(By.css('iframe.vimvixen-console-frame')));
    await new Promise(resolve => setTimeout(resolve, 100));
  }
}