Проверить наличие элемента с помощью Selenium WebDriver? - PullRequest
146 голосов
/ 03 ноября 2011

есть ли способ проверить, присутствует ли элемент? Любой метод 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);
    }
}

Ответы [ 18 ]

249 голосов
/ 08 февраля 2012

Использование findElements вместо findElement.

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

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

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

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

51 голосов
/ 24 октября 2012

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

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

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

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

14 голосов
/ 04 января 2013

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

WebDriverWait waiter = new WebDriverWait(driver, 5000);
waiter.until( ExpectedConditions.presenceOfElementLocated(by) );
driver.FindElement(by);
7 голосов
/ 09 ноября 2011
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 <timeoutInSeconds> seconds
    return driver.findElement(by);
}
5 голосов
/ 30 января 2014

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

  1. Переменная WebDriver. // предполагая, что driver_variable является драйвером.
  2. Элемент, который вы собираетесь проверить. Должен предоставлять из метода. // ex: By.id ("id")
  3. Ограничение по времени в секундах.

Пример: 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; 
    }
5 голосов
/ 28 августа 2012

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

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

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

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

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

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

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

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

IList<IWebElement> 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 голосов
/ 16 марта 2015

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

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

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

3 голосов
/ 10 декабря 2014

Вы можете ускорить выполнение кода, сократив тайм-аут селена перед оператором 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;
}
2 голосов
/ 17 июня 2014

Это работает для меня:

 if(!driver.findElements(By.xpath("//*[@id='submit']")).isEmpty()){
    //THEN CLICK ON THE SUBMIT BUTTON
}else{
    //DO SOMETHING ELSE AS SUBMIT BUTTON IS NOT THERE
}
2 голосов
/ 28 мая 2013

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

Во-первых, сначала напишите этот метод из вашего класса RBfile

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...