#angularjs #selenium #xpath #protractor
#angularjs #selenium #xpath #транспортир
Вопрос:
Я использую Protractor для тестирования, и мой тестовый код имеет код, подобный этому:
var topic = this;
topic.topicName = element(by.id('topicName'));
topic.topicVersion = element(by.id('topicVersion'));
.....
.....
topic.description = element(by.id('description'));
topic.topicHeader = element(by.id('topicHeader'));
topic.topicFooter = element(by.id('topicFooter'));
Мне было предложено упростить это кодирование, используя forEach с помощью этой функции.
['topicName', 'topicVersion', ...].forEach(function(k){
topic[k] = element(by.id(k));
});
Это выглядит намного чище, но мне интересно, смогу ли я автоматизировать это еще больше, чтобы каким-то образом у меня был код, который собирает все идентификаторы внутри следующего <div id="adminTopicPage">
.
Используя xpath или что-то подобное, могу ли я автоматизировать сбор идентификаторов внутри этого <div>
и назначить все элементы с идентификаторами в качестве свойств объекту?
Ответ №1:
Да, вы можете. У меня не так много знаний о javascript, но я предлагаю подход, как показано ниже
1 — Вы можете получить все элементы из вашего divelement
E.g.:
topic.divAdminTopicPage = element(by.id('adminTopicPage'));
topic.divAdminTopicPageChild1 = topic.divAdminTopicPage.findElement(By.locator);
2 — Затем вы могли бы извлечь их в объект как ключ => значение
Надеюсь, это могло бы вам помочь.
Ответ №2:
Я не тестировал это, но я бы рекомендовал вам попробовать что-то вроде этого:
$$('#someElement [id]').map(function(elm) {
return {
id: elm.getAttribute('id')
}
}).then(function(ids){
expect(ids).toEqual([
{id: 'foo'},
{id: 'bar'}
]);
});
Взгляните на этот пример. Это модульный тест, который я написал при реализации map
: