Selenium проверить наличие элемента java

Проверить наличие элемента с помощью Selenium WebDriver?

Есть ли способ проверить, присутствует ли элемент? Любой метод findElement завершится исключением, но это не то, что я хочу, потому что может случиться так, что элемент отсутствует, и это нормально, это не ошибка теста, поэтому исключение не может быть решением.

Я нашел это сообщение: Selenium c # Webdriver: подождите, пока элемент присутствует Но это для C #, и я не очень хорошо в этом разбираюсь. Кто-нибудь может перевести код на Java? Извините, ребята, я пробовал это в Eclipse, но не понимаю, как это сделать в Java-коде.

public static class WebDriverExtensions < public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)< if (timeoutInSeconds >0) < var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)); return wait.Until(drv =>drv.FindElement(by)); > return driver.FindElement(by); > > 

У меня есть несколько методов, которые очень эффективно работают при проверке объекта, но это зависит от того, что вы хотите с ним делать. например, вы хотите искать элемент, пока он не существует, вы хотите искать его, пока он больше не существует, или вы хотите просто попытаться найти его?

Java очень похожа на C #. Я думаю, что одна из основных проблем, с которыми вы здесь столкнулись, — это Java, это WebElement вместо IWebElement.

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

Если в любом случае все в порядке, это может быть проблематично для производительности теста, поскольку время ожидания, связанное с ожиданием элемента, существование которого вы не ожидаете, действительно складывается. Я использовал несколько приемов, чтобы сократить время ожидания, но пока не нашел по-настоящему чистого решения для этого.

21 ответ

Используйте findElements вместо findElement .

findElements вместо исключения вернет пустой список, если соответствующие элементы не найдены.

Чтобы проверить наличие элемента, вы можете попробовать это

Boolean isPresent = driver.findElements(By.yourLocator).size() > 0 

Это вернет истину, если найден хотя бы один элемент, и ложь, если он не существует.

findElement не следует использовать для поиска отсутствующих элементов, вместо этого используйте findElements (By) и подтвердите ответ нулевой длины.

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

Читайте также:  Python заполнить массив значениями функции

Хороший звонок джангофан! Я успешно использовал эту стратегию, изменив неявное ожидание тайм-аутов драйвера на ноль, а затем вернув его к предыдущему значению.

Это дало исключение NoSuchElementFound, что очень жаль, поскольку я надеялся использовать это, чтобы избежать перехвата этого исключения в данном экземпляре.

Намного проще использовать: if (driver.getPageSource (). Contains («Текст на странице»)) <> Если страница содержит этот текст, то условие будет истинным, иначе оно будет ложным, и вы можете закодировать соответственно.

А как насчет частного метода, который просто ищет элемент и определяет, присутствует ли он следующим образом:

private boolean existsElement(String id) < try < driver.findElement(By.id(id)); >catch (NoSuchElementException e) < return false; >return true; > 

Это было бы довольно просто, и это сделало бы свою работу.

Изменить: вы можете пойти дальше и взять параметр By elementLocator в качестве параметра, что устраняет проблемы, если вы хотите найти элемент по чему-то другому, кроме идентификатора.

Да, это правильный путь. Не понимаю, почему люди игнорируют этот способ и подсчитывают совпадающие элементы, проверяя, равен ли результат 0.

Что ж, я должен сказать, что использование исключений для регулирования потока программы — не лучший способ.

Хм? Это было ваше предложение! Это хороший вариант, если ваш тест не предполагает найти элемент. Как вы показываете, просто верните null и assert.isnull или isnotnull, что является значимым способом проверить, существует ли что-то.

В случае, если я неправильно истолковал вопрос «есть ли способ проверить, присутствует ли элемент?» Неправильно, буду рад узнать, почему ваше мнение расходится по поводу того, является ли это правомерным ответом.

Может захотеть сократить время ожидания. Прямо сейчас, если элемент не существует, вы должны подождать «30 секунд», прежде чем функция вернет false.

Я обнаружил, что это работает для Java:

WebDriverWait waiter = new WebDriverWait(driver, 5000); waiter.until( ExpectedConditions.presenceOfElementLocated(by) ); driver.FindElement(by); 

presenceOfElementLocated вызовет исключение, если элемент не будет найден ни при какой конкретной попытке. Чтобы этого избежать, добавьте оператор wait.ignoring(NoSuchElementException.class); между первой и второй строкой.

public static WebElement FindElement(WebDriver driver, By by, int timeoutInSeconds) < WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds); wait.until( ExpectedConditions.presenceOfElementLocated(by) ); //throws a timeout exception if element not present after waiting seconds return driver.findElement(by); > 

Я была такая же проблема. Для меня, в зависимости от уровня прав пользователя, некоторые ссылки, кнопки и другие элементы не будут отображаться на странице. Часть моего набора тестировала отсутствие элементов, которые ДОЛЖНЫ отсутствовать. Я часами пытался понять это. Наконец-то я нашел идеальное решение.

Читайте также:  Php изменить вид ссылки

Это говорит браузеру искать все без исключения элементы на основе указанных. Если это приводит к 0 , это означает, что никаких элементов, основанных на спецификации, не найдено. Затем у меня есть код, выполняющий оператор if, чтобы сообщить мне, что он не найден.

Это в C# , поэтому необходимо будет сделать перевод в Java . Но не должно быть слишком сложно.

public void verifyPermission(string link) < IListadminPermissions = driver.FindElements(By.CssSelector(link)); if (adminPermissions.Count == 0) < Console.WriteLine("User's permission properly hidden"); >> 

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

Следующий фрагмент кода проверяет, существует ли на странице конкретный элемент. В зависимости от существования элемента у меня есть тест, выполняющий if else.

Если элемент существует и отображается на странице, я должен console.write сообщить мне об этом и двигаться дальше. Если рассматриваемый элемент существует, я не могу выполнить необходимый мне тест, что является основной причиной необходимости его настройки.

Если элемент не существует и не отображается на странице. У меня есть else в if else выполнить тест.

IList deviceNotFound = driver.FindElements(By.CssSelector("CSS LINK GOES HERE")); //if the element specified above results in more than 0 elements and is displayed on page execute the following, otherwise execute whats in the else statement if (deviceNotFound.Count > 0 && deviceNotFound[0].Displayed) < //script to execute if element is found >else < //Test script goes here. >

Я знаю, что немного опоздал с ответом на OP. Надеюсь, это кому-то поможет!

Попробуйте следующее: вызовите этот метод и передайте 3 аргумента:

  1. Переменная WebDriver. // предполагаем driver_variable как driver.
  2. Элемент, который вы собираетесь проверить. Должен быть предоставлен по методу. // например: By.id («id»)
  3. Ограничение по времени в секундах.
Читайте также:  Class with method python

Пример: waitForElementPresent (драйвер, By.id («id»), 10);

public static WebElement waitForElementPresent(WebDriver driver, final By by, int timeOutInSeconds) < WebElement element; try< driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait() WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); element = wait.until(ExpectedConditions.presenceOfElementLocated(by)); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //reset implicitlyWait return element; //return the element >catch (Exception e) < e.printStackTrace(); >return null; > 

Вы можете ускорить выполнение кода, сократив время ожидания селена перед оператором try catch.

Я использую следующий код, чтобы проверить, присутствует ли элемент.

protected boolean isElementPresent(By selector) < selenium.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); logger.debug("Is element present"+selector); boolean returnVal = true; try< selenium.findElement(selector); >catch (NoSuchElementException e) < returnVal = false; >finally < selenium.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS); >return returnVal; > 

Это то, что я использую в своем коде. Я оставляю время ожидания Selenium по умолчанию, а затем использую его.

С момента написания этого ответа я узнал, что использование ExpectedConditions считается лучшей формой, но использование оператора try catch по-прежнему полезно при попытке определить, отсутствует ли элемент.

Я застрял на старой версии селена, потому что мне нужно протестировать IE8. но я попробую это, когда смогу обновить

Каждый раз ваш метод будет устанавливать неявное ожидание тайм-аута, но логически мы должны установить неявное ожидание только один раз после инициализации объекта драйвера, и таймаут устанавливается для сеанса драйвера.

Напишите следующую функцию / методы, используя Java:

protected boolean isElementPresent(By by) < try< driver.findElement(by); return true; >catch(NoSuchElementException e) < return false; >> 

Вызовите метод с соответствующим параметром во время утверждения.

Если вы используете rspec-Webdriver в ruby, вы можете использовать этот скрипт, предполагая, что элемент действительно не должен присутствовать и это пройденный тест.

Сначала напишите этот метод из файла RB вашего класса

class Test def element_present? begin browser.find_element(:name, "this_element_id".displayed? rescue Selenium::WebDriver::Error::NoSuchElementError puts "this element should not be present" end end 

Затем в вашем файле спецификации вызовите этот метод.

 before(:all) do @Test= Test.new(@browser) end @Test.element_present?.should == nil 

Если ваш элемент НЕ присутствует, ваша спецификация будет пройдена, но если элемент присутствует, он выдаст ошибку, тест не пройден.

public boolean isElementDisplayed()

Источник

Оцените статью