我有以下 anchor 标记,其中包含动态生成的参数 arg1,...,arg5 到在网络上运行的 JavaScript 函数 foo()站点端。整个相关页面中有几个这样的 anchor 标记,具有唯一的 id 值和 argN 值:
<a href="#" id="foo1234567890" onclick="javascript:foo(arg1,arg2,arg3,arg4,arg5);return false;" target="_self" title="foobarbaz"> blah </a>
我想通过循环遍历该元素的所有命中、搜索参数并将这些参数传递给 Greasemonkey 的 unsafeWindow.function(args) 来以编程方式触发 调用。foo() 函数
这是我目前编写的 Greasemonkey 脚本:
function removeAllProperties() {
var xpath = "//A[@title='foobarbaz']";
var actionNodes = document.evaluate(
xpath,
document,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
);
var total = actionNodes.snapshotLength;
for (var i=0; i < total; i++) {
var candidate = actionNodes.snapshotItem(i);
//alert(candidate.nodeName);
if (candidate.nodeName === "A") {
var onclick_value = candidate.getAttribute('onclick');
var needle = /javascript:foo\((.*)\);return false\;/;
onclick_value.match(needle);
//alert(onclick_value);
//alert(RegExp.$1);
var script_args = RegExp.$1;
if (confirm(script_args)) {
unsafeWindow.foo(script_args);
}
}
}
}
removeAllProperties();
当我安装并运行此脚本时,我收到带有参数 arg1,...,arg5 的警报。如果单击“确定”,我会在适用于 OS X 的 Google Chrome 5.0.375.125 中收到以下错误:
Uncaught TypeError: Object [object DOMWindow] has no method 'foo'
有问题的网页肯定有 foo() — 如果我点击 blah 然后 onclick 事件触发 foo( )。我只是无法通过这个 Greasemonkey 脚本让它工作。
是我使用的 unsafeWindow.function(args) 不正确,还是 Google Chrome 不支持这种触发远程 JavaScript 函数的方法?
我应该以不同的方式使用此功能,还是应该完全使用另一种方法?
感谢您的建议。
最佳答案
在 Chrome 中,您不能从用户脚本上下文访问内容页面定义的变量/函数(参见 here )。
您可以在循环中调用 candidate.onclick() 而不是调用 unsafeWindow.foo。
如果这不是你想要的,你要么必须使用类似的东西将函数调用注入(inject) DOM
var s = document.createElement("script");
s.innerHTML = "foo("+ script_args + ")";
document.body.appendChild(s);
或将 JS-uri 分配给 location:
location.assign("javascript:foo(" + script_args +");void 0");
关于javascript - Greasemonkey、Chrome 和 unsafeWindow.foo(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3400985/
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
defbar(foo)foo.nil??nil:foo.to_iend“foo.nil??nil:foo.to_i”有任何简洁的Ruby习语吗? 最佳答案 或者更短一点(如果您不希望foo为false)defbar(foo)foo.to_iiffooend 关于"foo.nil??nil:foo.to_i"的Ruby习语?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/10349
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
是否有chrome开关来抑制“外部协议(protocol)请求”?我正在使用selenium-ruby-watirwebdriver自动化应用程序。我在网上搜索了绕过此窗口和对话的解决方案:http://productforums.google.com/forum/#!topic/chrome/K22hXwRy6zQ概述了我们如何手动执行此操作。但是对于Selenium-Chrome-Ruby,我需要通过可能设置一个chrome开关(chorme开关列表:=http://src.chromium.org/svn/trunk/src/chrome/common/chrome_swit
我使用的是最新版本的Chrome(32.0.1700.107)和Chrome驱动程序(V2.8)。但是当我在Ruby中使用以下代码运行示例测试时:require'selenium-webdriver'WAIT=Selenium::WebDriver::Wait.new(timeout:100)$driver=Selenium::WebDriver.for:chrome$driver.manage.window.maximize$driver.navigate.to'https://www.google.co.in'defapps_hoverele_hover=$driver.find_
当使用rubyselenium驱动程序驱动chrome时,我得到/home/travis/.rvm/gems/ruby-2.6.2/gems/selenium-webdriver-3.141.5926/lib/selenium/webdriver/remote/response.rb:72:in`assert_ok':sessionnot创建:Chrome版本必须在70和73之间(Selenium::WebDriver::Error::SessionNotCreatedError)如何解决这个问题?降级chrome不是我想做的事。 最佳答案
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如
这是一个研究案例:......我正在尝试使用WatirRuby的API引用名为“bar”的嵌入元素。该元素由Chrome的DOM检查器显示,但我无法使用Watir的任何查找方法找到它:browser.embeds()#onlyisfoundbrowser.html.include?'bar'#=>false为什么会这样?为什么Watir不显示完整的HTML?如果我有不同框架中的元素或由Javascript初始化函数动态插入的元素,是否可以使用Watir访问它们?谢谢 最佳答案 如果元素在框架中,你必须使用这样的东西:browser.