Проверить наличие элемента с помощью 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 ]

0 голосов
/ 07 июля 2014

Даю мой фрагмент кода. Таким образом, приведенный ниже метод проверяет, существует ли на странице случайная кнопка " Создать новое приложение " случайного веб-элемента или нет. Обратите внимание, что я использовал период ожидания как 0 секунд.

public boolean isCreateNewApplicationButtonVisible(){
    WebDriverWait zeroWait = new WebDriverWait(driver, 0);
    ExpectedCondition<WebElement> c = ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@value='Create New Application']"));
    try {
        zeroWait.until(c);
        logger.debug("Create New Application button is visible");
        return true;
    } catch (TimeoutException e) {
        logger.debug("Create New Application button is not visible");
        return false;
    }
}
0 голосов
/ 31 октября 2013

Лично я всегда использую смесь из приведенных выше ответов и создаю метод статической утилиты многократного использования, который использует предложение size () <0: </p>

public Class Utility {
   ...
   public static boolean isElementExist(WebDriver driver, By by) {
      return driver.findElements(by).size() < 0;
   ...
}

Это аккуратный, многократно используемый, обслуживаемый ... все эти хорошие вещи; -)

0 голосов
/ 13 июня 2013

Это должно сделать это:

try {
    driver.findElement(By.id(id));
} catch (NoSuchElementException e) {
    //do what you need here if you were expecting
    //the element wouldn't exist
}
0 голосов
/ 25 мая 2013

Чтобы найти конкретный элемент или нет, мы должны использовать метод findElements () вместо findElement () ..

int i=driver.findElements(By.xpath(".......")).size();
if(i=0)
System.out.println("Element is not present");
else
System.out.println("Element is present");

это работает для меня .. подскажите, если я ошибаюсь..

0 голосов
/ 12 апреля 2013

Самый простой способ, который я нашел в Java:

List<WebElement> linkSearch=  driver.findElements(By.id("linkTag"));
int checkLink=linkSearch.size();
if(checkLink!=0){  //do something you want}
0 голосов
/ 31 декабря 2016

Я бы использовал что-то вроде (со Scala [код в старой «хорошей» Java 8 может быть похож на этот]):

object SeleniumFacade {

  def getElement(bySelector: By, maybeParent: Option[WebElement] = None, withIndex: Int = 0)(implicit driver: RemoteWebDriver): Option[WebElement] = {
    val elements = maybeParent match {
      case Some(parent) => parent.findElements(bySelector).asScala
      case None => driver.findElements(bySelector).asScala
    }
    if (elements.nonEmpty) {
      Try { Some(elements(withIndex)) } getOrElse None
    } else None
  }
  ...
}

, тогда

val maybeHeaderLink = SeleniumFacade getElement(By.xpath(".//a"), Some(someParentElement))
0 голосов
/ 31 марта 2017
public boolean isElementDisplayed() {
        return !driver.findElements(By.xpath("...")).isEmpty();
    }
0 голосов
/ 17 июля 2013

Вы можете попробовать неявное ожидание:

WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
driver.Url = "http://somedomain/url_that_delays_loading";
IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement"));

`

Или Вы можете попробовать явное ожидание:`

IWebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
    {
        return d.FindElement(By.Id("someDynamicElement"));
    });

`

Явный проверит, присутствует ли элемент перед каким-либо действием.Неявное ожидание может быть вызвано в любом месте кода.Например, после некоторых действий AJAX.

Больше вы можете найти на SeleniumHQ page

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