Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 默认情况下,如何从底部显示HTML文件_Javascript_Python_Html_Css - Fatal编程技术网

Javascript 默认情况下,如何从底部显示HTML文件

Javascript 默认情况下,如何从底部显示HTML文件,javascript,python,html,css,Javascript,Python,Html,Css,我正在用python为一些调制解调器硬件开发一个测试平台,并使用日志记录类生成多个测试日志。通常,日志是文本文件,每次写入日志条目时,都会在相应日志文件的末尾添加一行 我使用了一个过滤器来编写HTML格式的日志文件,例如在文件的开头有一个标题(给出标题并定义一些CSS样式),但是主文档没有封装在一组标记中,因为日志工具只能够添加到文件的末尾 由于日志的性质,我不能使用#bottom标记来标识HTML日志文件的结尾。因为文件可能会变得很长。我想强制浏览器在默认情况下显示文件的结尾 这是一个“裁决”

我正在用python为一些调制解调器硬件开发一个测试平台,并使用
日志记录
类生成多个测试日志。通常,日志是文本文件,每次写入日志条目时,都会在相应日志文件的末尾添加一行

我使用了一个过滤器来编写HTML格式的日志文件,例如在文件的开头有一个标题(给出标题并定义一些CSS样式),但是主文档没有封装在一组
标记中,因为日志工具只能够添加到文件的末尾

由于日志的性质,我不能使用
#bottom
标记来标识HTML日志文件的结尾。因为文件可能会变得很长。我想强制浏览器在默认情况下显示文件的结尾

这是一个“裁决”测试日志的示例

    <!DOCTYPE html>
    <html>
    <head>
    <title>InProgress: 130226_01_Nick_An_Example_Test</title>
    <meta http-equiv="refresh" content="60">
    <style>
    body
    {
    font-size:75%;
    font-family:verdana,arial,'sans serif';
    background-color:#FFFFF0;
    color:#000080;
    margin-left:20px;
    }
    #pass {margin-left:30px; color:darkgreen;}
    #fail {margin-left:30px; color:darkred;}
    #testIter {margin-left:30px;}
    #iterResult  {margin-left:50px;}
    #testResult  {margin-left:10px;}
    #testResPass {margin-left:10px; color:darkgreen;}
    #testResFail {margin-left:10px; color:darkred;}
    </style>
    </head>

    <p>******************************************************************************************************
    <p>Python Test Automation - myDUT : SmokeTst_PwrOn_ATCmd --> General Smoke Tests - Power On, AT Response
    <p>Testcase start: - 02/18/14 07:16:13
    <p>******************************************************************************************************
    <p>&nbsp
    <p>******************************************************************
    <p>*****  tcID: SmokeTst_PwrOn_ATCmd  -  ueID: myDUT            *****
    <p>******************************************************************
    <p>Test Case start: 02/18/14 07:16:48
    <p>*** Iteration 1  - 02/18/14 07:16:58 ***
    <p id="testIter">Test_PowerOn: 1 : UE Board(s) are alive and well ... 
    <p id="testIter">Iteration 1: PowerOn Test Successful
    <p id="testIter">RouterConfiguration (1) : Router configured and responding to AT Commands ... 
    <p id="testIter">Iteration 1: Router Setup Test Successful
    <p id="pass">Iteration 1: PASS
    <p id="testResult">Test Case finish: 02/18/14 07:20:09
    <p id="testResult">Test Case time: 00:2 min :00
    <p id="testResPass">TC overall result: *** PASS ***
    <p id="testResult">Number of iterations: 1
    <p id="testResult">Number of executed iterations: 1
    <p id="testResult">Number of failed iterations: 0
    <p id="testResult">Number of crashes: 0
    <p id="testResult">executeTestAsSubProcess: TestCase SmokeTst_PwrOn_ATCmd:myDUT ... Completed
    <p>&nbsp
    <p>***************************************************************************************
    <p>Python Test Automation - myDUT : 3G_C14_DL_UDP_2min_PwrSaveEna --> my Test Deecription
    <p>Testcase start: - 02/18/14 07:21:27
    <p>***************************************************************************************
    <p>&nbsp
    <p>**************************************************************************
    <p>*****  tcID: 3G_C14_DL_UDP_2min_PwrSaveEna  -  ueID: myDUT  *****
    <p>**************************************************************************
    <p>Test Case start: 02/18/14 07:22:02
    <p>*** Iteration 1  - 02/18/14 07:22:44 ***
    <p id="pass">Iteration 1: PASS
    <p id="iterResult">DL throughput: xxxxx.00 kbps
    <p id="iterResult">DL PHY throughput: xxxxx.00 kbps
    <p>&nbsp
    <p>*** Iteration 2  - 02/18/14 07:25:46 ***
    <p id="pass">Iteration 2: PASS
    <p id="iterResult">DL throughput: xxxxx.00 kbps
    <p id="iterResult">DL PHY throughput: xxxxx.00 kbps
    <p>&nbsp
    <p>*** Iteration 3  - 02/18/14 07:28:54 ***
Verdiction.txt:

    *** Iteration 1  - 02/18/14 07:22:44 ***
verdict.html:

    <p>*** Iteration 1  - 02/18/14 07:22:44 ***
***迭代1-02/18/14 07:22:44***
理想情况下,任何强制页面在末尾显示的内容都必须位于
标记之间,因为这是唯一“正确格式”的HTML

嗯,
head
中可以合法使用的东西之一是
脚本

script
标记中,您可以编写JavaScript来操纵页面DOM或窗口对象

在这一点上,这变得更像是一个JavaScript问题,而不是Python、HTML或CSS问题,我不确定“干净”的方法是什么,但有很多选择


首先,您可以创建所需但缺少的
#bottom
锚定,如下所示:

var anchor = document.createElement('a');
anchor.setAttribute('id', 'bottom');
document.body.appendChild(anchor);
从技术上讲,由于您没有
标记,因此无法真正访问
document.body
。同样,由于您没有
标记,浏览器在第一种情况下不应显示您的文档。实际上,每个浏览器都有一个
主体
元素,它包含
之后的所有内容,因此这将起作用


或者,您可以忘记该标记,只使用各种方法中的任何一种跳转到页面的末尾,而不是跳转到锚。例如,如果您的CSS没有禁用滚动条或类似的功能,您可以执行以下操作:

window.scrollBy(0, 1000000);

同时,您不希望此代码一直运行到页面结束。但是页面没有结尾,因为在解析
之前不存在这样的东西,并且没有

实际上,如果在本地文件中创建
window.onload
函数,它将在文件的实际末尾运行,这正是您所需要的。但是,它也可能在N秒后再次运行(其中N是特定于浏览器的超时或在HTML页面上完成之前的配置超时),甚至是在本地
文件:
URL上,显然不需要这样做。因此,您需要一些持久性标志来确保只运行一次。或者,您也可以让
onload
函数在末尾删除自身


我以您的HTML为例,添加了数百个随机的
元素,使其无法显示在屏幕上,然后在
之前添加了此元素,以测试不同浏览器上的行为:

<script>
    window.ranOnLoadOnce = false;
    window.onload = function() {
        if (!window.ranOnLoadOnce) {
            var anchor = document.createElement('a');
            anchor.setAttribute('id', 'bottom')
            document.body.appendChild(anchor);
            window.scrollBy(0, 1000000);
            window.ranOnLoadOnce = true;
        }
    };
</script>

window.ranOnLoadOnce=false;
window.onload=函数(){
如果(!window.ranOnLoadOnce){
var anchor=document.createElement('a');
setAttribute('id','bottom')
document.body.appendChild(锚定);
滚动窗口(1000000);
window.ranOnLoadOnce=true;
}
};
Safari、Chrome和Firefox都立即滚动到了最后一页,最后还出现了一个可导航的
#bottom
锚,我可以使用它。所以,这两种机制似乎都能按预期工作,但您可能至少需要使用IE进行测试


同时,如果我注释掉
ranOnLoadOnce
行,Safari会在120秒后再次滚动到末尾,Chrome会每120秒滚动一次,而Firefox不会。因此,您显然至少在一些主要浏览器上需要保护,因此您最好包括它或类似的内容。

您是否想过使用类似的模板语言?通过这种方式,您可以将数据显示逻辑与数据存储(文本文件)解耦。。感谢我编写HTML文件的原因是,提交测试的用户可以通过访问网络共享上的文件在浏览器中实时查看结果。遗憾的是,网络上不允许使用Web服务器,因此它必须是原始HTML。Jinja2非常适合,它将生成原始HTML。您将对数据的显示方式有更多的控制。@msvalkon。。。快速阅读,Jinja2将做与日志过滤器相同的工作。代码向log对象发送一个输出字符串(带参数或不带参数),log对象将其写出(在我的例子中)最多3个单独的日志,其中只有1个是HTML文件。HTML标记和样式由应用于日志处理程序的日志过滤器完成。我遇到的问题是确保HTML文件显示最新的行,而不是日志的顶部。是的,过滤器可以做到这一点,但使用Jinja或其他模板语言,您可以轻松控制数据在页面上的显示位置。例如,以最新的作为第一个来显示测试迭代,您只需反向迭代
迭代
。值得思考。我不确定日志模块是否能够以您想要的方式重新排列记录的信息。太棒了。。非常感谢。这在IE上运行得非常好(出现了一个ActiveX警告,但启用后它正是我所需要的)@NickHolt:说真的,运行嵌入式JavaScript的ActiveX警告只会滚动窗口和/或修改页面
<script>
    window.ranOnLoadOnce = false;
    window.onload = function() {
        if (!window.ranOnLoadOnce) {
            var anchor = document.createElement('a');
            anchor.setAttribute('id', 'bottom')
            document.body.appendChild(anchor);
            window.scrollBy(0, 1000000);
            window.ranOnLoadOnce = true;
        }
    };
</script>