2013-12-20 14 views
1

특정 상황에서 요소를 클릭 할 수 없는지 확인하는 테스트를 작성해야합니다. Selenium Webdriver Java 라이브러리를 사용하고 있습니다.Selenium Webdriver를 사용하여 클릭 할 수없는 요소를 기다리는 방법은 무엇입니까?

나는 WebDriverWait 및 클래스를 사용하여 반대되는 작업을 수행하는 방법을 알고 있습니다.

new WebDriverWait(element, TIMEOUT).until(ExpectedConditions 
    .elementToBeClickable(By.cssSelector(LOCATOR))); 

하지만 반대되는 것을 확인하는 방법을 찾을 수없는 것 같습니다.

나는 WebElement에 대한 문서를 살펴보고 두 가지 간단한 경우로 문제를 해결했습니다.

  1. 요소는 사용할 수 없습니다 -이 경우에는 그냥 WebElement#isEnabled을 사용할 수 있으며 WebDriverWait#until에 전달 술어에 포장.

    new WebDriverWait(driver, TIMEOUT).until(new Predicate<WebDriver>(){ 
        public boolean apply(WebDriver driver) { 
         return !getElement().isEnabled(); 
        } 
    }); 
    
  2. 어떤 경우에는 요소가 클릭 할 때 아무 것도하지 않습니다. 나는 이것을 고려하고 싶다. 문제는 요소가 그 자체로 사용 중지되지 않는다는 것입니다. 그것은 클릭 할 수 있지만 등록 된 이벤트가 없습니다 (일반적으로 하나 있지만 내 경우에는 JavaScript에 의해 제거됩니다).

두 번째 경우에도 여전히 문제가 있습니다. 등록되지 않은 이벤트를 기다릴 수있는 방법이 있습니까?

답변

1

사례 1에 대한 솔루션이 제대로 작동하는 것처럼 보입니다.

new WebDriverWait(driver, TIMEOUT).until(new Predicate<WebDriver>() { 
    public boolean apply(WebDriver driver) { 
     return (JavascriptExectutor) driver.executeScript(
        "arguments[0].onclick == null;", getElement()); 
    } 
}); 

이 :

이 경우 2를 들어, 당신은 아마 요소가 할당 된 이벤트 핸들러를 가지고 있는지 확인하는 셀레늄 내에서 페이지에 자바 스크립트를 호출해야합니다, 나는 다음과 같은 트릭을 할 것으로 판단 JS가 getElement() 메서드에서 JavascriptExecutor으로 전달 된 요소에 할당 된 현재 onClick 이벤트 처리기를 쿼리하고 처리기가 할당되지 않은 경우 true를 반환해야합니다.

JS와의 빠른 학습을 넘어 실제로 테스트되지는 않았지만 모두 훌륭합니다.

업데이트 : 새로운 셀레늄 버전의 , 당신은 사용할 수 있어야합니다 : 나는 X 마스 휴식 후 작업을 다시 얻을 때

ExpectedConditions.not(ExpectedConditions.elementToBeClickab‌​le(By)) 
+0

감사합니다, 나는 이것을 시도 할 것이다. 명백한 캐스트는 조금 의심 스럽지만 아마 제거 될 수 있습니다. 내가 이것에 대해 할 수있는 것을 보겠습니다. 다시 감사합니다, 즐거운 휴일;) – toniedzwiedz

+0

셀레늄에 대한 JS 집행자가 어떻게 작동하는지 잘 알지만, 틀린 것일 수도 있습니다 - 만약 당신이 그것을 없애는 방법을 찾으면 나는 그것을 듣고 기뻐할 것입니다! 그런데이 답변에 행운이 있습니까? –

+0

프론트 엔드가 설정 한 특정 값을 확인하기 위해'JavaScriptExecutor'를 사용했습니다. 감사. – toniedzwiedz

관련 문제