检查我的javascript是否已加载到网站上

时间:2013-08-20 07:56:49

标签: php javascript testing web phantomjs

我之前已经问过这个问题,但似乎我被误解了,所以我决定再次询问,但这一次有很多信息:

对于懒惰的读者,我的目标是:

  

有没有办法通过PHP或Ajax检查外部网站上是否启用了javascript

详细说明:

好的,所以我的公司有很多客户,当这些客户在我们的网站上注册时,他们会被提交javascript。然后,他们可以在自己的网站上使用此script来获取一些额外的功能。

现在,客户所拥有的所有网站都存储在我们的CMS系统中(就像他们拥有的所有网站列表一样,我们都会签名)。

现在我的老板给了我以下任务:

  

我们需要一个功能,以便用户可以按下“测试”按钮,系统将测试javascript是否在他们的网站上并且没有错误地工作(即是否有另一个脚本阻止了我们的)。

现在过去几天,我一直试图在web上找到类似的案例,而且我唯一建议的是Phantomjs但是没有关于如何接近我的例子想要实现。

所以我向你提问:

  1. 是否可以检查网站是否有某个javascript。
  2. 是否可以检查javascript是否正常运行(如果控制台抛出错误)
  3. 我希望,这次我不会被误解:)如果您有任何疑问,请留言,我会尽快回复!

    幻影解决方案(由Elias发布)

    这是我的代码:

       var page = require('webpage').create();
    page.onConsoleMessage = function( message, line, srcId)
    {//show console errors for page
        console.log('Page has errors showing in console: ' + msg
            + ' (line: ' + (line || '?') + ', id: ' + srcId + ')');
    };
    page.open('http://www.marcrasmussen.com',function(status)
    {
        if (status != 'success')
        {//can't load page
            console.log('Failed to open page: ' + status);
            phantom.exit();
            return;
        }
        var reslt = page.evaluate(function()
        {
            var usesOurScript = false,
                scripts = document.querySelectorAll('script');//get all script tags
            Array.forEach.apply(scripts, [function(elem)
            {//check all loaded scripts
                  if (/jquery\.js/.js.js.test(elem.getAttribute('src')))
                {//this src attribute refers your script
                    usesOurScript = true;//set to true
                }
            }]);
            return {page: location.href, found: usesOurScript};//return its href and the use-status
        });
        //script was found? adjust message
        reslt.found = (reslt.found ? ' uses ' : ' does not use ') + 'our script!';
        console.log(reslt.page + reslt.found);//logs url does not use || uses our script
        phantom.exit();
    });
    

    当我从php运行它时,没有输出它只是一直运行:

    test.php的

    <?php echo shell_exec('phantomjs hello.js');
    
    ?>
    

3 个答案:

答案 0 :(得分:3)

我也会在这里发布。因为我是那个让你接触幻影的人,所以我认为你能解决问题的方法是公平的。 以下脚本在无头幻像浏览器中打开一个页面,记录页面在实际浏览器中产生的任何控制台消息(使用onConsoleMessage事件),如果页面无法加载,它还会记录错误,如果页面打开没有问题,它会检查该页面上的所有<script>标记,查找您的javascript文件。

var page = require('webpage').create();
page.onConsoleMessage = function( message, line, srcId)
{//show console errors for page
    console.log('Page has errors showing in console: ' + msg
                + ' (line: ' + (line || '?') + ', id: ' + srcId + ')');
};
page.open('http://www.your-url-here.org',function(status)
{
    if (status != 'success')
    {//can't load page
        console.log('Failed to open page: ' + status);
        phantom.exit();
        return;
    }
    var reslt = page.evaluate(function()
    {
        var usesOurScript = false,
        scripts = document.querySelectorAll('script');//get all script tags
        /* Array.forEach is causing errors, as it turns out...
        Array.forEach.apply(scripts, [function(elem)
        {//check all loaded scripts
            if (/yourScriptName\.js/.test(elem.getAttribute('src')))
            {//this src attribute refers your script
                usesOurScript = true;//set to true
            }
        }]);*/
        for (var i=0;i<scripts.length;i++)
        {
            if (/yourScriptName\.js/.test(scripts[i].getAttribute('src')))
            {
                return {page: location.href, found: true};
            }
        }
        return {page: location.href, found: false};
    });
    //script was found? adjust message
    reslt.found = (reslt.found ? ' uses ' : ' does not use ') + 'our script!';
    console.log(reslt.page + reslt.found);//logs url does not use || uses our script
    phantom.exit();
});

如果该文件的作用类似于jQ(创建对某个对象的全局引用),您甚至可以将其添加到page.evaluate回调中:

    var reslt = page.evaluate(function()
    {//this code will behave like it's running on the target page
        var libs = {jQuery: ($ || jQuery),
                    myLib: ourLibsGlobalName};
        return libs;
    });
    if (reslt.jQuery instanceof Object)
    {
        console.log('client uses jQ');
    }
    if (reslt.myLib instanceof Object)
    {
        console.log('client uses our lib, successfuly');//wouldn't be accessible if it contained errors
    }
    console.log(reslt.myLib);//shows full object, so you can verify it's the right one

注意:
这段代码未经过测试,我只是把它写在了我的头顶。它可能包含愚蠢的拼写错误。这不是你所有祈祷的副本可回答的答案 我相信page.evaluate回调能够返回一些内容,但是:它在加载页面的上下文中运行,并且是沙箱,因此您可能必须强制错误:

page.evaluate(function()
{
    Array.forEach(document.querySelectorAll('script'), [function(elem)
    {
        if (/yourScript\.js/.test(elem.getAttribute('src')))
        {
            throw {message: 'Script found',
                   nodeSrc: elem.getAttribute('src'),
                   pageUrl: location.href,
                   myLib  : yourGlobalVar}//<-- cf remarks on jQ-like usage
        }
    }]);
});

通过抛出这个未被捕获的自定义错误,它将最终出现在控制台中,您强制page.onConsoleMessage处理程序处理此异常。在某种程度上,如果它们导致无限循环问题发生,这可能是围绕沙箱限制的一种方式。

答案 1 :(得分:1)

是否可以检查网站是否有某个JavaScript?

你可以做两件事,我认为使用JavaScript的那件事会更容易实现。

使用PHP:

  • 从数据库中的网址中提取内容
  • 将其加载到DOMDocument并搜索代码的特定部分
  • 从该文档中提取所有外部JavaScript文件
    • 也可以获取它们并在
    • 中搜索特定的代码部分

使用JavaScript

  • 在构造函数或启动方法中实现AJAX请求
  • 发送执行脚本的当前域并将其与数据库中的列表进行比较

自托管

  • 正如在撰写此答案时所讨论的那样,这是另一种可能性,因为您的日志可以显示此脚本访问的所有页面

是否可以检查javascript是否正常运行?

这个有点复杂,因为你在运行时检查了这一点。想象一下,您的脚本用户会扩展或修改您的代码,或者只是以错误的方式使用它,或者有一些与您的代码冲突的内容。也许这个代码永远不会到达,因为它调用了一些用户交互,可能会也可能不会被触发。

一种可能性是在发生错误时向您发送AJAX请求。您可以为此目的查看window.onerror

window.onerror = function(message, url, lineNumber) {}

这将为您提供一些详细信息,您可以使用AJAX请求将其传递到服务器。

答案 2 :(得分:0)

环形交叉路口或者更简单的方法是创建一个虚拟对象定义,其名称为'your_company_name _'+ some_hash。像abc_45xcd。

//your custom js file

//BEWARE! this is global namespace. 

function abc_45xcd(){
      console.log('abc_45scd custom js is loaded');
}

单击测试按钮时,您可以尝试创建新对象

   var x = new abc_45scd();

您可以检查构造函数和类型,以检查它是否是您自己的“自定义”虚拟对象。

注意:这实际上是一个天真的解决方案,因为有些人可能会在其脚本中创建一个具有相同名称的对象。 此外,它无缘无故地污染全局命名空间。