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

Фотография

Проверка наличия у элемента определенного свойства


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

#1 Alena*

Alena*

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Алена Бартош
  • Город:Винница

Отправлено 07 июля 2012 - 08:18

​Есть таблица со списком элементов.
<td class="invalid">2</td>
<td class="invalid">3</td>
<td class="invalid">4</td>
<td class="invalid">5</td>
<td class="invalid">6</td>
<td class="valid today" title="Суб Июл 7th 2012">7</td>
<td class="valid" title="Вос Июл 8th 2012">8</td>
Элементы могут иметь свойства class="invalid", class="valid today" или class="valid".
Подскажите, пожалуйста, как можно проверить, что элемент 7 имеет свойство class="valid today".
  • 0

#2 velazkes

velazkes

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

  • Members
  • Pip
  • 34 сообщений
  • ФИО:Малявко Виктор
  • Город:Минск

Отправлено 07 июля 2012 - 09:29

​Есть таблица со списком элементов.
<td class="invalid">2</td>
<td class="invalid">3</td>
<td class="invalid">4</td>
<td class="invalid">5</td>
<td class="invalid">6</td>
<td class="valid today" title="Суб Июл 7th 2012">7</td>
<td class="valid" title="Вос Июл 8th 2012">8</td>
Элементы могут иметь свойства class="invalid", class="valid today" или class="valid".
Подскажите, пожалуйста, как можно проверить, что элемент 7 имеет свойство class="valid today".


Доброго времени суток. Вот такую штуку попробовал набросать. Код на языке java.


public boolean isTrue()
  {
      WebDriver driver = new FirefoxDriver(); // в данном примере заюзан ферфокс. соответственно можно написать все, что вам вздумается (в разумных пределах :))
      String atr;
      atr = driver.findElement(By.xpath("//td[7]")).getAttribute("class"); //локатор td[7] необходимо еще привязать к кому-нить корневому элементу, иначе данная функция будет искать все и брать первый попавшийся "седьмой" td
      if(atr == "valid today")
          return true;
      else 
          return false;

  }

  • 2

#3 Breetonia

Breetonia

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Рымаров Владислав

Отправлено 08 июля 2012 - 18:54

Подскажите, пожалуйста, как можно проверить, что элемент 7 имеет свойство class="valid today".

Элементарно:
assertTrue(driver.findElement(By.xpath("//td[@class='valid today']")));

  • 1

#4 Breetonia

Breetonia

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Рымаров Владислав

Отправлено 08 июля 2012 - 18:59

public boolean isTrue()
  {
      WebDriver driver = new FirefoxDriver(); // в данном примере заюзан ферфокс. соответственно можно написать все, что вам вздумается (в разумных пределах :))
      String atr;
      atr = driver.findElement(By.xpath("//td[7]")).getAttribute("class"); //локатор td[7] необходимо еще привязать к кому-нить корневому элементу, иначе данная функция будет искать все и брать первый попавшийся "седьмой" td
      if(atr == "valid today")
          return true;
      else 
          return false;

  }

Надеюсь,это не рабочий пример,иначе этих твоих isTrue в проекте будет миллион )
И зачем драйвер-то стартовать,когда можно ссылку на него передать ?
Не будешь же ты в каждой функции вызывать фаирфокс,а если и будешь,то придется закрывать каждый раз,а это лишнее время и ресы.

public boolean isTrue(WebDriver driver)

  • 1

#5 velazkes

velazkes

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

  • Members
  • Pip
  • 34 сообщений
  • ФИО:Малявко Виктор
  • Город:Минск

Отправлено 09 июля 2012 - 08:40

public boolean isTrue()
  {
      WebDriver driver = new FirefoxDriver(); // в данном примере заюзан ферфокс. соответственно можно написать все, что вам вздумается (в разумных пределах :))
      String atr;
      atr = driver.findElement(By.xpath("//td[7]")).getAttribute("class"); //локатор td[7] необходимо еще привязать к кому-нить корневому элементу, иначе данная функция будет искать все и брать первый попавшийся "седьмой" td
      if(atr == "valid today")
          return true;
      else 
          return false;

  }

Надеюсь,это не рабочий пример,иначе этих твоих isTrue в проекте будет миллион )
И зачем драйвер-то стартовать,когда можно ссылку на него передать ?
Не будешь же ты в каждой функции вызывать фаирфокс,а если и будешь,то придется закрывать каждый раз,а это лишнее время и ресы.

public boolean isTrue(WebDriver driver)


я и не сказал, что код бери и вставляй - и будет счастье. в комменте написано, что где дописать под себя. а драйвер объявлен для наглядности. по-моему это было очевидно! что же касается вот такой проверки "assertTrue(driver.findElement(By.xpath("//td[@class='valid today']")));" как Вы написали, то это будет не совсем верно, ибо это просто будет находится тдшник с конкретным артриббутом и далеко не факт, что этот тдшник будет седьмым! Если например код страницы был бы :
<td class="valid today">2</td>
<td class="valid today">3</td>
<td class="valid today">4</td>
<td class="valid today">5</td>
<td class="valid today">6</td>
<td class="valid today" title="Суб Июл 7th 2012">7</td>
<td class="valid today" title="Вос Июл 8th 2012">8</td>
то в этом случае ваш пример абсолютно бесполезен увы. и я больше чем уверен, что раз от раза атрибут класс будет принимать значение valid today и будут возникать подобные ситуации. имхо все.
  • 0

#6 kenek

kenek

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

  • Members
  • Pip
  • 1 сообщений
  • ФИО:Кравцов Евгений
  • Город:Воронеж

Отправлено 16 февраля 2016 - 14:50

 

​Есть таблица со списком элементов.
<td class="invalid">2</td>
<td class="invalid">3</td>
<td class="invalid">4</td>
<td class="invalid">5</td>
<td class="invalid">6</td>
<td class="valid today" title="Суб Июл 7th 2012">7</td>
<td class="valid" title="Вос Июл 8th 2012">8</td>
Элементы могут иметь свойства class="invalid", class="valid today" или class="valid".
Подскажите, пожалуйста, как можно проверить, что элемент 7 имеет свойство class="valid today".


Доброго времени суток. Вот такую штуку попробовал набросать. Код на языке java.


public boolean isTrue()
  {
      WebDriver driver = new FirefoxDriver(); // в данном примере заюзан ферфокс. соответственно можно написать все, что вам вздумается (в разумных пределах :))
      String atr;
      atr = driver.findElement(By.xpath("//td[7]")).getAttribute("class"); //локатор td[7] необходимо еще привязать к кому-нить корневому элементу, иначе данная функция будет искать все и брать первый попавшийся "седьмой" td
      if(atr == "valid today")
          return true;
      else 
          return false;

  }

Спасибо. Рабочий вариант


  • 0

#7 TatyanaV

TatyanaV

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

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 17 февраля 2016 - 07:09

Слишком много лишнего, на мой взгляд.

public boolean isTrue()
  {
      return driver.findElements(By.xpath("//td[7][@class='valid today']")).size() > 0;
  }

Про драйвер - сами решите, как Вам удобнее его передавать/инициализировать, для сути вопроса не принципиально.

Ну и локатор вплоть до "//td[7]" (включительно) лучше сделать более конкретным в рамках страницы.


  • 0

#8 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 17 февраля 2016 - 09:41

Слишком много лишнего, на мой взгляд.

public boolean isTrue()
  {
      return driver.findElements(By.xpath("//td[7][@class='valid today']")).size() > 0;
  }

Про драйвер - сами решите, как Вам удобнее его передавать/инициализировать, для сути вопроса не принципиально.

Ну и локатор вплоть до "//td[7]" (включительно) лучше сделать более конкретным в рамках страницы.

Можно обойтись по идее всего лишь

driver.findElements(By.xpath("//td[7][@class='valid today']"))

  • 0

#9 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 17 февраля 2016 - 10:52

driver.findElement(By.xpath("//td[7][@class='valid today']"))

  • 0

#10 TatyanaV

TatyanaV

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

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 18 февраля 2016 - 06:43

 

Слишком много лишнего, на мой взгляд.

public boolean isTrue()
  {
      return driver.findElements(By.xpath("//td[7][@class='valid today']")).size() > 0;
  }

Про драйвер - сами решите, как Вам удобнее его передавать/инициализировать, для сути вопроса не принципиально.

Ну и локатор вплоть до "//td[7]" (включительно) лучше сделать более конкретным в рамках страницы.

Можно обойтись по идее всего лишь

driver.findElements(By.xpath("//td[7][@class='valid today']"))

У автора изначально требовалось вернуть boolean, findElements возвращает массив элементов, которые он нашел по заданному локатору. Поэтому, чтобы вернуть требуемый boolean - возвращается size() > 0 (т.е. нашлись ли какие-нибудь элементы с этим локатором или нет).

 

А findElement (если элемента на форме нет) будет сначала долго и безуспешно ждать его появления (в соответствии с заданным таймаутом), а потом может ещё и упасть с эксепшеном (в зависимости от того, что дальше будет с этим элементом делаться).

findElements же - поищет по локатору, нашлось что-то - супер, добавит в массив, не нашлось - ну и ладно. Массив в любом случае будет, даже если он будет пустой, size() никаких ошибок не выдаст и гарантированно отработает. Да и быстрее это будет.


  • 0

#11 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 18 февраля 2016 - 07:05

У автора изначально требовалось вернуть boolean, findElements возвращает массив элементов, которые он нашел по заданному локатору. Поэтому, чтобы вернуть требуемый boolean - возвращается size() > 0 (т.е. нашлись ли какие-нибудь элементы с этим локатором или нет).

driver.findElement(By.xpath("//td[7][@class='valid today']"))

А findElement (если элемента на форме нет) будет сначала долго и безуспешно ждать его появления (в соответствии с заданным таймаутом), а потом может ещё и упасть с эксепшеном (в зависимости от того, что дальше будет с этим элементом делаться).

findElements же - поищет по локатору, нашлось что-то - супер, добавит в массив, не нашлось - ну и ладно. Массив в любом случае будет, даже если он будет пустой, size() никаких ошибок не выдаст и гарантированно отработает. Да и быстрее это будет.

 

хм, не вижу где автору требуется вернуть булево значение

да и тест свалится, если не найдет элемент , а не поскочит дальше, хотя по факту уже он отклоняется от сценария, например.

Время таймаута можно задать самому насколько я помню.


  • 0

#12 TatyanaV

TatyanaV

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

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 18 февраля 2016 - 07:16

 

У автора изначально требовалось вернуть boolean, findElements возвращает массив элементов, которые он нашел по заданному локатору. Поэтому, чтобы вернуть требуемый boolean - возвращается size() > 0 (т.е. нашлись ли какие-нибудь элементы с этим локатором или нет).

driver.findElements(By.xpath("//td[7][@class='valid today']"))

А findElement (если элемента на форме нет) будет сначала долго и безуспешно ждать его появления (в соответствии с заданным таймаутом), а потом может ещё и упасть с эксепшеном (в зависимости от того, что дальше будет с этим элементом делаться).

findElements же - поищет по локатору, нашлось что-то - супер, добавит в массив, не нашлось - ну и ладно. Массив в любом случае будет, даже если он будет пустой, size() никаких ошибок не выдаст и гарантированно отработает. Да и быстрее это будет.

 

хм, не вижу где автору требуется вернуть булево значение

да и тест свалится, если не найдет элемент , а не поскочит дальше, хотя по факту уже он отклоняется от сценария, например.

Время таймаута можно задать самому насколько я помню.

 

 

Изначально поставленная задача "проверить, что элемент 7 имеет свойство class="valid today"".

Как эту задачу решает полученный в результате "проверки" через findElement объект типа WebElement, и уж тем более - как её решает полученное при отсутствии элемента исключение? Вариант "есть элемент, значит свойство есть, эксепшн - значит свойства нет" - означает, что предложенный вариант с findElement не окончательный, т.к. требует дальнейшей обработки.

 

Свалится тест или нет - не факт. В конце концов, у него может быть логика какая-то в зависимости от того, есть нужное свойство у элемента или нет. Или он может просто по softAssert'у проверить и дальше по тесту пойти, чему может помешать экспешн. 

 

Да, время таймаута можно задать. Но если элемента такого нет - это гарантированная пауза в тесте, заканчивающаяся эксепшеном. Зачем она нужна?

 

Не проще ли сделать гарантированно работающий малюсенький метод с boolean, вместо того, чтобы настраивать и ждать таймауты, прописывать обработку исключений и т.п.? 


  • 0

#13 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 18 февраля 2016 - 07:17

Время таймаута можно задать. Но если элемента такого нет - это гарантированная пауза в тесте, заканчивающаяся эксепшеном. Зачем она нужна?

 

 

Не проще ли сделать гарантированно работающий малюсенький метод с boolean, вместо того, чтобы настраивать и ждать таймауты, прописывать обработку исключений и т.п.? 

 

ок Татьяна это ваше мнения я останусь при своем мнении, если позволите.

def waitForElementPresent(self,xpath,timer=10):
		drv=self.DRV
		WebDriverWait(drv,timer).until(EC.presence_of_element_located((By.XPATH,xpath)))

  • 0

#14 TatyanaV

TatyanaV

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

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 18 февраля 2016 - 07:23

Аналогично. Трата 10 сек на ожидание отсутствующего элемента (с учетом изначального задания естественно, иногда подобные ожидания нужны) - так и осталось для меня бессмысленной и непонятной.


  • 0

#15 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 18 февраля 2016 - 07:24

Аналогично. Трата 10 сек на ожидание отсутствующего элемента (с учетом изначального задания естественно, иногда подобные ожидания нужны) - так и осталось для меня бессмысленной и непонятной.

это пример функции в которой значение таймаута можно задать самому , если хочется.... но по умолчанию будет = 10. ок


  • 0

#16 TatyanaV

TatyanaV

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

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 18 февраля 2016 - 07:27

Даже если поставить 500 милисекунд - это в любом случае гарантированная ненужная в данном примере пауза (при отсутствующем элементе).

Подобные паузы (любой продолжительности) нужны, когда элемент нужно дождаться (например, если ему нужно некоторое время для загрузки), чтобы быть уверенным, что с ним можно дальше работать, но если нужно просто ПРОВЕРИТЬ, есть ли в наличии элемент с определенным свойством - они не имеют смысла. imho


  • 0

#17 TatyanaV

TatyanaV

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

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 18 февраля 2016 - 07:29

В любом случае - 1 строчка из моего примера заменяется на обработку исключения и обработку найденного элемента.


  • 0

#18 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 18 февраля 2016 - 07:36

В любом случае - 1 строчка из моего примера заменяется на обработку исключения и обработку найденного элемента.

Татьяна не забывайте, что под вашу 1 строчку кода нужно писать еще несколько строк условия на возвращаемый результат.


  • 0

#19 TatyanaV

TatyanaV

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

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 18 февраля 2016 - 07:44

 

В любом случае - 1 строчка из моего примера заменяется на обработку исключения и обработку найденного элемента.

Татьяна не забывайте, что под вашу 1 строчку кода нужно писать еще несколько строк условия на возвращаемый результат.

 

Задача "определить есть ли у элемент свойство" - обработки возвращаемого boolean не требует. True - есть свойство, false - нет свойства. Что у автора будет делаться дальше в зависимости от этого - уже отдельная задача.

 

 

if (hasAttribute()) { <сделать что-то> }

 

и 

     

try {

     if (elementFound() != null) { <сделать что-то> }

} catch (Exception e) {}

(даже если запихнуть обработку внутрь метода по "проверке наличия свойства" - это не отменит самого факта необходимости try/catch)


  • 0


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

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