Проверка наличия у элемента определенного свойства
#1
Отправлено 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".
#2
Отправлено 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; }
#3
Отправлено 08 июля 2012 - 18:54
Элементарно:Подскажите, пожалуйста, как можно проверить, что элемент 7 имеет свойство class="valid today".
assertTrue(driver.findElement(By.xpath("//td[@class='valid today']")));
#4
Отправлено 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)
#5
Отправлено 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 и будут возникать подобные ситуации. имхо все.
#6
Отправлено 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; }
Спасибо. Рабочий вариант
#7
Отправлено 17 февраля 2016 - 07:09
Слишком много лишнего, на мой взгляд.
public boolean isTrue() { return driver.findElements(By.xpath("//td[7][@class='valid today']")).size() > 0; }
Про драйвер - сами решите, как Вам удобнее его передавать/инициализировать, для сути вопроса не принципиально.
Ну и локатор вплоть до "//td[7]" (включительно) лучше сделать более конкретным в рамках страницы.
#8
Отправлено 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']"))
#9
Отправлено 17 февраля 2016 - 10:52
driver.findElement(By.xpath("//td[7][@class='valid today']"))
#10
Отправлено 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() никаких ошибок не выдаст и гарантированно отработает. Да и быстрее это будет.
#11
Отправлено 18 февраля 2016 - 07:05
У автора изначально требовалось вернуть boolean, findElements возвращает массив элементов, которые он нашел по заданному локатору. Поэтому, чтобы вернуть требуемый boolean - возвращается size() > 0 (т.е. нашлись ли какие-нибудь элементы с этим локатором или нет).
driver.findElement(By.xpath("//td[7][@class='valid today']"))А findElement (если элемента на форме нет) будет сначала долго и безуспешно ждать его появления (в соответствии с заданным таймаутом), а потом может ещё и упасть с эксепшеном (в зависимости от того, что дальше будет с этим элементом делаться).
findElements же - поищет по локатору, нашлось что-то - супер, добавит в массив, не нашлось - ну и ладно. Массив в любом случае будет, даже если он будет пустой, size() никаких ошибок не выдаст и гарантированно отработает. Да и быстрее это будет.
хм, не вижу где автору требуется вернуть булево значение
да и тест свалится, если не найдет элемент , а не поскочит дальше, хотя по факту уже он отклоняется от сценария, например.
Время таймаута можно задать самому насколько я помню.
#12
Отправлено 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, вместо того, чтобы настраивать и ждать таймауты, прописывать обработку исключений и т.п.?
#13
Отправлено 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)))
#14
Отправлено 18 февраля 2016 - 07:23
Аналогично. Трата 10 сек на ожидание отсутствующего элемента (с учетом изначального задания естественно, иногда подобные ожидания нужны) - так и осталось для меня бессмысленной и непонятной.
#15
Отправлено 18 февраля 2016 - 07:24
Аналогично. Трата 10 сек на ожидание отсутствующего элемента (с учетом изначального задания естественно, иногда подобные ожидания нужны) - так и осталось для меня бессмысленной и непонятной.
это пример функции в которой значение таймаута можно задать самому , если хочется.... но по умолчанию будет = 10. ок
#16
Отправлено 18 февраля 2016 - 07:27
Даже если поставить 500 милисекунд - это в любом случае гарантированная ненужная в данном примере пауза (при отсутствующем элементе).
Подобные паузы (любой продолжительности) нужны, когда элемент нужно дождаться (например, если ему нужно некоторое время для загрузки), чтобы быть уверенным, что с ним можно дальше работать, но если нужно просто ПРОВЕРИТЬ, есть ли в наличии элемент с определенным свойством - они не имеют смысла. imho
#17
Отправлено 18 февраля 2016 - 07:29
В любом случае - 1 строчка из моего примера заменяется на обработку исключения и обработку найденного элемента.
#18
Отправлено 18 февраля 2016 - 07:36
В любом случае - 1 строчка из моего примера заменяется на обработку исключения и обработку найденного элемента.
Татьяна не забывайте, что под вашу 1 строчку кода нужно писать еще несколько строк условия на возвращаемый результат.
#19
Отправлено 18 февраля 2016 - 07:44
В любом случае - 1 строчка из моего примера заменяется на обработку исключения и обработку найденного элемента.
Татьяна не забывайте, что под вашу 1 строчку кода нужно писать еще несколько строк условия на возвращаемый результат.
Задача "определить есть ли у элемент свойство" - обработки возвращаемого boolean не требует. True - есть свойство, false - нет свойства. Что у автора будет делаться дальше в зависимости от этого - уже отдельная задача.
if (hasAttribute()) { <сделать что-то> }
и
try {
if (elementFound() != null) { <сделать что-то> }
} catch (Exception e) {}
(даже если запихнуть обработку внутрь метода по "проверке наличия свойства" - это не отменит самого факта необходимости try/catch)
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных