Как вернуть массив динамических xpaths в typescript?

#typescript #protractor

#typescript #транспортир

Вопрос:

У меня есть набор xpaths, которым нужны аргументы для выбора правильного элемента. Однако приведенный ниже метод, похоже, не работает.

 async returnSection(sectionName: string, childItem: string): Promise<WebElement> {

        let selectedSection = element(by.xpath(`//div[@class='default-name info' and text()='${sectionName}']`));
        let aChildItem = element(by.xpath(`//div[@class='default-name' and text()='${childItem}']`));
        let customName = element(by.xpath(`//div[@class='default-name' and text()='${childItem}']/../../../..//input[@placeholder='None']`));
        let pageObjects: WebElement[] = [selectedSection, aChildItem, customName];
        // return pageObjects[] //I am not able to return this array.

    }
  

В конечном итоге я бы использовал возвращаемое значение типа:

 abc = returnSection("1","2");
element1 = abc[0];
element2 = abc[1];
  

Или есть лучший способ справиться с этой ситуацией?

Ответ №1:

// return PageObjects[] //Я не могу вернуть этот массив.

У вас есть возвращаемый тип, аннотированный как Promise<WebElement> , но вы хотите вернуть массив WebElement .

Исправить

Изменить

 async returnSection(sectionName: string, childItem: string): Promise<WebElement> {
  

Для

 async returnSection(sectionName: string, childItem: string): Promise<WebElement[]> {
  

Комментарии:

1. Спасибо за ответ. Это сработало 🙂 Но я нашел лучший способ справиться со своей ситуацией. Может быть полезно для других, кто столкнется с подобной проблемой.

Ответ №2:

Это решение работает, но при неправильной обработке будет возникать много неопределенных. Более того, при таком подходе отладка в VSCode станет намного проще.

Чтобы справиться с подобной ситуацией, подход должен быть изменен. Вместо того, чтобы возвращать массив WebElements, верните строку xpaths следующим образом.

     useBenefits(sectionName: string, childItemName: string): string[] {
        let benefitSection = `//div[@class='default-name info' and text()='${sectionName}']`;
        let childItem = `//div[@class='default-name' and text()='${childItemName}']`;
        let customText = `//div[@class='default-name' and text()='${childItem}']/../../../..//input[@placeholder='None']`;
        return new Array(benefitSection, childItem, customText);
    }
  

Теперь используйте это, вызовите эту функцию, передав параметры, и сохраните их в массиве. Используйте элементы массива в качестве xpaths для WebElement.

 
    let abc1: string[] = this.expertPIAHelper.useSectionBenefits('Achievement', "Confidence");
        let section = element(by.xpath(abc1[0]));
        let child = element(by.xpath(abc1[1]));
        let custom = element(by.xpath(abc1[2]));
        await this.helper.click(section);
        await browser.sleep(1000);
        await this.helper.enterText(custom, "Custom Name");
        await browser.sleep(1000);
        await this.helper.click(this.selectedBenefitSection);
        await browser.sleep(1000);

  

Значительно упрощает обслуживание кода и отладку.