Вопрос по Selenium. Как лучше сделать Elements Not present ?

Имееться Find By анотация , где елементо есть список List <WebElement> explanations.

Ищеться через xpath.

Есть вариант, когда на єкране есть етот список елементов, а есть вариант когда его нету.

Соотвественно есть отдельние тести, которие проверяют (если список есть) правильно ли он построен, нужен еще тест, которий будет проверять что списка етого на екране нету.

В DOM-е (если списка нету) html тегов нету.

Когда делать boolean isListDisplayed () {try { if (explanations.size() > 0) return true;} catch (WebDriverExceprtion e) {return false;}} то тест проходит, но только если его запускать отдельно одного.

Если же его включить в suite - то все тести которие идут за ним валяться с вот таким exception-ом:

org.openqa.selenium.WebDriverException: java.util.ArrayList cannot be cast to org.openqa.selenium.WebElement
Command duration or timeout: 277 milliseconds
Build info: version: '2.28.0', revision: '18309', time: '2012-12-11 15:53:30'
System info: os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.8.2', java.version: '1.6.0_37'
Session ID: b347b7f3-626e-48d5-b0df-01f45dc82787
Driver info: org.openqa.selenium.android.AndroidDriver
Capabilities [{platform=ANDROID, javascriptEnabled=true, acceptSslCerts=true, browserName=android, rotatable=true, locationContextEnabled=true, webdriver.remote.sessionid=b347b7f3-626e-48d5-b0df-01f45dc82787, version=16, handlesAlerts=true, browserConnectionEnabled=true, 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:187)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:533)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:302)
at org.openqa.selenium.remote.RemoteWebDriver.findElementByName(RemoteWebDriver.java:363)
at org.openqa.selenium.By$ByName.findElement(By.java:292)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:294)
at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:59)
at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:34)
at $Proxy9.clear(Unknown Source)
at com.opower.pages.enterapp.LoginPage.loginOpower(LoginPage.java:33)
at com.opower.testcase.testcategories.energyusetests.EnergyUseDetailViewCaseABPersonalTestSuite.caseAexplanationCostDifferenceMoreThan0(EnergyUseDetailViewCaseABPersonalTestSuite.java:148)
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.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:128)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1203)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1128)
at org.testng.TestNG.run(TestNG.java:1036)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.openqa.selenium.WebElement
at org.openqa.selenium.android.library.AndroidWebElement.lookupElement(AndroidWebElement.java:339)
at org.openqa.selenium.android.library.AndroidWebElement.access$1(AndroidWebElement.java:335)
at org.openqa.selenium.android.library.AndroidWebElement$FindByImpl.findElementByName(AndroidWebElement.java:289)
at org.openqa.selenium.android.library.AndroidWebDriver$AndroidFindBy.findElementByName(AndroidWebDriver.java:579)
at org.openqa.selenium.By$ByName.findElement(By.java:292)
at org.openqa.selenium.android.library.AndroidWebDriver.findElement(AndroidWebDriver.java:510)
at org.openqa.selenium.android.AndroidApkDriver.findElement(AndroidApkDriver.java:96)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at org.openqa.selenium.support.events.EventFiringWebDriver$2.invoke(EventFiringWebDriver.java:101)
at $Proxy7.findElement(Native Method)
at org.openqa.selenium.support.events.EventFiringWebDriver.findElement(EventFiringWebDriver.java:180)
at org.openqa.selenium.remote.server.handler.FindElement.call(FindElement.java:47)
at org.openqa.selenium.remote.server.handler.FindElement.call(FindElement.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at org.openqa.selenium.remote.server.DefaultSession$1.run(DefaultSession.java:167)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)

По поводу вашего Exception'a, я в Java не силён, но, кажется, ответ здесь

Тарас, так в чем вопрос, как лучше сделать такой метод или как сделать правильное приведение типов

потому, что ошибка четко говорит, что ты список пытаешься записать в переменную с типом weblement 

покажи код, где ты используешь этот метод

Если использовать библиотеку Selenide, всё очень просто:

$$(By.xpath("//bla/bla/bla")).shouldHave(size(0))

 

$$(By) возвращает коллекцию элементов. У этой коллкции есть метод shouldHave(), которым можно проверять размер и пр. 

 

См. selenide.org

Чтото делаете не так. Видно где то напутали с findElement і findElements.

Пример функции на Java:

protected boolean isElementPresent(By selector){
        if(driver.findElements(selector).size() != 0){
            return true;
        }
        else{
            return false;
        }
        
    }

прикол в том что список в переменную веб елемент не питаюсь записать, 

если запускать тест отдельно то он проходит

У меня в анотации Find By 

@Find By (how = How.Xpath, using = "bla bla")

public List <WebElement> explanations;

 

Наверное так делать нельзя, или можно ???

Ну, тогда уж так:

protected boolean isElementPresent(By selector){
  return !driver.findElements(selector).isEmpty();        
}

Да,

Спасибо. Так намного аккуратнее.

не работает в моем случае, видимо баг андроид веб драйвера

как только не находит он елемент по xpath - сразу communication error  - на простих браузерах работает Ваш approach)

Тогда можно так:

 

protected boolean isElementPresent(By selector){
  try {
    return !driver.findElements(selector).isEmpty();        
  }
  catch (WebDriverException elementNotFound) {
    return false;
  }
}