WebDriver-Java를 사용하여 요소 대기


79

waitForElementPresent클릭하기 전에 요소가 표시되는지 확인 하기 위해 비슷한 것을 찾고 있습니다. 에서이 작업을 수행 할 수 있다고 생각 implicitWait했기 때문에 다음을 사용했습니다.

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

다음 클릭

driver.findElement(By.id(prop.getProperty(vName))).click();

불행히도 때로는 요소를 기다리고 때로는 그렇지 않습니다. 나는 잠시 동안이 해결책을 찾았습니다.

for (int second = 0;; second++) {
            Thread.sleep(sleepTime);
            if (second >= 10)
                fail("timeout : " + vName);
            try {
                if (driver.findElement(By.id(prop.getProperty(vName)))
                        .isDisplayed())
                    break;
            } catch (Exception e) {
                writeToExcel("data.xls", e.toString(),
                        parameters.currentTestRow, 46);
            }
        }
        driver.findElement(By.id(prop.getProperty(vName))).click();

그리고 괜찮 았지만 시간이 초과되기 전에 10 번 5, 50 초를 기다려야했습니다. 조금 많이. 그래서 암묵적으로 대기를 1 초로 설정했고 지금까지 모두 괜찮아 보였습니다. 이제 어떤 것들은 시간 초과 전에 10 초를 기다리지 만 다른 것들은 1 초 후에 시간 초과되기 때문입니다.

코드에 존재 / 표시되는 요소를 기다리는 것을 어떻게 처리합니까? 어떤 힌트라도 감상 할 수 있습니다.

답변:


154

이것이 내 코드에서 수행하는 방법입니다.

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));

또는

wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));

정확합니다.

또한보십시오:


2
감사! 이 수업에 대해 더 빨리 알았다면 내 인생이 더 쉬울 것입니다. :)
tom

이 형식에 코드를 어떻게 통합합니까? @FindBy(how = How.ID, using = "signup-button") WebElement signUpButton;또한 귀하의 코드로 NPE를 여전히 얻습니다. elementToBeClickable을 가져 오려는 것 같습니다. 요소가로드되지 않았을 때이 방법을 어떻게 사용할 수 있습니까?
HelloWorldNoMore

10

명시 적 대기 또는 유창 대기를 사용할 수 있습니다.

명시 적 대기의 예-

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20);
WebElement aboutMe;
aboutMe= wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("about_me")));     

유창한 대기의 예-

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)                            
.withTimeout(20, TimeUnit.SECONDS)          
.pollingEvery(5, TimeUnit.SECONDS)          
.ignoring(NoSuchElementException.class);    

  WebElement aboutMe= wait.until(new Function<WebDriver, WebElement>() {       
public WebElement apply(WebDriver driver) { 
return driver.findElement(By.id("about_me"));     
 }  
});  

자세한 내용은 이 튜토리얼 을 확인 하십시오.


1
이 메소드는 더 이상 사용되지 않습니다.
JGFMK

5

우리는 elementToBeClickable. https://github.com/angular/protractor/issues/2313을 참조 하십시오 . 약간의 무자비한 힘이 있어도이 라인을 따라 어떤 것이 합리적으로 잘 작동했습니다.

Awaitility.await()
        .atMost(timeout)
        .ignoreException(NoSuchElementException.class)
        .ignoreExceptionsMatching(
            Matchers.allOf(
                Matchers.instanceOf(WebDriverException.class),
                Matchers.hasProperty(
                    "message",
                    Matchers.containsString("is not clickable at point")
                )
            )
        ).until(
            () -> {
                this.driver.findElement(locator).click();
                return true;
            },
            Matchers.is(true)
        );

-5

위의 wait 문은 Explicit wait의 좋은 예입니다.

명시 적 대기는 특정 웹 요소에 국한된 지능형 대기입니다 (위의 x-path에서 언급 됨).

명시 적 대기를 사용하면 기본적으로 WebDriver에 최대로 X 단위 (timeoutInSeconds로 지정한 것)를 기다렸다가 포기하는 것입니다.


5
다른 사용자가 답변을 다르게 정렬하고 "Above"에 대한 컨텍스트가 변경 될 수 있으므로 답변에 코드 스 니펫을 추가하세요.
Devraj Gadhavi 2014 년

5 년이 지났고 여전히 코드 스 니펫을 기다리고 있으므로 주제에 대한 정보를 검색하는 다른 사람들이 이해할 수 있습니다.
Caperneoignis

이 답변에 대해 더 알고 싶다면. guru99.com/implicit-explicit-waits-selenium.html
Murtaza Haji
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.