在Chrome中调试自定义用户脚本(aka Greasemonkey)的最佳方法是什么?有没有办法在开发人员工具中启用用户脚本跟踪?
我正在编写一个Chrome扩展程序,需要在加载时更改流行的网络应用程序.不幸的是,该Web应用程序的大多数UI都是在iframe中呈现的,虽然该iframe的地址与我的content_scripts匹配声明匹配,但只有顶层框架才会调用用户脚本.
问:是否有一种方法可以从Chrome内容脚本扩展程序访问iframe中呈现的HTML?如果是,我应指定哪些权限和其他清单选项?谢谢.
这是一个奇怪的具体问题.
我正在编写一个将在十个域中运行的Greasemonkey脚本.这些网站都具有相同的结构,但每个网站的域名不同.例如,脚本将在以下位置运行:
http://first-domain.com/
http://another-one.com/
http://you-get-the-point.com/
我还需要它在相同域中的其他页面上运行,因此这些域中的一个域的列表将类似于:
http://first-domain.com/admin/edit/*
http://first-domain.com/blog/*
http://first-domain.com/user/*/history
显然,如果我为所有十个域包含这三个路径,那么我需要列出30个URL作为@includes.
所以我想知道是否有办法做一些事情:
// Obviously fake code:
var list_of_sites = ["first-domain", "another-one", "you-get-the-point"];
@include http:// + list_of_sites[any] + .com/admin/edit/*
@include http:// + list_of_sites[any] + .com/blog/*
@include http:// + list_of_sites[any] + .com/user/*/history
如果这样的事情成为可能,它会将@includes 的列表从30减少到3.
这是可能的,还是我在做梦?
PS我知道我可以只@include http://first-domain.com/*使用if语句在该域内的某些路径上运行脚本的某些部分,但脚本要运行的页面数量仅占网站的2%左右,因此看起来很浪费在每个网站的每个页面上包含脚本.
自Google Chrome版本35开始,Google PlayStore外部安装的任何扩展程序的执行都会被阻止,无法通过扩展程序菜单启用.
两年前删除了非商店脚本的自动安装,但下载脚本并在扩展菜单上执行拖放操作仍允许安装,因此仍可以为Google的Chrome创建和共享脚本.但现在一切都被锁定了.
我知道这个限制不适用于dev和canary释放频道,但脚本的目的是让有足够知识的用户知道他们做了什么,而不强迫他们更改浏览器.本机支持支持在Chrome上相当有用(即使现在完全锁定),因此没有第三方插件(即:Tampermonkey)的解决方案更好.
谢谢
javascript google-chrome userscripts google-chrome-extension
例如,Facebook.com可以在我的浏览器上运行版本控制脚本,并查看我是否使用脚本运行更改的HTML代码?
是否可以使用一个脚本来完成,该脚本可以读取缓存中的HTML代码并生成某种散列标记,该标记被发送回服务器并与发送到客户端的代码进行比较?
我正在尝试将jquery-ui添加到Greasemonkey脚本中.我的完整代码test.user.js:
// ==UserScript==
// @name           Test
// @namespace      rajat.khandelwal
// @description    Test script
// @include        *
// @require        js/jquery-1.6.2.min.js
// @require        js/jquery-ui-1.8.16.custom.min.js
// @require        css/ui-darkness/jquery-ui-1.8.16.custom.css
// ==/UserScript==
alert('hi');
在当前目录中我添加了JS和CSS目录.它抛出错误说syntax error in css 
Error: syntax error
Source File: file:///C:/Users/Rajat/AppData/Roaming/Mozilla/Firefox/Profiles/poxivdqy.default/gm_scripts/test/jquery-ui-1816custom.css
Line: 13
第13行是:
.ui-helper-hidden { display: none; }
问题是什么?如何添加jquery-ui并在我的用户脚本中使用它?
我的用户脚本使用打印一些信息console.log().
这在Chrome中运行良好,但是当我在Firefox(Greasemonkey)中安装此用户脚本时,Firefox中的Web控制台无法显示任何内容.
我搜索了一个解决方案,有些人建议使用,unsafeWindow但它也没有显示任何输出.而且unsafeWindow不能用于镀铬.我甚至安装了Firebug,但没用.我该如何解决这个问题?
例如,我在Firefox中试过这个用户脚本:
// ==UserScript==
// @name        console
// ==UserScript==
console.log("hello");
Firefox Web控制台(Ctrl+ Shift+ K)未显示Firefox错误控制台中报告的所有Javascript错误.怎么改变这个?
这很烦人,因为Firefox错误控制台已被弃用,需要在Firefox配置中明确重新启用.
未在Web控制台中显示的错误示例是访问未定义对象的属性.这种异常只会杀死Javascript运行脚本,如果它没有出现在日志中,那么调试非常烦人...
var obj = undefined;
obj['whatever'];
这将在错误控制台中引发错误,但不会在Web控制台中引发错误:
/*
Exception: obj is undefined
@Scratchpad/1:11
*/
请注意,在Web控制台中检查"JS>错误",并在Web控制台配置上启用Chrome调试.
编辑:这似乎只适用于GreaseMonkey用户脚本(也是暂存器).
我正在编写一个用户脚本(greasemonkey脚本),需要将谷歌地图添加到我无法控制的网站上的页面.
我试图像这样添加脚本(在加载我尝试的其他脚本时效果很好):
var my_script = document.createElement('script');
my_script.setAttribute('src',
             'https://maps.googleapis.com/maps/api/js?key=API_KEY&sensor=false');
document.head.appendChild(my_script);
但这失败了:
Failed to execute 'write' on 'Document': It isn't possible to write into a 
document from an asynchronously-loaded external script unless it is explicitly
opened.
如何从用户脚本加载和使用maps api?
编辑:我的Chrome浏览器出现问题并与我的脚本产生冲突,无论问题来源是什么,都可以完全重新安装.如果我碰巧找出导致它的原因,我会把它包含在这里.
编辑2:只是为了让在2017年阅读此内容的人知道我没有忘记这一点,自从我之前的编辑以来我从未遇到过这个问题.
编辑3:这是2019年,到目前为止,我再也没遇到过这个问题.
我一直在学习如何创建一个简单的Chrome扩展程序,它是一个用户脚本端口.该脚本与Tampermonkey完美配合,设置run at为document-start,所有需要从头开始捕获的必要事件都被捕获.
但是,当我在Chrome扩展程序中设置相同的设置时,我发现相同的运行设置比Tampermonkey更快,导致第一个函数失败:( Uncaught TypeError: Cannot call method 'appendChild' of null.)因为它尝试将一个脚本元素附加到该head部分,该部分不存在直到0.010秒之后.
到目前为止,我的脏解决方案是使用setInterval定时器设置为10 的函数来检查是否document.head存在,然后在条件为真时继续执行代码.
有没有什么方法可以让我正确地工作,而不必诉诸setInterval或可能复制Tampermonkey的grant none选项,似乎在网页上下文中运行用户脚本?
以下是我的manifest.json文件:
{
    "manifest_version": 2,
    "content_scripts": [ {
        "js":        [ "simpleuserscript.user.js" ],
        "matches":   [ "https://www.google.com/*"],
        "run_at":    "document_start"
    } ],
    "converted_from_user_script": true,
    "description":  "Chrome extension",
    "name":         "Testing",
    "version":      "1"
}
如果Chrome将采用该afterscriptexecute事件,所有这一切都可以避免,但在此之前,我仍然坚持这一load事件.我提前感谢你提供的任何帮助.
编辑:我已经尝试了回复中的建议:使用不同的run at点,使用DOMContentLoaded和追加document.documentElement.所有都不成功,因为:1和2使脚本错过早期事件,3返回与尝试追加时相同的TypeError document.head.
脚本必须插入/运行时document.readyState = loading …
javascript google-chrome userscripts google-chrome-extension content-script
userscripts ×10
greasemonkey ×6
javascript ×5
firefox ×3
console ×1
facebook ×1
google-maps ×1
iframe ×1
jquery ×1
jquery-ui ×1
tampermonkey ×1