Перейти к содержимому

Фотография

Selenium2 и Теги


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 19

#1 testbom

testbom

    Новый участник

  • Members
  • Pip
  • 28 сообщений

Отправлено 10 октября 2012 - 14:19

Добрый день. Очень интересно узнать можно ли при помощи Selenium WebDriver подсчитать
количество определенных тегов? К примеру, количество открытых/закрытых div.
И как это можно реализовать.
За ранее всем огромное спасибо.
  • 0

#2 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 10 октября 2012 - 14:51

Нельзя. WebDriver работает не с исходным кодом страницы, а с DOM. А в DOM "все теги закрыты" :)
  • 1
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#3 testbom

testbom

    Новый участник

  • Members
  • Pip
  • 28 сообщений

Отправлено 10 октября 2012 - 14:57

А может есть какие-нибудь альтернативы?
  • 0

#4 _Yura

_Yura

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:n/a

Отправлено 10 октября 2012 - 15:19

Решение "в лоб" - забрать innerHTML у <BODY> и работать с ним.
  • 1

#5 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 10 октября 2012 - 15:32

Формально можно с помощью банального:
Driver.FindElements(By.TagName("div").Count;
Только все ли из них будут закрыты? Не факт.

Еще можно получить PageSource и как-то парсить его, но не думаю, что это рационально...
  • 1

#6 testbom

testbom

    Новый участник

  • Members
  • Pip
  • 28 сообщений

Отправлено 11 октября 2012 - 07:45

Попробывал, по совеу Snap обратиться к банальщине, получилось вот что
driver.findElements(By.tagName("div")).size()

Да, данный метод возвращает колчество "открытых" div , но как быть с закрытыми?
  • 0

#7 snark

snark

    Новый участник

  • Members
  • Pip
  • 62 сообщений

Отправлено 11 октября 2012 - 10:20

Да, данный метод возвращает колчество "открытых" div , но как быть с закрытыми?


Он возвращает не "колчество открытых div", а количество элементов "div" v dom-e.
Если у вас валидный документ, то количество открывающих тегов должно ровняться количеству закрывающих. Если документ не валидный - возможны разные ситуации. Для чего вам это вообще нужно? Может вы стоит взять не селениум, а какой-нибудь HTML-Валидатор?
  • 0

#8 testbom

testbom

    Новый участник

  • Members
  • Pip
  • 28 сообщений

Отправлено 11 октября 2012 - 10:34

Для чего вам это вообще нужно?

Просто объеденяю несколько тестов в одну проверку. И связываю их с jenkins(иду к запуску по плану, с полным отчетом).
А запуск валидатора это уже шаг в сторону. Валидатором проверять логично, но хотелось бы упорядоченности и запуска тестирования в одном процессе.
  • 0

#9 snark

snark

    Новый участник

  • Members
  • Pip
  • 62 сообщений

Отправлено 11 октября 2012 - 11:01

Просто подозреваю что вам все-таки не количество тегов, надо считать, а количество элементов на странице. В обычных селениум-тестах это так. Так что вам вполне подойдет "банальный" метод.
  • 0

#10 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 11 октября 2012 - 11:13

хорошо, а в чём проблема искать <div и </div>. Если их количество совпадает - круто, если нет - плохо
  • 0

#11 testbom

testbom

    Новый участник

  • Members
  • Pip
  • 28 сообщений

Отправлено 11 октября 2012 - 11:21

Просто подозреваю что вам все-таки не количество тегов, надо считать, а количество элементов на странице. В обычных селениум-тестах это так. Так что вам вполне подойдет "банальный" метод.

Нет,наверно все таки тегов, так как при лишнем div'e все элементы на странице сохраняются,
но при этом верстка страницы расползается полностью.
Пробовал связать это как то с элементами, но единственное что связывает все "поехавшие" страницы -
это меню которое уезжает за видимую область страницы, видимое только при сильном уменьшении масштаба.
  • 0

#12 testbom

testbom

    Новый участник

  • Members
  • Pip
  • 28 сообщений

Отправлено 11 октября 2012 - 11:23

хорошо, а в чём проблема искать <div и </div>. Если их количество совпадает - круто, если нет - плохо

Проблема в том, что при поиске "/div" webdriver долго думает, а после возвращает "0"
  • 0

#13 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 11 октября 2012 - 13:19

ы, так он и не вернёт ничего. Вам Алексей сказал, что ВебДрайвер ищет не в тегах, а в ДОМ, поэтому он не совсем подходит. Вы можете ВебДрайвером скопировать код странички и потом средствами языка анализировать его как я написал выше. У вас , кримеру, будет 2 масива с открытыми и закрытыми тегами. Сравниваете количество их элементов и всё
  • 0

#14 testbom

testbom

    Новый участник

  • Members
  • Pip
  • 28 сообщений

Отправлено 12 октября 2012 - 05:44

Вы можете ВебДрайвером скопировать код странички и потом средствами языка анализировать его как я написал выше.

Хорошо.Тогда не подскажите какой способ наименее затратный по времени? getpagesource()?(Но он по-моему тоже
что-то не то возвращает).А каждый раз сохранять при помощи "ctrl+s" как то не вариант.
  • 0

#15 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 12 октября 2012 - 06:59

Решение "в лоб" - забрать innerHTML у <BODY> и работать с ним.

хотя, мне кажется, что проже ПейджСорс
  • 0

#16 testbom

testbom

    Новый участник

  • Members
  • Pip
  • 28 сообщений

Отправлено 18 октября 2012 - 07:44

Попробывал реализовать вот так:


public void TestCase() throws Exception {
int i,div=0,nodiv=0;
driver.get(url);
String html = driver.getPageSource();
driver.quit();
int number = html.length();
for(i=0; i <=number-1 ; i++)
{
  if ( html.charAt(i)=='<') 
  {
    if (html.charAt(i+1)=='d')
    {
      if (html.charAt(i+2)=='i')
      {
	if (html.charAt(i+3)=='v')
	{
	 div++;
	}
      }
    }
  }
  else
  {
    if ( html.charAt(i)==' ') 
    {
      if (html.charAt(i+1)=='d')
      {
        if (html.charAt(i+2)=='i')
        {
	  if (html.charAt(i+3)=='v')
	  {
	    if (html.charAt(i+4)==' ')
	    {
	      div++;
	    }
	    else
	    {
	      if (html.charAt(i+4)=='>')
	      {
	        div++;
	      }
	    }
   	  }
	}
      }
    }  
    else
    {
      if (html.charAt(i)=='/')
      {
        if (html.charAt(i+1)=='d')
	{
	  if (html.charAt(i+2)=='i')
	  {
	    if (html.charAt(i+3)=='v')
	    {
	      nodiv++;
	    }
	  }
	}
      }
    }
  }
}
JOptionPane.showMessageDialog(null,"<div>="+div+'\n'+"</div>="+nodiv);

Но все равно закрытых div'ов постоянно находит столько же сколько и открытых.(хотя открытых div больше чем закрытых)
Подскажите , что не так?
  • 0

#17 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 18 октября 2012 - 08:05

Ещё раз: WebDriver работает не с исходным кодом страницы, а с DOM.
Команда getPageSource возвращает не исходный код страницы, полученный браузером от веб-сервера, а "дамп текущего состояния дерева DOM". Поэтому там все теги закрыты, это уже не исходный код, а поправленный и проинтерпретированный браузером.
Поэтому если потребовался "настоящий исходный код" -- берите, действительно, innerHTML из body и делайте с ним что хотите.
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#18 _Yura

_Yura

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:n/a

Отправлено 18 октября 2012 - 11:57

Поэтому если потребовался "настоящий исходный код" -- берите, действительно, innerHTML из body и делайте с ним что хотите.

Самое смешное, что и в этом случае возвращает одинаковое кол-во, хотя закрытых больше.

Мой код:
<html><head>
<script>
function countDivs() {
  var i=0;
  var position=0;
  var innerhtml=document.body.innerHTML;
  while(true) {
    position=innerhtml.indexOf("<div",position); //потом меняем на </div>
    if(position>=0) {
      i++;
      position++;
    } else break;
  }
  alert(i);
}
</script></head>

<body>
<div id=1></div>
<div>
  <div>
    <div id=2></div>
  </div>
  <div></div>
</div>
</div></div>
<button onclick="countDivs()">Count</button>
</body></html>

UP: innerhtml не возвращает лишние закрывающие теги в FF :(
  • 1

#19 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 872 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 18 октября 2012 - 12:32

UP: innerhtml не возвращает лишние закрывающие теги в FF :(

Ну вот видите -- даже на этом этапе браузер уже корректирует ошибки разработчиков, как умеет.
Поэтому бросьте селениум и настоящие браузеры, возьмите что-нибудь попроще, HtmlUnit, например.
Или перехватывайте трафик прокси-сервером и анализируйте то, что наперехватывали.
  • 1
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#20 testbom

testbom

    Новый участник

  • Members
  • Pip
  • 28 сообщений

Отправлено 23 октября 2012 - 09:43

Хорошо. Буду пробовать другие варианты. Всем огромное спасибо за ответы и советы.
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных