在用selenium做自动化测试的时候,总会遇到元素定位不到的情况,明明就是这个元素但总是报“Unable to locate element”,以下是自己遇到的三种情况,做一个简单的总结:
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”这种错误的,先增加以下等待时间试试;
2.可能是因为跳转了页面,而在代码中没有切换句柄:
遇到“Unable to locate element”错误,排查不出问题的可以把前后的句柄先打印出来,对比以下,看看是不是因为没有切换句柄所引起的:
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);
打印出之后,可以对比一下,是否一致。若不一致则需要切换句柄
1 //切换句柄 2 driver.switchTo().window(handle);
切换句柄之后,再进行元素定位。
注意:切换完句柄执行成功之后,若果再离开当前页面,记得把句柄再切换回去,操作同切换当前句柄一致。
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")));其中标红的部分就是要定位元素所在框架的定位,定位方式和元素定位方式一致,所以需要先准确定位框架。
目前遇到的就是这三种情况,以后遇到新的情况再更新。
一直