@redhat-developer/page-objects
Version:
Page Object API implementation for a VS Code editor used by ExTester framework.
133 lines • 6.11 kB
JavaScript
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License", destination); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExtensionsViewSection = void 0;
const ViewSection_1 = require("../ViewSection");
const ExtensionsViewItem_1 = require("./ExtensionsViewItem");
const selenium_webdriver_1 = require("selenium-webdriver");
/**
* Categories of extensions to search for
*/
var ExtensionCategory;
(function (ExtensionCategory) {
ExtensionCategory["Installed"] = "@installed";
ExtensionCategory["Enabled"] = "@enabled";
ExtensionCategory["Disabled"] = "@disabled";
ExtensionCategory["Outdated"] = "@outdated";
ExtensionCategory["Recommended"] = "@recommended";
})(ExtensionCategory || (ExtensionCategory = {}));
/**
* View section containing extensions
*/
class ExtensionsViewSection extends ViewSection_1.ViewSection {
async getVisibleItems() {
const extensionTable = await this.findElement(ExtensionsViewSection.locators.ExtensionsViewSection.items);
const extensionRows = await extensionTable.findElements(ExtensionsViewSection.locators.ExtensionsViewSection.itemRow);
return await Promise.all(extensionRows.map(async (row) => new ExtensionsViewItem_1.ExtensionsViewItem(row, this).wait()));
}
/**
* Search for an extension by title. This utilizes the search bar
* in the Extensions view, which switches the perspective to the
* section representing the chosen category and temporarily hides all other sections.
* If you wish to continue working with the initial view section
* (i.e. Enabled), use the clearSearch method to reset it back to default
*
* @param title title to search for in '@category name' format,
* e.g '@installed extension'. If no @category is present, marketplace will be searched
*
* @returns Promise resolving to ExtensionsViewItem if such item exists, undefined otherwise
*/
async findItem(title) {
await this.clearSearch();
const progress = await this.enclosingItem.findElement(ExtensionsViewSection.locators.ViewContent.progress);
const searchField = await this.enclosingItem.findElement(ExtensionsViewSection.locators.ExtensionsViewSection.searchBox);
await searchField.sendKeys(title);
try {
await this.getDriver().wait(selenium_webdriver_1.until.elementIsVisible(progress), 1000);
}
catch (err) {
if (err.name !== 'TimeoutError') {
throw err;
}
}
await this.getDriver().wait(selenium_webdriver_1.until.elementIsNotVisible(progress));
const parent = this.enclosingItem;
const sectionTitle = this.getSectionForCategory(title);
const section = (await parent.getSection(sectionTitle));
const titleParts = title.split(' ');
if (titleParts[0].startsWith('@')) {
title = titleParts.slice(1).join(' ');
}
const extensions = await section.getVisibleItems();
for (const extension of extensions) {
if ((await extension.getTitle()) === title) {
return extension;
}
}
return undefined;
}
/**
* Clears the search bar on top of the view
* @returns Promise resolving when the search box is cleared
*/
async clearSearch() {
const progress = await this.enclosingItem.findElement(ExtensionsViewSection.locators.ViewContent.progress);
const searchField = await this.enclosingItem.findElement(ExtensionsViewSection.locators.ExtensionsViewSection.searchBox);
const textField = await this.enclosingItem.findElement(ExtensionsViewSection.locators.ExtensionsViewSection.textContainer);
try {
await textField.findElement(ExtensionsViewSection.locators.ExtensionsViewSection.textField);
await searchField.sendKeys(selenium_webdriver_1.Key.chord(ExtensionsViewItem_1.ExtensionsViewItem.ctlKey, 'a'), selenium_webdriver_1.Key.BACK_SPACE);
await this.getDriver().wait(selenium_webdriver_1.until.elementIsVisible(progress));
await this.getDriver().wait(selenium_webdriver_1.until.elementIsNotVisible(progress));
}
catch (err) {
// do nothing, the text field is empty
}
}
/**
* Find and open an extension item
* @param title title of the extension
* @returns Promise resolving when the item is clicked
*/
async openItem(title) {
const item = await this.findItem(title);
if (item) {
await item.click();
}
return [];
}
getSectionForCategory(title) {
const category = title.split(' ')[0].toLowerCase();
switch (category) {
case ExtensionCategory.Disabled:
return 'Disabled';
case ExtensionCategory.Enabled:
return 'Enabled';
case ExtensionCategory.Installed:
return 'Installed';
case ExtensionCategory.Outdated:
return 'Outdated';
case ExtensionCategory.Recommended:
return 'Other Recommendations';
default:
return 'Marketplace';
}
}
}
exports.ExtensionsViewSection = ExtensionsViewSection;
//# sourceMappingURL=ExtensionsViewSection.js.map
;