在selenium + Java + Firefox 的时候会出现不能通过 By.id()的方式找到界面元素,但是实际上界面上通过fireBug能够找到该元素的且唯一,为什么找不到到呢?
原因分析如下:
1.界面中不只存在一个该name或者class或者的名称的元素;
2.界面中存在iframe框架存在;
3.通过debug模式能够找到界面元素,但是run时,就找不到元素,唯一的一种解释:打开firefox,输入地址后,界面一直处于加载中,当界面未加载完成,便通过webdriver去中界面元素,当然会出现找不到的情况;解决方案:加入等待处理(等待处理方式),再做查找元素处理;thread.sleep();
调整前代码如下
package info . www . itest ;import static org . junit . Assert .*;import org.junit.* ;import org.openqa.selenium.By ;import org.openqa.selenium.WebDriver ;import org.openqa.selenium.firefox.FirefoxDriver ;public class CreatePost {@Beforepublic void setUp () throws Exception {}@Afterpublic void tearDown () throws Exception {}@Testpublic void testLogin (){System . setProperty ( "webdriver.firefox.bin" , "D:\\Program Files\\Mozilla Firefox\\firefox.exe" );WebDriver dr = new FirefoxDriver ();dr . get ( "http://www.1988.com/wordpress/wp-login.php" );//个人地址dr . findElement ( By . id ( "user_login" )). sendKeys ( "admin" );dr . findElement ( By . id ( "user_pass" )). sendKeys ( "admin" );dr . findElement ( By . id ( "wp-submit" )). click ();assertTrue ( dr . getCurrentUrl (). contains ( "admin" ));}}
错误信息如下
org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"user_login"}Command duration or timeout: 29.28 secondsFor documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.htmlBuild info: version: '2.41.0', revision: '3192d8a', time: '2014-03-27 17:18:15'System info: host: 'HS-Q0TFDE785GM3', ip: '169.254.183.27', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_16'Session ID: c438cb88-3d6c-422d-8aca-a95f2d84bfffDriver info: org.openqa.selenium.firefox.FirefoxDriverCapabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, browserName=firefox, rotatable=false, locationContextEnabled=true, version=4.0.1, cssSelectorsEnabled=true, databaseEnabled=true, handlesAlerts=true, nativeEvents=false, webStorageEnabled=true, applicationCacheEnabled=true, takesScreenshot=true}]at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)at java.lang.reflect.Constructor.newInstance(Constructor.java:513)at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193)at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:595)at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:348)at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:389)at org.openqa.selenium.By$ById.findElement(By.java:214)at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:340)at info.www.itest.CreatePost.testLogin(CreatePost.java:27)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
调整后代码如下
package info . www . itest ;import static org . junit . Assert .*;import org.junit.* ;import org.openqa.selenium.By ;import org.openqa.selenium.WebDriver ;import org.openqa.selenium.WebElement ;import org.openqa.selenium.firefox.FirefoxDriver ;public class CreatePost {@Beforepublic void setUp () throws Exception {}@Afterpublic void tearDown () throws Exception {}@Testpublic void testLogin () throws InterruptedException {System . setProperty ( "webdriver.firefox.bin" , "D:\\Program Files\\Mozilla Firefox\\firefox.exe" );WebDriver driver = new FirefoxDriver ();driver . get ( "http://localhost/wordpress/wp-login.php" );System . out . println ( driver . getCurrentUrl ());Thread . sleep ( 30000 );WebElement elementName = driver . findElement ( By . id ( "user_login" ));elementName . sendKeys ( "admin" );WebElement elementPassword = driver . findElement ( By . id ( "user_pass" ));elementPassword . sendKeys ( "admin" );driver . findElement ( By . id ( "wp-submit" )). click ();assertTrue ( driver . getCurrentUrl (). contains ( "admin" ));}}