title: Getting "$ is not defined"
body: <p>I am trying to explore a feature of adding growl notifications to the tests.
  This enables the messages to be added on the screen while test execution.</p>
  
  <p>I am trying this approach by following steps specified in : <a href="http://elementalselenium.com/tips/53-growl" rel="nofollow">http://elementalselenium.com/tips/53-growl</a></p>
  
  <p>Machine: windows 10
  Selenium version : 2.53
  Browser : Firefox 49</p>
  
  <p>Below is script which i am using:</p>
  
  <pre><code>public class GrowlTest {
  
      static String JGROWL_SCRIPT = "http://cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.2.12/jquery.jgrowl.min.js";
      static String JQUERY_SCRIPT = "http://code.jquery.com/jquery-1.11.1.min.js";
      static String JGROWL_STYLE = "http://cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.2.12/jquery.jgrowl.min.css";
      static FirefoxDriver driver;
      public static void main(String [] args) throws InterruptedException
      {   
  
  
          driver =new FirefoxDriver();
          driver.manage().window().maximize();
          //waitForJStoLoad();
  
            driver.manage().deleteAllCookies();
            growlNotification(driver,"hi this is inital test..", "try");
            driver.get("http://www.amazon.com");
            Thread.sleep(10000);
            System.out.println("waiting for popup to come..");
            driver.findElement(By.xpath("//*[contains(text(),'Stay')]")).click();
            System.out.println("clicked on pop up..now waiting for notification...");
            Thread.sleep(10000);
            System.out.println("wait is completed..");
  
            growlNotification(driver,"Hi First try","first:");    
            Thread.sleep(2000);
            growlNotification(driver,"Hi second try","second:");
            Thread.sleep(2000);
            growlNotification(driver,"Hi third try","third:");
            Thread.sleep(2000);
            growlNotification(driver,"Hi fourth try","fourth:");
            Thread.sleep(2000);
            driver.quit();
  
  
          try {
              Thread.sleep(5000);
          } catch (InterruptedException e1) {
              // TODO Auto-generated catch block
              e1.printStackTrace();
          }
  
          try {
              Thread.sleep(2000);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }   
      }
      private static void growlNotification(WebDriver driver, String msg, String header) throws InterruptedException 
      {
          FirefoxDriver js=(FirefoxDriver) driver;
          js.executeScript("if (!window.jQuery) {var jquery = document.createElement('script'); jquery.type = 'text/javascript';jquery.src = 'https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js';document.getElementsByTagName('head')[0].appendChild(jquery)}");
          //TODO Add check for existing jQuery on page
          js.executeScript( "var jq = document.createElement('script'); jq.type = 'text/javascript'; jq.src = '" +
          JQUERY_SCRIPT + "'; document.getElementsByTagName('head')[0].appendChild(jq);" );
  
          js.executeScript( "$.getScript(\"" + JGROWL_SCRIPT + "\");" );
  
          js.executeScript( "var lnk = document.createElement('link'); lnk.rel = 'stylesheet'; lnk.href = '" +
          JGROWL_STYLE + "'; lnk.type = 'text/css'; document.getElementsByTagName('head')[0].appendChild(lnk);" );
          js.executeScript( "$.jGrowl('" + msg + "', { header: '" + header + "' });" );
      }
  }
  </code></pre>
  
  <p>On executing this i get below error:</p>
  
  <blockquote>
    <p>waiting for popup to come.. clicked on pop up..now waiting for
    notification... wait is completed.. Exception in thread "main"
    org.openqa.selenium.WebDriverException: $.jGrowl is not a function
    Command duration or timeout: 17 milliseconds Build info: version:
    '2.53.0', revision: '35ae25b', time: '2016-03-15 16:57:40' System
    info: host: 'mkarthik-WX-1', ip: '192.168.0.106', os.name: 'Windows
    10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_73'
    Driver info: org.openqa.selenium.firefox.FirefoxDriver Capabilities
    [{applicationCacheEnabled=true, rotatable=false, handlesAlerts=true,
    databaseEnabled=true, version=40.0, platform=WINDOWS,
    nativeEvents=false, acceptSslCerts=true, webStorageEnabled=true,
    locationContextEnabled=true, browserName=firefox,
    takesScreenshot=true, javascriptEnabled=true,
    cssSelectorsEnabled=true}] Session ID:
    8249259c-1211-4472-b52f-fc0471061816  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:422)
      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.executeScript(RemoteWebDriver.java:577)
      at com.tests.GrowlTest.growlNotification(GrowlTest.java:74)     at
    com.tests.GrowlTest.main(GrowlTest.java:38) Caused by:
    org.openqa.selenium.WebDriverException: $.jGrowl is not a function
    Build info: version: '2.53.0', revision: '35ae25b', time: '2016-03-15
    16:57:40' System info: host: 'mkarthik-WX-1', ip: '192.168.0.106',
    os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0',
    java.version: '1.8.0_73'</p>
  </blockquote>
  
  <p>However, the same script works when i execute the below code :</p>
  
  <pre><code>package com.tests;
  
  import java.util.concurrent.TimeUnit;
  
  import org.openqa.selenium.By;
  import org.openqa.selenium.JavascriptExecutor;
  import org.openqa.selenium.WebDriver;
  import org.openqa.selenium.firefox.FirefoxDriver;
  import org.openqa.selenium.support.ui.ExpectedCondition;
  import org.openqa.selenium.support.ui.WebDriverWait;
  
  import com.google.common.base.Predicate;
  
      public class GrowlTest {
  
          static String JGROWL_SCRIPT = "http://cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.2.12/jquery.jgrowl.min.js";
          static String JQUERY_SCRIPT = "http://code.jquery.com/jquery-1.11.1.min.js";
          static String JGROWL_STYLE = "http://cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.2.12/jquery.jgrowl.min.css";
          static FirefoxDriver driver;
          public static void main(String [] args) throws InterruptedException
          {   
  
  
              driver =new FirefoxDriver();
              driver.manage().window().maximize();
              //waitForJStoLoad();
  
                driver.manage().deleteAllCookies();
                growlNotification(driver,"hi this is inital test..", "try");
                driver.get("http://www.amazon.in");
                Thread.sleep(10000);
                System.out.println("waiting for popup to come..");
                driver.findElement(By.xpath("//*[contains(text(),'Stay')]")).click();
                System.out.println("clicked on pop up..now waiting for notification...");
                Thread.sleep(10000);
                System.out.println("wait is completed..");
  
                growlNotification(driver,"Hi First try","first:");    
                Thread.sleep(2000);
                growlNotification(driver,"Hi second try","second:");
                Thread.sleep(2000);
                growlNotification(driver,"Hi third try","third:");
                Thread.sleep(2000);
                growlNotification(driver,"Hi fourth try","fourth:");
                Thread.sleep(2000);
                driver.quit();
  
  
              try {
                  Thread.sleep(5000);
              } catch (InterruptedException e1) {
                  // TODO Auto-generated catch block
                  e1.printStackTrace();
              }
  
              try {
                  Thread.sleep(2000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }   
          }
          private static void growlNotification(WebDriver driver, String msg, String header) throws InterruptedException 
          {
              FirefoxDriver js=(FirefoxDriver) driver;
              js.executeScript("if (!window.jQuery) {var jquery = document.createElement('script'); jquery.type = 'text/javascript';jquery.src = 'https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js';document.getElementsByTagName('head')[0].appendChild(jquery)}");
              //TODO Add check for existing jQuery on page
              js.executeScript( "var jq = document.createElement('script'); jq.type = 'text/javascript'; jq.src = '" +
              JQUERY_SCRIPT + "'; document.getElementsByTagName('head')[0].appendChild(jq);" );
  
              js.executeScript( "$.getScript(\"" + JGROWL_SCRIPT + "\");" );
  
              js.executeScript( "var lnk = document.createElement('link'); lnk.rel = 'stylesheet'; lnk.href = '" +
              JGROWL_STYLE + "'; lnk.type = 'text/css'; document.getElementsByTagName('head')[0].appendChild(lnk);" );
              js.executeScript( "$.jGrowl('" + msg + "', { header: '" + header + "' });" );
          }
      }
  </code></pre>
  
  <p>Kindly help and suggest what needs to be done.</p>
  
  <p>Thanks and regards,
  Karthik</p>