草庐IT

javascript - Greasemonkey、Chrome 和 unsafeWindow.foo()

coder 2025-02-20 原文

我有以下 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/

有关javascript - Greasemonkey、Chrome 和 unsafeWindow.foo()的更多相关文章

  1. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  2. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将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

  3. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个: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

  4. "foo.nil? ? nil : foo.to_i"的 Ruby 习语? - 2

    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

  5. javascript - jQuery 的 jquery-1.10.2.min.map 正在触发 404(未找到) - 2

    我看到有关未找到文件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功能。修复:获取文

  6. ruby - 是否有 chrome 开关来抑制 'external protocol request' ? - 2

    是否有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

  7. ruby - 运行测试时静音 Chrome 驱动程序控制台输出 - 2

    我使用的是最新版本的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_

  8. ruby - session 未创建 : Chrome version must be between - 2

    当使用ruby​​selenium驱动程序驱动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不是我想做的事。 最佳答案

  9. ruby-on-rails - 我将 Rails3 与 tinymce 一起使用。如何呈现用户关闭浏览器javascript然后输入xss? - 2

    我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如

  10. ruby - Watir 无法找到我在 Chrome 的 DOM 检查器中看到的元素 - 2

    这是一个研究案例:......我正在尝试使用WatirRuby的API引用名为“bar”的嵌入元素。该元素由Chrome的DOM检查器显示,但我无法使用Watir的任何查找方法找到它:browser.embeds()#onlyisfoundbrowser.html.include?'bar'#=>false为什么会这样?为什么Watir不显示完整的HTML?如果我有不同框架中的元素或由Javascript初始化函数动态插入的元素,是否可以使用Watir访问它们?谢谢 最佳答案 如果元素在框架中,你必须使用这样的东西:browser.

随机推荐