【轉】Selenium 報錯:Element is not clickable at point的解決辦法

天一同窗在寫Selenium Java腳本時遇到一個問題,登陸進入系統以後,要點擊左側的一個菜單,可是執行到該語句時報下面的錯誤:css

Firefox中報錯以下:
org.openqa.selenium.ElementClickInterceptedException: Element <div class="el-submenu__title"> is not clickable at point (115,358) because another element <div class="el-loading-mask is-fullscreen el-loading-fade-leave-active el-loading-fade-leave-to"> obscures itchrome

錯誤的意思是:沒法點擊這個元素,由於被另外一個div掩蓋(obscure)住了。測試

Chrome 中報錯以下:
org.openqa.selenium.WebDriverException: unknown error: Element <div class="el-submenu__title" style="padding-left: 20px;">...</div> is not clickable at point (115, 358). Other element would receive the click: <div class="el-loading-mask is-fullscreen el-loading-fade-leave-active el-loading-fade-leave-to" style="z-index: 2000;">...</div>
  (Session info: chrome=67.0.3396.99)ui

錯誤的意思是:沒法點擊這個元素,另一個div元素接收了這個點擊。spa

經分析調試,如下方法能夠解決此類問題。
解決方法一:
思路:先使用invisibilityOf等待掩蓋的div消失不見,再使用elementToBeClickable等待要點擊的元素達到可點擊的狀態。調試

示例:code

//要點擊的左側菜單元素
WebElement LeftMenu = driver.findElement(By.xpath("xpath"));

//掩蓋的div元素
WebElement ObscureDiv = driver.findElement(By.xpath("//div[@class='el-loading-mask is-fullscreen el-loading-fade-leave-active el-loading-fade-leave-to']"));

//使用顯示等待,等待掩蓋的div消失
WebDriverWait wait = new WebDriverWait(driver,60);
wait.until(ExpectedConditions.invisibilityOf(ObscureDiv));

//等待左側菜單到可點擊狀態
wait.until(ExpectedConditions.elementToBeClickable(LeftMenu ));

//以後再執行點擊
LeftMenu .click();
解決方法二:
思路:由於掩蓋的div可能會在進行一些操做後,會消失,因此登陸後執行一個頁面刷新的操做,此div便可消失。orm

          再等待左側菜單到可點擊狀態便可。視頻

示例:教程

//登陸以前的代碼

//登陸後加時間等待,而且進行一次頁面刷新
Thread.sleep(3000);
driver.navigate().refresh();

//要點擊的左側菜單元素
WebElement LeftMenu = driver.findElement(By.xpath("xpath"));

//等待左側菜單到可點擊狀態
WebDriverWait wait = new WebDriverWait(driver,60);
wait.until(ExpectedConditions.elementToBeClickable(LeftMenu ));

//以後再執行點擊
LeftMenu .click();

****************************************************************************************************

最近我會持續更新Selenium Java的相關文章,也請你們多多關注個人視頻課程

全網最新、最完整、最具性價比、而且會持續保持更新的自動化測試課程

Selenium3 Java自動化測試完整教程
*****************************************************************************************************

 

關注火烈鳥測試公衆號:huolieniaotesting,我會在上面更新一些關於測試的文章,我常常會逛一些國外的論壇,也會把比較好的國外專家的文章及國外測試動態分享到這個公衆號裏,讓你們能夠了解到國外的測試狀況,也但願你們能在上面發表文章,聊聊測試那些事兒。

 

解決思路:

 

錯誤Element is not clickable at point (x, y)可能源於不一樣因素。您能夠經過如下任一過程解決它們:

1.因爲存在JavaScript或AJAX調用,元素未被點擊

嘗試使用ActionsClass:

WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().build().perform(); 

2.元素未被點擊,由於它不在視口

嘗試使用JavascriptExecutor該元素在視口中:

WebElement myelement = driver.findElement(By.id("navigationPageButton")); JavascriptExecutor jse2 = (JavascriptExecutor)driver; jse2.executeScript("arguments[0].scrollIntoView()", myelement); 

3.在元素可點擊以前,頁面將被刷新。

在這種狀況下,如第4點所述誘導ExplicitWaitWebDriverWait

4.元素存在於DOM中但不可點擊。

在這種狀況下, 請將ExplicitWaitExpectedConditions設置elementToBeClickable爲可單擊的元素:

WebDriverWait wait2 = new WebDriverWait(driver, 10); wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton"))); 

5.元素存在但具備臨時疊加。

在這種狀況下,ExplicitWait使用 ExpectedConditionsset設置invisibilityOfElementLocated爲Overlay是不可見的。

WebDriverWait wait3 = new WebDriverWait(driver, 10); wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv"))); 

6.元素存在但具備永久疊加。

用於JavascriptExecutor直接在元素上發送單擊。

WebElement ele = driver.findElement(By.xpath("element_xpath")); JavascriptExecutor executor = (JavascriptExecutor)driver; executor.executeScript("arguments[0].click();", ele);
相關文章
相關標籤/搜索