jQuery代码的示例用法:
public static long GetLongValueViaJQuery(IWebDriver driver, string jQueryCode)
{
IJavaScriptExecutor js = driver as IJavaScriptExecutor;
return (long)js.ExecuteScript("return " + jQueryCode);
}
#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
评论
您想通过将jQuery与Selenium Webdriver一起使用来实现什么?