Есть ли способ, которым я могу получить все идентификаторы HTML-элементов внутри с помощью Selenium / Web Driver?

#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 :

https://github.com/angular/protractor/blob/36e0e0aaf090b0c9b5450fa59ba2da4c4237442a/spec/basic/elements_spec.js#L177