aboutsummaryrefslogtreecommitdiff
path: root/e2e/lib/FormOptionPage.ts
blob: 666bac72799653ceeba043af9b1b496e84fea6c8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import { Lanthan } from "lanthan";
import { WebDriver, WebElement, By, error } from "selenium-webdriver";

export default class FormOptionPage {
  private webdriver: WebDriver;

  constructor(lanthan: Lanthan) {
    this.webdriver = lanthan.getWebDriver();
  }

  async setBlacklist(nth: number, url: string): Promise<void> {
    const fieldset = await this.getFieldsetByLegend("Blacklist");
    const rows = await fieldset.findElements(By.css("[role=listitem]"));
    if (rows.length <= nth) {
      throw new RangeError("Index out of range to set a blacklist");
    }

    const input = rows[nth].findElement(By.css("[aria-label=URL]"));
    await input.sendKeys(url);
    await this.blurActiveElement();
  }

  async setPartialBlacklist(
    nth: number,
    url: string,
    keys: string
  ): Promise<void> {
    const fieldset = await this.getFieldsetByLegend("Partial blacklist");
    const rows = await fieldset.findElements(By.css("[role=listitem]"));
    if (rows.length <= nth) {
      throw new RangeError("Index out of range to set a partial blacklist");
    }

    const urlInput = rows[nth].findElement(By.css("[aria-label=URL]"));
    await urlInput.sendKeys(url);
    await this.blurActiveElement();

    const keysInput = rows[nth].findElement(By.css("[aria-label=Keys]"));
    await keysInput.sendKeys(keys);
    await this.blurActiveElement();
  }

  async setSearchEngine(nth: number, name: string, url: string) {
    const fieldset = await this.getFieldsetByLegend("Search Engines");
    const rows = await fieldset.findElements(By.css("[role=listitem]"));
    if (rows.length <= nth) {
      throw new RangeError("Index out of range to set a search engine");
    }

    const nameInput = rows[nth].findElement(By.css("[aria-label=Name"));
    await nameInput.sendKeys(name);
    await this.blurActiveElement();

    const urlInput = rows[nth].findElement(By.css("[aria-label=URL]"));
    await urlInput.sendKeys(url);
    await this.blurActiveElement();
  }

  async addBlacklist(): Promise<void> {
    const fieldset = await this.getFieldsetByLegend("Blacklist");
    const rows = await fieldset.findElements(By.css("[role=listitem]"));
    const addButton = await fieldset.findElement(By.css("[aria-label=Add]"));

    await addButton.click();
    await this.webdriver.wait(async () => {
      const newRows = await fieldset.findElements(By.css("[role=listitem]"));
      return newRows.length == rows.length + 1;
    });
  }

  async addPartialBlacklist(): Promise<void> {
    const fieldset = await this.getFieldsetByLegend("Partial blacklist");
    const addButton = await fieldset.findElement(By.css("[aria-label=Add]"));
    const rows = await fieldset.findElements(By.css("[role=listitem]"));

    await addButton.click();
    await this.webdriver.wait(async () => {
      const newRows = await fieldset.findElements(By.css("[role=listitem]"));
      return newRows.length == rows.length + 1;
    });
  }

  async removeBlackList(nth: number): Promise<void> {
    const fieldset = await this.getFieldsetByLegend("Blacklist");
    const deleteButtons = await fieldset.findElements(
      By.css("[aria-label=Delete]")
    );
    if (deleteButtons.length <= nth) {
      throw new RangeError("Index out of range to remove blacklist");
    }
    await deleteButtons[nth].click();
  }

  async removePartialBlackList(nth: number): Promise<void> {
    const fieldset = await this.getFieldsetByLegend("Partial blacklist");
    const deleteButtons = await fieldset.findElements(
      By.css("[aria-label=Delete]")
    );
    if (deleteButtons.length <= nth) {
      throw new RangeError(
        `Index out of range ${deleteButtons.length} to remove partial blacklist ${nth}`
      );
    }
    await deleteButtons[nth].click();
  }

  async addSearchEngine(): Promise<void> {
    const fieldset = await this.getFieldsetByLegend("Search Engines");
    const rows = await fieldset.findElements(By.css("[role=listitem]"));
    const addButton = await fieldset.findElement(By.css("[aria-label=Add]"));

    await addButton.click();
    await this.webdriver.wait(async () => {
      const newRows = await fieldset.findElements(By.css("[role=listitem]"));
      return newRows.length == rows.length + 1;
    });
  }

  async setDefaultSearchEngine(nth: number): Promise<void> {
    const fieldset = await this.getFieldsetByLegend("Search Engines");
    const radios = await fieldset.findElements(
      By.css("[name=default][type=radio]")
    );
    if (radios.length <= nth) {
      throw new RangeError("Index out of range to set a default search engine");
    }
    await radios[nth].click();
  }

  private async getFieldsetByLegend(legendText: string): Promise<WebElement> {
    const fieldsets = await this.webdriver.findElements(By.tagName("fieldset"));
    for (const fieldset of fieldsets) {
      const legend = await fieldset.findElement(By.tagName("legend"));
      if ((await legend.getText()) === legendText) {
        return fieldset;
      }
    }
    throw new error.NoSuchElementError(
      `Unable to locate fieldset with legend: ` + legendText
    );
  }

  private async blurActiveElement(): Promise<void> {
    await this.webdriver.executeScript(`document.activeElement.blur()`);
  }
}