Как получить HTML-файл для отображения снизу по умолчанию

0

Я разрабатываю тестовую платформу для некоторого модемного оборудования в python и использую класс logging для создания нескольких тестовых журналов. Обычно журналы являются текстовыми файлами, и каждый раз, когда записывается запись в журнале, добавляется дополнительная строка в конец соответствующего файла журнала.

Я использовал фильтр для записи файла журнала в формате HTML, поэтому в начале файла есть заголовок (дающий заголовок и определение нескольких стилей CSS), но основной документ НЕ заключен в набор <body> </body> поскольку средство регистрации имеет возможность добавлять только конец файла.

Из-за характера журнала я не могу использовать тег #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 ***

В приведенном выше примере тесты все еще продолжаются, может быть 5, 10 и более, итерации для выполнения, и, как вы можете видеть, файл может стать довольно длинным. Я бы хотел, чтобы в этом случае финальная строка (*** Iteration 3... в этом случае) отображалась на экране

В идеале все, что заставляет страницу отображать в конце, должно быть между тегами <head> </head>, так как это единственный "правильно сформированный" HTML-код

Эта система работает на платформе Windows, хотя я стараюсь (где это возможно) оставаться независимой от платформы

Любая помощь очень ценится!

благодаря

+++ Обновление +++

Существует 3 файла журнала, созданных классом журнала. Где будет код: self.log.Verdict('*** Iteration %d - %s ***' %(iterCounter, self.tNow())) выход перейдет к 3 файлам с различными форматами:

detailed.txt:

    2014-02-18 07:22:44,878 - MY_LOGGER - MY_VERDICT - *** Iteration 1  - 02/18/14 07:22:44 ***

verdict.txt:

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

verdict.html:

    <p>*** Iteration 1  - 02/18/14 07:22:44 ***
  • 0
    Хотели ли вы использовать язык шаблонов, такой как Jinja2 ? Таким образом, вы можете отделить логику отображения данных от хранилища данных (вашего текстового файла).
  • 0
    У меня не было, но я посмотрю ... спасибо. Причина, по которой я пишу HTML-файл, заключается в том, что пользователи, отправляющие тесты, могут видеть результаты в реальном времени в своем браузере, получая доступ к файлу на сетевом ресурсе. К сожалению, в сети запрещен веб-сервер, поэтому он должен быть необработанным HTML.
Показать ещё 5 комментариев

1 ответ

1
Лучший ответ

В идеале, что-либо, чтобы заставить страницу отображаться в конце, должно быть между тегами <head> </head>, так как это единственный "правильно сформированный" HTML.

Ну, одна из вещей, которые юридически могут пойти в head - это script.

И внутри тега script вы можете написать JavaScript, который управляет страницей DOM или объектом окна.

На данный момент это становится скорее вопросом JavaScript, чем вопросом Python, HTML или CSS, и я не уверен, что это "чистый" способ сделать это, но есть ряд вариантов.


Во-первых, вы можете создать желаемый, но отсутствующий якорь #bottom следующим образом:

var anchor = document.createElement('a');
anchor.setAttribute('id', 'bottom');
document.body.appendChild(anchor);

Технически, поскольку у вас нет <body>, вы действительно не можете получить доступ к document.body. Опять же, поскольку у вас нет <body>, браузер не должен отображать ваш документ в первом случае. Практически каждый браузер будет иметь элемент body который включает в себя все после </head>, так что это будет работать.


Кроме того, вы можете забыть об этом теге и просто использовать любой из различных методов, чтобы перейти к концу страницы, а не прыгать на якорь. Например, если ваш CSS не отключает полосу прокрутки или что-то в этом роде, вы можете просто сделать:

window.scrollBy(0, 1000000);

Между тем, вы не хотите, чтобы этот код работал до конца страницы. Но нет конца страницы, потому что не существует такой вещи до тех пор, пока </html> будет разбираться, и нет </html>.

Практически, если вы создаете функцию window.onload в локальном файле, она будет запущена в фактическом конце файла, что именно то, что вы хотите. Тем не менее, он также может быть запущен во второй раз через N секунд (где N - некоторое время, зависящее от браузера или время ожидания конфигурации, прежде чем отказаться от HTML-страницы, когда-либо заканчивающейся) - даже в локальном file: URL, где, очевидно, нет необходимости в таком вещь. Таким образом, вам понадобится некоторый постоянный флаг, чтобы убедиться, что вы запускаете только один раз. Или, альтернативно, вы можете просто onload функцию onload в конце.


Я взял ваш пример HTML, добавил несколько сотен случайных элементов <p> чтобы он не поместился на экране, а затем добавил это прямо перед </head>, чтобы проверить поведение в разных браузерах:

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

Safari, Chrome и Firefox все сразу прокручивались до последней страницы, а также заканчивались судоходным якорем #bottom который я мог бы использовать. Таким образом, любой механизм работает так, как ожидалось, но вы, вероятно, захотите проверить хотя бы IE.

Между тем, если я прокомментировал строки ranOnLoadOnce, Safari прокручивается до конца через 120 секунд, а Chrome ranOnLoadOnce это каждые 120 секунд, в то время как Firefox не сделал этого. Таким образом, вам, по-видимому, нужна защита по крайней мере в некоторых крупных браузерах, поэтому вам лучше включить его или что-то подобное.

  • 0
    Фантастика! .. благодарю вас! Это отлично работает в IE (придумали предупреждение ActiveX, но при включении это было именно то, что мне нужно)
  • 0
    @NickHolt: Серьезно, предупреждение ActiveX для запуска встроенного JavaScript, который не делает ничего, кроме прокрутки окна и / или изменения DOM? Сумасшедший ... Но пока он работает, нет необходимости отлаживать его. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню