요소가 있는지 테스트하는 방법이 있습니까? 모든 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에 대한 응답이 약간 늦었다는 것을 알고 있습니다. 잘만되면 이것은 누군가를 돕는다!
답변
이것을보십시오 :이 방법을 호출하고 세 가지 인수를 전달하십시오 :
- WebDriver 변수. // driver_variable을 driver로 가정합니다.
- 확인할 요소입니다. By 메소드에서 제공해야합니다. // 예 : By.id ( “id”)
- 시간 제한 (초)
예 : 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;
}