2016-06-09 66 views
0

在我的一個測試用例中,我試圖找出登錄後是否顯示元素。softassert沒有被調用..只有獲得NoSuchElementException

softAssert.assertTrue(landing1PageFuncs.getSetupBtn().isDisplayed(), "Login Failed"); 
softAssert.assertAll(); 

getSetupBtn的getter方法如下

public WebElement getSetupBtn() { 
    return AppWait.waitForElement(driver, setupBtn , Constants.WAITTIME); 
} 

waitForElement功能如下

public static WebElement waitForElement(WebDriver driver, WebElement element, int timeOutInSeconds) { 
    try { 
     driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); 
     WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); 
     element = wait.until(ExpectedConditions.visibilityOf(element)); 
     driver.manage().timeouts().implicitlyWait(DEFAULT_WAIT_4_ELEMENT, TimeUnit.SECONDS); //reset implicitlyWait 
    } catch (Exception e) { 
     logger.warn(element + " not found even after waiting for: " + timeOutInSeconds + " seconds"); 
     logger.warn(e, new RuntimeException()); 
    } 
    return element; 
} 

但我所觀察到的是,isDisplayed方法從不調用。因此,軟性斷言並未被解僱。

我得到的例外如下:

org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"xpath","selector":"//*[@id='page_content_inner']/div/a[1]/div"} 
Command duration or timeout: 19 milliseconds 
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html 
Build info: version: '2.53.0', revision: '35ae25b1534ae328c771e0856c93e187490ca824', time: '2016-03-15 10:43:46' 
System info: host: 'justdial', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '3.13.0-86-generic', java.version: '1.8.0_91' 
Driver info: org.openqa.selenium.firefox.FirefoxDriver 
Capabilities [{applicationCacheEnabled=true, rotatable=false, handlesAlerts=true, databaseEnabled=true, version=46.0.1, platform=LINUX, nativeEvents=false, acceptSslCerts=true, webStorageEnabled=true, locationContextEnabled=true, browserName=firefox, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}] 
Session ID: 6b9e0607-ee41-42b8-bb58-0f7d6cc32481 
*** Element info: {Using=xpath, value=//*[@id='page_content_inner']/div/a[1]/div} 

    at sun.reflect.GeneratedConstructorAccessor13.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206) 
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678) 
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:363) 
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:500) 
    at org.openqa.selenium.By$ByXPath.findElement(By.java:361) 
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:355) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.openqa.selenium.support.events.EventFiringWebDriver$2.invoke(EventFiringWebDriver.java:103) 
    at com.sun.proxy.$Proxy9.findElement(Unknown Source) 
    at org.openqa.selenium.support.events.EventFiringWebDriver.findElement(EventFiringWebDriver.java:188) 
    at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69) 
    at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38) 
    at com.sun.proxy.$Proxy11.isDisplayed(Unknown Source) 
    at org.justdial.jdomni.functionaltests.LoginPageTests.chkLoginWithValidCred(LoginPageTests.java:38) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:643) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:820) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1128) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112) 
    at org.testng.TestRunner.privateRun(TestRunner.java:782) 
    at org.testng.TestRunner.run(TestRunner.java:632) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:366) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:268) 
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1169) 
    at org.testng.TestNG.run(TestNG.java:1064) 
    at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:74) 

我做錯了嗎?我正在尋找解決方案,直到斷言並說「登錄失敗」

任何幫助表示讚賞。

回答

1

找不到您的元素,所以無法確定isDisplayed()isDisplayed()只能在已存在且已被找到的元素上調用,這就是爲什麼您的斷言永遠不會被調用的原因。

landing1PageFuncs.getSetupBtn()在調用isDisplayed()之前會拋出異常。

如果你想看看在頁面上存在的元素,你應該使用driver.findElements(By.xpath('locator')).size > 0代替driver.findElement(By.xpath('locator').isDisplayed()

+0

但後來當該方法isDisplayed()甚至存在? –

+0

您可以使用isDisplayed()來查找存在(在DOM中)的元素是否可見。例如,當您設置某個字段值時,您希望另一個字段變得不可見,因此它不再是用戶可編輯的。你可以用isDisplayed()檢查這個。 – Mobrockers

+0

感謝您的信息..感謝它.. –