[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);
    }
}



답변

findElements대신에 사용하십시오 findElement.

findElements 예외 대신 일치하는 요소가 없으면 빈 목록을 반환합니다.

요소가 존재하는지 확인하려면 다음을 시도하십시오.

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

하나 이상의 요소가 발견되면 true를 리턴하고 존재하지 않으면 false를 리턴합니다.

공식 문서 는이 방법을 권장합니다.

findElement는 존재하지 않는 요소를 찾는 데 사용되어서는 안되며 findElements (By)를 사용하고 대신 길이가 0 인 응답을 지정하십시오.


답변

단순히 요소를 찾고 다음과 같이 존재하는지 판별하는 개인용 메소드는 어떻습니까?

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

이것은 매우 쉽고 일을합니다.

편집 : 당신은 더 나아가서 By elementLocator매개 변수로 매개 변수를 취할 수 있습니다 .id 이외의 다른 요소로 요소를 찾으려면 문제를 제거하십시오.


답변

나는 이것이 자바에서 작동한다는 것을 발견했다.

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


답변

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);
}


답변

나는 같은 문제가 있었다. 나에게 사용자의 권한 수준에 따라 일부 링크, 버튼 및 기타 요소가 페이지에 표시되지 않습니다. 내 스위트의 일부는 누락되어야하는 요소가 누락되었는지 테스트 중이었습니다. 나는 이것을 알아 내려고 몇 시간을 보냈다. 마침내 완벽한 솔루션을 찾았습니다.

이것이하는 일은 브라우저가 지정된 모든 요소를 ​​찾도록 지시합니다. 결과가 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");
    }
}

시험에 필요한 것에 따라 다른 길을 선택할 수도 있습니다.

다음 스 니펫은 페이지에 매우 구체적인 요소가 있는지 확인합니다. 요소의 존재에 따라 다른 테스트를 실행합니다.

요소가 존재하고 페이지에 표시되면 console.write알려주고 계속 진행했습니다. 문제의 요소가 존재하면 필요한 테스트를 실행할 수 없습니다.이를 설정 해야하는 주된 이유입니다.

요소가 존재하지 않고 페이지에 표시되지 않는 경우 if else에 테스트를 실행하는 else가 있습니다.

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에 대한 응답이 약간 늦었다는 것을 알고 있습니다. 잘만되면 이것은 누군가를 돕는다!


답변

이것을보십시오 :이 방법을 호출하고 세 가지 인수를 전달하십시오 :

  1. WebDriver 변수. // driver_variable을 driver로 가정합니다.
  2. 확인할 요소입니다. By 메소드에서 제공해야합니다. // 예 : By.id ( “id”)
  3. 시간 제한 (초)

예 : waitForElementPresent (driver, 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;
}