aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2020-09-22 10:52:13 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2020-09-22 10:52:13 +0900
commit738a699259345e47a81cba8d14beb5b9fd2d8b53 (patch)
tree5766dfa322a0a6ef903e62a9e0b45206ee2addd3
parent1f014295a54f1e16b8bd94da729fb0afd143f7fe (diff)
Fix e2e test on option
-rw-r--r--e2e/lib/FormOptionPage.ts177
-rw-r--r--e2e/lib/JSONOptionPage.ts4
-rw-r--r--src/settings/components/form/BlacklistForm.tsx3
-rw-r--r--src/settings/components/form/PartialBlacklistForm.tsx8
-rw-r--r--src/settings/components/form/SearchForm.tsx10
5 files changed, 107 insertions, 95 deletions
diff --git a/e2e/lib/FormOptionPage.ts b/e2e/lib/FormOptionPage.ts
index 5551684..666bac7 100644
--- a/e2e/lib/FormOptionPage.ts
+++ b/e2e/lib/FormOptionPage.ts
@@ -1,5 +1,5 @@
import { Lanthan } from "lanthan";
-import { WebDriver, By, until } from "selenium-webdriver";
+import { WebDriver, WebElement, By, error } from "selenium-webdriver";
export default class FormOptionPage {
private webdriver: WebDriver;
@@ -9,15 +9,15 @@ export default class FormOptionPage {
}
async setBlacklist(nth: number, url: string): Promise<void> {
- const selector = ".form-blacklist-form-row > .column-url";
- const inputs = await this.webdriver.findElements(By.css(selector));
- if (inputs.length <= nth) {
+ 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");
}
- await inputs[nth].sendKeys(url);
- await this.webdriver.executeScript(
- `document.querySelectorAll('${selector}')[${nth}].blur()`
- );
+
+ const input = rows[nth].findElement(By.css("[aria-label=URL]"));
+ await input.sendKeys(url);
+ await this.blurActiveElement();
}
async setPartialBlacklist(
@@ -25,121 +25,122 @@ export default class FormOptionPage {
url: string,
keys: string
): Promise<void> {
- let selector = ".form-partial-blacklist-form-row > .column-url";
- let inputs = await this.webdriver.findElements(By.css(selector));
- if (inputs.length <= nth) {
+ 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");
}
- await inputs[nth].sendKeys(url);
- await this.webdriver.executeScript(
- `document.querySelectorAll('${selector}')[${nth}].blur()`
- );
- selector = ".form-partial-blacklist-form-row > .column-keys";
- inputs = await this.webdriver.findElements(By.css(selector));
- if (inputs.length <= nth) {
- throw new RangeError("Index out of range to set a partial blacklist");
- }
- await inputs[nth].sendKeys(keys);
- await this.webdriver.executeScript(
- `document.querySelectorAll('${selector}')[${nth}].blur()`
- );
+ 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) {
- let selector = ".form-search-form-row > .column-name";
- let inputs = await this.webdriver.findElements(By.css(selector));
- if (inputs.length <= nth) {
+ 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");
}
- await inputs[nth].sendKeys(name);
- await this.webdriver.executeScript(
- `document.querySelectorAll('${selector}')[${nth}].blur()`
- );
- selector = ".form-search-form-row > .column-url";
- inputs = await this.webdriver.findElements(By.css(selector));
- if (inputs.length <= nth) {
- throw new RangeError("Index out of range to set a search engine");
- }
- await inputs[nth].sendKeys(url);
- await this.webdriver.executeScript(
- `document.querySelectorAll('${selector}')[${nth}].blur()`
- );
+ 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 rows = await this.webdriver.findElements(
- By.css(`.form-blacklist-form-row`)
- );
- const button = await this.webdriver.findElement(
- By.css(".form-blacklist-form .ui-add-button")
- );
- await button.click();
- await this.webdriver.wait(
- until.elementLocated(
- By.css(`.form-blacklist-form-row:nth-child(${rows.length + 1})`)
- )
- );
+ 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 rows = await this.webdriver.findElements(
- By.css(`.form-partial-blacklist-form-row`)
- );
- const button = await this.webdriver.findElement(
- By.css(".form-partial-blacklist-form .ui-add-button")
- );
- await button.click();
- await this.webdriver.wait(
- until.elementLocated(
- By.css(`.form-partial-blacklist-form-row:nth-child(${rows.length + 2})`)
- )
- );
+ 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 buttons = await this.webdriver.findElements(
- By.css(".form-blacklist-form-row .ui-delete-button")
+ const fieldset = await this.getFieldsetByLegend("Blacklist");
+ const deleteButtons = await fieldset.findElements(
+ By.css("[aria-label=Delete]")
);
- if (buttons.length <= nth) {
+ if (deleteButtons.length <= nth) {
throw new RangeError("Index out of range to remove blacklist");
}
- await buttons[nth].click();
+ await deleteButtons[nth].click();
}
async removePartialBlackList(nth: number): Promise<void> {
- const buttons = await this.webdriver.findElements(
- By.css(".form-partial-blacklist-form-row .ui-delete-button")
- );
- if (buttons.length <= nth) {
- throw new RangeError("Index out of range to remove partial blacklist");
+ 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 buttons[nth].click();
+ await deleteButtons[nth].click();
}
async addSearchEngine(): Promise<void> {
- const rows = await this.webdriver.findElements(
- By.css(`.form-search-form-row > .column-name`)
- );
- const button = await this.webdriver.findElement(
- By.css(".form-search-form > .ui-add-button")
- );
- await button.click();
- await this.webdriver.wait(
- until.elementLocated(
- By.css(`.form-search-form-row:nth-child(${rows.length + 1})`)
- )
- );
+ 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 radios = await this.webdriver.findElements(
- By.css(".form-search-form-row input[type=radio]")
+ 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()`);
+ }
}
diff --git a/e2e/lib/JSONOptionPage.ts b/e2e/lib/JSONOptionPage.ts
index 0f2b0a7..2d8147e 100644
--- a/e2e/lib/JSONOptionPage.ts
+++ b/e2e/lib/JSONOptionPage.ts
@@ -20,9 +20,7 @@ export default class JSONOptionPage {
}
async getErrorMessage(): Promise<string> {
- const error = await this.webdriver.findElement(
- By.css(".settings-ui-input-error")
- );
+ const error = await this.webdriver.findElement(By.css("p[role=alert]"));
return error.getText();
}
}
diff --git a/src/settings/components/form/BlacklistForm.tsx b/src/settings/components/form/BlacklistForm.tsx
index d301f2c..6fb9eca 100644
--- a/src/settings/components/form/BlacklistForm.tsx
+++ b/src/settings/components/form/BlacklistForm.tsx
@@ -52,6 +52,7 @@ class BlacklistForm extends React.Component<Props> {
data-index={index}
type="text"
name="url"
+ aria-label="URL"
value={item.pattern}
placeholder="example.com/mail/*"
onChange={this.bindValue.bind(this)}
@@ -64,6 +65,7 @@ class BlacklistForm extends React.Component<Props> {
name="delete"
onClick={this.bindValue.bind(this)}
onBlur={this.props.onBlur}
+ aria-label="Delete"
/>
</GridCell>
</GridRow>
@@ -72,6 +74,7 @@ class BlacklistForm extends React.Component<Props> {
</Grid>
<AddButton
name="add"
+ aria-label="Add"
style={{ float: "right" }}
onClick={this.bindValue.bind(this)}
/>
diff --git a/src/settings/components/form/PartialBlacklistForm.tsx b/src/settings/components/form/PartialBlacklistForm.tsx
index dcdd00c..b2da2bb 100644
--- a/src/settings/components/form/PartialBlacklistForm.tsx
+++ b/src/settings/components/form/PartialBlacklistForm.tsx
@@ -52,7 +52,7 @@ class PartialBlacklistForm extends React.Component<Props> {
render() {
return (
<>
- <Grid>
+ <Grid role="list">
<GridHeader>
<GridCell>URL</GridCell>
<GridCell>Keys</GridCell>
@@ -62,12 +62,13 @@ class PartialBlacklistForm extends React.Component<Props> {
return null;
}
return (
- <GridRow key={index}>
+ <GridRow key={index} role="listitem">
<GridCell>
<Input
data-index={index}
type="text"
name="url"
+ aria-label="URL"
value={item.pattern}
placeholder="example.com/mail/*"
onChange={this.bindValue.bind(this)}
@@ -79,6 +80,7 @@ class PartialBlacklistForm extends React.Component<Props> {
data-index={index}
type="text"
name="keys"
+ aria-label="Keys"
value={item.keys.join(",")}
placeholder="j,k,<C-d>,<C-u>"
onChange={this.bindValue.bind(this)}
@@ -89,6 +91,7 @@ class PartialBlacklistForm extends React.Component<Props> {
<DeleteButton
data-index={index}
name="delete"
+ aria-label="Delete"
onClick={this.bindValue.bind(this)}
onBlur={this.props.onBlur}
/>
@@ -99,6 +102,7 @@ class PartialBlacklistForm extends React.Component<Props> {
</Grid>
<AddButton
name="add"
+ aria-label="Add"
style={{ float: "right" }}
onClick={this.bindValue.bind(this)}
/>
diff --git a/src/settings/components/form/SearchForm.tsx b/src/settings/components/form/SearchForm.tsx
index cc7061a..4bf0e02 100644
--- a/src/settings/components/form/SearchForm.tsx
+++ b/src/settings/components/form/SearchForm.tsx
@@ -54,7 +54,7 @@ class SearchForm extends React.Component<Props> {
const value = this.props.value.toJSON();
return (
<>
- <Grid>
+ <Grid role="list">
<GridHeader>
<GridCell>Name</GridCell>
<GridCell>URL</GridCell>
@@ -62,12 +62,13 @@ class SearchForm extends React.Component<Props> {
</GridHeader>
{value.engines.map((engine, index) => {
return (
- <GridRow key={index}>
+ <GridRow key={index} role="listitem">
<GridCell>
<Input
data-index={index}
type="text"
name="name"
+ aria-label="Name"
value={engine[0]}
onChange={this.bindValue.bind(this)}
onBlur={this.props.onBlur}
@@ -78,6 +79,7 @@ class SearchForm extends React.Component<Props> {
data-index={index}
type="text"
name="url"
+ aria-label="URL"
placeholder="http://example.com/?q={}"
value={engine[1]}
onChange={this.bindValue.bind(this)}
@@ -89,11 +91,14 @@ class SearchForm extends React.Component<Props> {
data-index={index}
type="radio"
name="default"
+ aria-label="Default"
checked={value.default === engine[0]}
onChange={this.bindValue.bind(this)}
/>
+ a
<DeleteButton
data-index={index}
+ aria-label="Delete"
name="delete"
onClick={this.bindValue.bind(this)}
/>
@@ -104,6 +109,7 @@ class SearchForm extends React.Component<Props> {
</Grid>
<AddButton
name="add"
+ aria-label="Add"
style={{ float: "right" }}
onClick={this.bindValue.bind(this)}
/>