#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);
Значительно упрощает обслуживание кода и отладку.