UNPKG

@redhat-developer/page-objects

Version:

Page Object API implementation for a VS Code editor used by ExTester framework.

133 lines 6.11 kB
"use strict"; /** * 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