如果页面尚未使用jQuery,是否可以将jQuery脚本注入页面?我们的站点中有一些页面,如果不需要它,我们不会添加jQuery,但是我正在使用它通过WebDriver自动执行页面。我不想仅针对这些页面在每个浏览器上测试我的JavaScript。

jQuery代码的示例用法:

public static long GetLongValueViaJQuery(IWebDriver driver, string jQueryCode)
{
    IJavaScriptExecutor js = driver as IJavaScriptExecutor;
    return (long)js.ExecuteScript("return " + jQueryCode);
}


评论

您想通过将jQuery与Selenium Webdriver一起使用来实现什么?

#1 楼

我还没有测试过,但理论上应该可以。您可以像这样使用javascript将新的js文件加载到内存中: jqeury的功能如上所述。

评论


除非您从与Web应用程序相同的域中加载jQuery,否则您可能会遇到以下问题:sqa.stackexchange.com/questions/2850/…。

–user246
2012年3月27日17:57

同样,我还没有测试过,但是我很确定jquery javascript库在这种情况下采用了域降低功能。确实,这可能会导致许多.js文件出现问题。

–山姆·伍兹(Sam Woods)
2012年3月28日在0:12

基本上,避免链接文件,而仅执行脚本内容,因此跨域问题将永远不在您的上下文中。

– m3nda
17年1月7日,下午5:47

#2 楼

这是一个通过WebDriver加载jQuery的脚本。我已经成功使用了一段时间了。

功能:

-不会覆盖任何现有的jQuery实例。
-不会改变被测试的DOM或污染全局命名空间
-清除自身以避免内存泄漏
-等待jQuery完全加载后再返回。 jQuery源(默认为Google CDN的1.7.2版)。
-跨浏览器兼容

脚本:

您必须将此作为字符串传递到IJavaScriptExecutor.ExecuteAsyncScript

 /** dynamically load jQuery */
(function(jqueryUrl, callback) {
    if (typeof jqueryUrl != 'string') {
        jqueryUrl = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js';
    }
    if (typeof jQuery == 'undefined') {
        var script = document.createElement('script');
        var head = document.getElementsByTagName('head')[0];
        var done = false;
        script.onload = script.onreadystatechange = (function() {
            if (!done && (!this.readyState || this.readyState == 'loaded' 
                    || this.readyState == 'complete')) {
                done = true;
                script.onload = script.onreadystatechange = null;
                head.removeChild(script);
                callback();
            }
        });
        script.src = jqueryUrl;
        head.appendChild(script);
    }
    else {
        callback();
    }
})(arguments[0], arguments[arguments.length - 1]);
 


示例用法(Java):

 import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

/**
 * An example of loading jQuery dynamically using WebDriver.
 */
public class Test {

    // its nice to keep JavaScript snippets in separate files.
    private static final String JQUERY_LOAD_SCRIPT = "resources\jQuerify.js";

    // driver
    public static void main(String[] args) throws Exception {
        WebDriver driver = new FirefoxDriver();
        driver.get("http://www.google.com");

        String jQueryLoader = readFile(JQUERY_LOAD_SCRIPT);

        // give jQuery time to load asynchronously
        driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeAsyncScript(jQueryLoader /*, http://localhost:8080/jquery-1.7.2.js */);

        // ready to rock
        js.executeScript(
            "jQuery(function($) { " +
                " $('input[name=\"q\"]').val('bada-bing').closest('form').submit(); " +
            " }); "
        );
    }

    // helper method
    private static String readFile(String file) throws IOException {
        Charset cs = Charset.forName("UTF-8");
        FileInputStream stream = new FileInputStream(file);
        try {
            Reader reader = new BufferedReader(new InputStreamReader(stream, cs));
            StringBuilder builder = new StringBuilder();
            char[] buffer = new char[8192];
            int read;
            while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
                builder.append(buffer, 0, read);
            }
            return builder.toString();
        }
        finally {
            stream.close();
        }        
    }
}
 


信用:

评论


我写的评论是链接到文件或URL,然后引发跨域问题,这不只是直接注入该文件的内容:-)

– m3nda
17年1月7日,下午5:45

#3 楼

这是我与WatiN一起使用的扩展方法。

参数Browser –是WatiN的浏览器对象。

而且,WitiN要求将JavaScript代码作为一行传递。这就是为什么您可以看到.Replace(“ \ r \ n”,“”);在代码中:

    public static void InjectJQuery(this Browser browser)
    {
        string injectjQuery2 = @"
               function loadScript(scriptUrl) 
               {
                   var head =  document.getElementsByTagName('head')[0];
                   var script = document.createElement('script');
                   script.type = 'text/javascript';
                   script.src = scriptUrl;
                   head.appendChild(script);
               }
               loadScript('https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js');
               loadScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.js');
               ".Replace("\r\n", "");

        browser.Eval(injectjQuery2);
    }


评论


干净的解决方案,我喜欢。

–山姆·伍兹(Sam Woods)
2012年3月28日在0:12

#4 楼

这是在Ruby中的工作方式:'

      # test.rb
      require 'selenium-webdriver"
      @browser = Selenium::WebDriver.for :chrome
      @browser.navigate.to "http://www.google.com"
      dir_to_jquery = Dir.pwd + '/features/support/ajax_resources'
      # jQuerify.js is the same java script posted above by Joe Coder
      jquerystring = File.open("#{dir_to_jquery}/jQuerify.js").read

      #Give time for script to load and inject jquery library dynamically
      @browser.manage.timeouts.script_timeout = 10
      @browser.execute_async_script(jquerystring)
      @browser.execute_script("jQuery(function($) { " +" $('input[name=\"q\"]').val('pradeep@seleniumframework.com').closest('form').submit(); " +" }); ");


#5 楼

我正在看到一个问题。我在执行js.executeAsyncScript(jQueryLoader);时收到“线程“主”中的异常org.openqa.selenium.WebDriverException:未定义jQuery”异常。

评论


这看起来像是帖子的评论,而不是问题的实际答案。另外,这是您要回答的一个非常老的问题。考虑进一步详细说明。

–丹·斯内尔(Dan Snell)
2014年4月5日在23:10