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

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

Я пытаюсь этот подход, выполнив следующие действия, указанные в: 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, версия =40.0, платформа =WINDOWS, nativeEvents=false, acceptSslCerts=true, webStorageEnabled=true, locationContextEnabled=true, browserName true, javascriptEnabled=true, cssSelectorsEnabled=true}] Идентификатор сеанса: 8249259c-1211-4472-b52f-fc0471061816 в sun.reflect.NativeConstructorAccessorImpl.newInstance0(собственный метод) в sun.reflect.NativeConctor orImpl.newInstance(NativeConstructorAccessorImpl.java:62) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) в java.lang.reflect.Constructor.newInstance:4open.jpg.ErrorHandler.createThrowable(ErrorHandler.java:206) по адресу org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158) по адресу org.openqa.selenium.remote.RemoteWebte.RjDever.jd 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, который вы вызываете, время загрузки. Если вы посмотрите, сценарий, который вы говорите работает, имеет различные спящие режимы между операциями, которые, вероятно, позволяют загружать и обрабатывать вещи.

Другие вопросы по тегам