2013-12-20 76 views
1

我必須編寫一個測試來驗證某個元素在某些情況下是不是可點擊的。我正在使用Selenium Webdriver Java庫。如何等待元素不能使用Selenium Webdriver點擊?

我知道如何通過使用WebDriverWaitExpectedConditions類來做相反的事情。

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

但我似乎無法找到一種方法來檢查相反的事情。

我已經通過了WebElement的文檔,並設法將問題分解爲兩個更簡單的情況。

  1. 元素被禁用 - 在這種情況下,我可以只使用WebElement#isEnabled並傳遞給謂詞包裹。

    new WebDriverWait(driver, TIMEOUT).until(new Predicate<WebDriver>(){ 
        public boolean apply(WebDriver driver) { 
         return !getElement().isEnabled(); 
        } 
    }); 
    
  2. 在某些情況下,該元素並不做任何點擊。我也想考慮這一點。問題是,元素本身沒有被禁用。它可以被點擊,但沒有註冊事件(通常,有一個,但在我的情況下,它被JavaScript刪除)。

第二種情況仍然困擾着我。我有什麼方法可以等待這樣的事件未註冊?

回答

1

您的案例1的解決方案似乎應該工作。

對於案例2,你可能需要調用頁面上的JavaScript硒內檢查元素具有分配任何事件處理程序,我相信下面的應該做的伎倆:

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

這應該讓JS查詢當前onClick事件處理程序,該事件處理程序分配給從getElement()方法傳入JavascriptExecutor的元素,如果未分配處理程序,則返回true。

沒有真正測試過這個超出JS的快速小提琴,但它應該都很好。

更新: 在新版本中的硒,你應該能夠使用:

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

謝謝,我會嘗試這個,當我回來的X-MAS休息後上班。明確的轉換看起來有點可疑,但它可能會被刪除,我會看到我能做些什麼。再次感謝,節日快樂;) – toniedzwiedz

+0

我很確定這就是Selenium的JS執行程序的工作原理,但是可能是錯誤的 - 如果你找到一種方法來擺脫它,我很樂意聽到它! 順便說一句,這個答案你有什麼好運嗎? –

+0

我最終使用'JavaScriptExecutor'來檢查由前端設置的特定值。謝謝。 – toniedzwiedz

相關問題