在用selenium作自動化測試的時候,總會遇到元素定位不到的狀況,明明就是這個元素但老是報「Unable to locate element」,如下是本身遇到的三種狀況,作一個簡單的總結:html
1.多是網絡延遲等緣由,因等待時間不足而形成的,這種狀況就添加休眠時間:網絡
我此次就是這樣的,在定位姓名的時候老是報找不到元素的錯,框架
1 driver.findElement(By.xpath("/html/body/form/div[5]/div/div[1]/div[5]/div/div[2]/div/ul/li[2]/input")).sendKeys("張三"); 2 3 Thread.sleep(1000);
一直報錯,一直到等待時間增長到5000:Thread.sleep(5000);才經過測試
這種狀況碰到過好屢次,有時候今天運行沒問題的代碼,明天可能就會報錯,在本身電腦運行沒問題的,換一臺機器可能就通不過;因此後來遇到報「Unable to locate element」這種錯誤的,先增長如下等待時間試試;spa
2.可能是由於跳轉了頁面,而在代碼中沒有切換句柄:code
遇到「Unable to locate element」錯誤,排查不出問題的能夠把先後的句柄先打印出來,對比如下,看看是否是由於沒有切換句柄所引發的:orm
1 //獲取頁面1句柄 2 String handle1 = driver.getWindowHandle(); 3 System.out.println("主頁面1句柄:"+handle1); 4 //獲取頁面2句柄 5 String handle2 = driver.getWindowHandle(); 6 System.out.println("主頁面2句柄:"+handle2);
打印出以後,能夠對比一下,是否一致。若不一致則須要切換句柄htm
1 //切換句柄 2 driver.switchTo().window(handle);
切換句柄以後,再進行元素定位。blog
注意:切換完句柄執行成功以後,若果再離開當前頁面,記得把句柄再切換回去,操做同切換當前句柄一致。ci
3.要定位的元素處在不一樣的框架——iframe,也有遇到過這種狀況,要定位的元素屬於另一個框架。我的認爲這種狀況是最很差整的,由於到如今爲止尚未發現一個能很快很準確的找到不一樣的框架並定位出來(可能有這樣的辦法,只是本身不知道而已),遇到這種狀況要先退出當前的frame,而後再進入定位元素所在的frame;
1 //退出當前frame 2 driver.switchTo().defaultContent(); 3 //選擇fram 4 driver.switchTo().frame(driver.findElement(By.id("mainFrame")));
driver.switchTo().frame(driver.findElement(By.id("mainFrame")));其中標紅的部分就是要定位元素所在框架的定位,定位方式和元素定位方式一致,因此須要先準肯定位框架。
目前遇到的就是這三種狀況,之後遇到新的狀況再更新。
一直