Я разрабатываю тестовую платформу для некоторого модемного оборудования в 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> 
<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> 
<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> 
<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> 
<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> 
<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 ***
В идеале, что-либо, чтобы заставить страницу отображаться в конце, должно быть между тегами
<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 не сделал этого. Таким образом, вам, по-видимому, нужна защита по крайней мере в некоторых крупных браузерах, поэтому вам лучше включить его или что-то подобное.