天一同學在寫Selenium Java腳本時遇到一個問題,登錄進入系統之后,要點擊左側的一個菜單,但是執行到該語句時報下面的錯誤:
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 it
錯誤的意思是:無法點擊這個元素,因為被另一個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)
錯誤的意思是:無法點擊這個元素,另外一個div元素接收了這個點擊。
經分析調試,以下方法可以解決此類問題。
解決方法一:
思路:先使用invisibilityOf等待掩蓋的div消失不見,再使用elementToBeClickable等待要點擊的元素達到可點擊的狀態。
示例:
//要點擊的左側菜單元素
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即可消失。
再等待左側菜單到可點擊狀態即可。
示例:
//登錄之前的代碼
//登錄后加時間等待,並且進行一次頁面刷新
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點所述誘導ExplicitWait即WebDriverWait。
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);
