aboutsummaryrefslogtreecommitdiff
path: root/e2e/lib/Page.ts
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2019-09-23 16:16:51 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2019-09-23 16:16:51 +0900
commitd37896887e848818a8d6e426ad6216fa8b331d80 (patch)
treeb3f13487449d029db97f61e62ea353e0f5c5abd1 /e2e/lib/Page.ts
parentb5540dea9a08a258dc0dd19fccfcb2be47b0fc3c (diff)
Make pages as a page object
Diffstat (limited to 'e2e/lib/Page.ts')
-rw-r--r--e2e/lib/Page.ts93
1 files changed, 93 insertions, 0 deletions
diff --git a/e2e/lib/Page.ts b/e2e/lib/Page.ts
new file mode 100644
index 0000000..7a5dd7a
--- /dev/null
+++ b/e2e/lib/Page.ts
@@ -0,0 +1,93 @@
+import { WebDriver, By, until } from 'selenium-webdriver';
+import { Console } from './Console';
+
+type Hint = {
+ displayed: boolean,
+ text: string,
+};
+
+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> {
+ let 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> {
+ let 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> {
+ let 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 waitAndGetHints(): Promise<Hint[]> {
+ await this.webdriver.wait(until.elementsLocated(By.css('.vimvixen-hint')));
+
+ let elements = await this.webdriver.findElements(By.css(`.vimvixen-hint`));
+ let hints = [];
+ for (let e of elements) {
+ let display = await e.getCssValue('display');
+ let text = await e.getText();
+ hints.push({
+ displayed: display !== 'none',
+ text: text,
+ });
+ }
+ return hints;
+ }
+
+ private static async waitForConsoleLoaded(webdriver: WebDriver) {
+ let 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));
+ }
+}