在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
{
@Before
public
void
setUp
()
throws
Exception
{
}
@After
public
void
tearDown
()
throws
Exception
{
}
@Test
public
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 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build 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-a95f2d84bfff
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{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
{
@Before
public
void
setUp
()
throws
Exception
{
}
@After
public
void
tearDown
()
throws
Exception
{
}
@Test
public
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"
));
}
}