2016-11-01 3 views
0

Java Java 셀레늄 webdriver 프로젝트에 많은 Thread.sleep() 명령이 있습니다. sleep 명령을 사용하는 것은 나쁜 습관이고 암시 적으로 명령은 브라우저 인스턴스가 시작된 후에 한 번 선언되어야하며 전체 스크립트를 처리한다는 것을 자주 읽었습니다. 이 프로젝트에서 나에게 도움이되지 않습니다.Thread.sleep() implicitlyWait보다 우수함을 증명합니다.

As NoSuchElementExceptions가 특정 요소에 대해 발생하는 경우가 많으므로 문제가있는 각 요소 바로 앞에 sleep 명령을 추가했습니다. 스크립트가 통과되었습니다. 잠자기 명령을 제거하고 암시 적으로 30 초를 기다렸을 때 스크립트는 WebdriverException/NoSuchElementException으로 실패했습니다. 왜냐하면 webdriver가 각 요소를 찾을 수 없기 때문입니다. 수면 명령은 2 ~ 3 초 안에 요소를 찾습니다. 여기 Thread.sleep()이 우월하다는 것을 증명합니까? ExplicitlyWait을 사용해야 할 경우 예상 조건이 필요한 많은 요소가 있으므로 많은 요소도 선언해야합니다. 해결 방법이 있습니까?

답변

1

요소를 찾기 위해 명시 적으로 대기하십시오. Exception을 던지기 전에 제공된 조건 또는 최대 대기 시간까지 기다립니다.

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20); // pass time in seconds as much you need 
WebElement myElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("your element's id"))); 

참고 : FluentWait도 또 다른 좋은 옵션이 될 수있다.

+1

명시 적 대기와 관련된 문제는 개별 사례에 대한 문제입니다. 관련된 모든 요소에 대해 하나만 선언 할 수는 없으므로 Thread.sleep()과 비슷하게 스크립트에서 여러 번 선언해야합니다. 옳은? –

3

Thread.sleep() - 기다릴 때마다 설정하십시오. "멍청한"대기. 지정된 시간 동안 대기합니다. 더 이상은 아니며 더 이상은 아닙니다. 요소가 25ms 이내에 사용 가능하다면, 지정한 10 초를 기다려야 각 시간이 낭비됩니다.

암시 적 대기 - 설정하고 WebDriver 인스턴스의 수명 내내 지속합니다. 지정된 시간 동안 마다.findElement() 호를 기다립니다. 따라서 엘리먼트가 존재하지 않는다는 것을 체크 할 필요가 있다면 암시 적 대기 시간에 지정된 시간 동안 기다리면 시간 낭비가 될 것입니다.

명시 적 대기 (WebDriverWait) - 대기 할 때마다 설정하십시오. 이것은 FluentWait의 특정 인스턴스에 불과합니다. ExpectedConditions을 사용하여 모든 일반적인 요구 사항 (표시 가능, 클릭 가능 등)을 사용자 정의 할 수 있습니다. 이것이 최선의 방법입니다.

유창한 대기 - 기다릴 때마다 설정하십시오. 기다리는 스위스 육군 칼. 무엇이든 할 수 있습니다 ... 완벽하게 사용자 정의 할 수 있습니다. 아주 특정한 경우에 유용 할 수 있지만 일반적으로 대부분의 대기 수요는 WebDriverWaitExpectedConditions으로 처리됩니다. 나는 대기를 사용하는 방법

...

나는 페이지 개체 모델을 사용하여 페이지가로드 될 때 실행되는 각 페이지 객체의 생성자에서, 나는 요소에 대기하는 WebDriverWait를 사용 사용할 수있는 페이지 해당 요소를 사용할 수있게되면 전체 페이지가로드되었음을 알게됩니다. 이제는 페이지에서 원하는 요소를 다 긁을 수 있습니다. 페이지의 상태를 변경하면 동적 페이지 변경이 완료되었음을 알리는 새 요소가 나타날 때까지 기다리는 또 다른 WebDriverWait이 있습니다. 이제 다시 의지 할 수 있습니다.

마다.findElement() 호를 기다릴 필요가 없습니다. 위에서 설명한대로 페이지가로드되거나 동적 페이지가 변경되기를 기다리면 매우 구체적인 경우에만 대기해야합니다.어디서나.

참고 : Do not mix implicit and explicit waits. 나쁜/이상한 결과가 나옵니다.