2

So I noticed that selenium in many cases is so fast it doesnt catch the transitions of a menu sliding on a web application. The example below will not run unless I put a thread sleep (which I absolutely hate in my code)... Is this the only way? Here are the variables setup and the method to check if an element is present, the actual test is in the next set of code.

    private static By awayButtonLocator = By.cssSelector("button.status.away");
    private static By awayStatusIconLocator = By.cssSelector("div.info.status-away");

    private static boolean isElementPresent(By targetElement){
        Boolean isPresent = driver.findElements(targetElement).size() > 0;
        if(isPresent){
            return true;
        }else{
            return false;
        }

    }

So to clarify the @test below WORKS as intended. However the thread.sleep must be there despite the WebDriverWait of 10 seconds which I do not want. I even tried the expected condition elementToBeClickable but that didnt work and still requires the sleep to be called. So in this case I have to intentionally slow down the code just to catch the element using thread sleep??

    @Test
    public void setAway() throws Exception {
        Thread.sleep(500);
        new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(awayButtonLocator)).click();
        Assert.assertTrue(isElementPresent(awayStatusIconLocator));
    }

Trace Output:

org.openqa.selenium.NoSuchElementException: An element could not be located on the page using the given search parameters. (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 17 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: 'unknown', revision: '1969d75', time: '2016-10-18 09:43:45 -0700'
System info: host: 'Adrians-iMac.local', ip: '10.0.2.15', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.12.1', java.version: '1.8.0_111'
Driver info: org.openqa.selenium.safari.SafariDriver
Capabilities [{applicationCacheEnabled=true, rotatable=false, databaseEnabled=true, handlesAlerts=true, version=12602.2.14.0.5, cleanSession=true, platform=MAC, nativeEvents=true, locationContextEnabled=false, webStorageEnabled=true, browserName=safari, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: FE763803-D4F9-485F-A176-847A5E9911CA
*** Element info: {Using=css selector, value=div.flex-nav.section.header.div.h4}
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    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:216)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:168)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:635)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:368)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByCssSelector(RemoteWebDriver.java:465)
    at org.openqa.selenium.By$ByCssSelector.findElement(By.java:430)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:360)
    at myPackages.menuSuite.myAccountTest.checkMenuExist(myAccountTest.java:53)
    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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
GreenGiant
  • 4,930
  • 1
  • 46
  • 76
Potion
  • 785
  • 1
  • 14
  • 36
  • try with `visibilityOf`. there are a wide range of ExpectedConditions available. please evaluate and select which suits your requirements the best https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html – Naveen Kumar R B Dec 22 '16 at 06:46
  • @Naveen I just tried that right now, it doesnt work either unfortunately. Any other recommendations? – Potion Dec 23 '16 at 16:17
  • what is the exception being thrown? TImeOutException? please add stack trace. – Naveen Kumar R B Dec 25 '16 at 07:44
  • The application I am testing is a meteor app called Rocket Chat. It has a lot of menus and buttons that use js for background. Anyways to further the discussion the stack trace output – Potion Dec 27 '16 at 18:50
  • Okay added trace in the original post. – Potion Dec 27 '16 at 18:54
  • From the stack trace, observed that the error is originated from `checkMenuExist` method. refer `at myPackages.menuSuite.myAccountTest.checkMenuExist(myAccountTest.java:53)` and the cssSelector is used as follows `div.flex-nav.section.header.div.h4`. so, please share the code related to the method and relavent HTML code to identify the element. – Naveen Kumar R B Dec 28 '16 at 05:50

1 Answers1

1

I suggest that you also set the implicitlyWait timeout for your driver somewhere in the @Before hook:

 driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
Marius D.
  • 66
  • 3