Получение «$ не определено»

#java #jquery #selenium #firefox #jgrowl

#java #jquery #селен #firefox #jgrowl

Вопрос:

Я пытаюсь изучить возможность добавления уведомлений growl в тесты. Это позволяет добавлять сообщения на экран во время выполнения теста.

Я пытаюсь использовать этот подход, выполнив следующие шаги, указанные в: http://elementalselenium.com/tips/53-growl

Компьютер: Windows 10 Версия Selenium: 2.53 Браузер: Firefox 49

Ниже приведен скрипт, который я использую:

 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   "' });" );
    }
}
  

При выполнении этого я получаю сообщение об ошибке ниже:

ожидание появления всплывающего окна .. нажал на всплывающее окно .. теперь жду уведомления… ожидание завершено.. Исключение в потоке «main» org.openqa.selenium.Исключение WebDriverException: $.jGrowl не является функцией Длительность команды или время ожидания: 17 миллисекунд Информация о сборке: версия: ‘2.53.0’, редакция: ’35ae25b’, время: ‘2016-03-15 16:57:40’ Информация о системе: хост: ‘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» Информация о драйвере: org.openqa.selenium.firefox.Возможности FirefoxDriver [{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}] Идентификатор сеанса: 8249259c-1211-4472- b52f-fc0471061816 в sun.reflect.NativeConstructorAccessorImpl.newInstance0(собственный метод) в sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) в sun.подумайте.Делегирование constructoraccessorimpl.newInstance(делегирование constructoraccessorimpl.java:45) в java.lang.reflect.Конструктор.Новый экземпляр (Constructor.java:422) в org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206) в org.openqa.selenium.remote.Ошибка обработчика ошибок.throwIfResponseFailed(ErrorHandler.java:158) в org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678) в org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:577) в com.tests.GrowlTest.growlNotification(GrowlTest.java:74) в com.tests.GrowlTest.main(GrowlTest.java:38) Вызвано: org.openqa.selenium.Исключение WebDriverException: $.jGrowl не является функцией Информация о сборке: версия: ‘2.53.0’, редакция: ’35ae25b’, время: ‘2016-03-15 16:57:40’ Информация о системе: хост: ‘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’

Однако тот же сценарий работает, когда я выполняю приведенный ниже код :

 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   "' });" );
        }
    }
  

Пожалуйста, помогите и предложите, что нужно сделать.

Спасибо и с уважением, Картик

Ответ №1:

Мое лучшее предположение заключается в том, что вам нужно немного поспать между вызовами js.executeScript(), чтобы предоставить javascript, который вы вызываете, время для загрузки. Если вы посмотрите, сценарий, который, по вашим словам, работает, имеет множество переходов между операциями, что, вероятно, позволяет загружать и обрабатывать данные.

Комментарии:

1. Нет… пробовал с тем же code..it не работает, получая ту же ошибку: Исключение в потоке «main» org.openqa.selenium. Исключение WebDriverException: $.jGrowl не является командой функции длительность или время ожидания: 16 миллисекунд Информация о сборке: версия: ‘2.53.0’, редакция: ’35ae25b’, время: ‘2016-03-15 16:57:40’

2. я добавил необходимые файлы 1)<script src=» ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js » type=»text/javascript»></script> 2)<script src=» cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.2.12/… » type=»text/javascript»></script> 3)<link type=»text/css» href=» cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.2.12/… » rel=»stylesheet»> Он отлично работает, когда я пытаюсь использовать $.jGrowl (‘hi’) в консоли. Но при выполнении через java-программу я получаю «$ is not defined» @stanlemon