#scripting #scripting-language #testcomplete
#сценарии #язык сценариев #тест завершен
Вопрос:
Я написал скрипт, который загружает файл из Интернета, используя URL файла. У меня есть ActiveXObject следующего типа.
var objHTTP = new ActiveXObject("MSXML2.XMLHTTP");
objHTTP.open("GET", strFileURL, false);
Это идеально работает для файлов небольшого размера, например, размер файла менее 100 МБ. Но когда я пытаюсь загрузить файл размером более 100 МБ, мой скрипт зависает. Затем я попытался,
objHTTP.open("GET", strFileURL, true);
но в этом случае мы должны реализовать функцию обратного вызова. Я не знаю, как реализовать обратный вызов, а затем использовать его. Кто-нибудь может мне помочь. Я использую TestComplete 7. Сценарий, который я написал;
var objHTTP = new ActiveXObject("MSXML2.XMLHTTP");
objHTTP.open("GET", strFileURL, true);
objHTTP.onreadystatechange = Callback;
objHTTP.send();
while((objHTTP.readyState != 4) amp;amp; (objHTTP.readyState != 'complete'))
{
Delay(100);
}
if(200 != objHTTP.Status)
{
Log.Error("The " strFileURL " file was not found." " The returned status is " objHTTP.Status);
return;
}
Я не знаю, как реализовать функцию обратного вызова. Кто-нибудь может предоставить мне реализацию?
Спасибо
Ответ №1:
Вероятно, зависание является результатом цикла while, ожидающего определенного значения свойства readyState. Если свойство никогда не получит одно из ожидаемых значений, сценарий будет работать вечно.
Я думаю, что объекту MSXML2.XMLHTTP не удается загрузить большой файл и он никогда не устанавливает readyState в одно из значений, ожидаемых вашим скриптом. Чтобы понять, что именно происходит, я бы проверил, какое значение имеет свойство по истечении очень долгого времени, которого достаточно либо для загрузки файла, либо для неудачной попытки (скажем, 2 часа). Если вы знаете, какое значение имеет свойство readyState при сбое загрузки, вы можете обработать это в скрипте, чтобы избежать зависания.
Вот и все, что касается самого зависания. Теперь о причине проблемы с загрузкой файла. Я нашел страницу, которая рассказывает о проблеме и предлагает установить более высокие таймауты — взгляните: http://edgylogic.com/blog/downloading-large-files-vbscript /
Пример приведен в VBScript, но реализовать тот же подход с помощью JScript должно быть легко. Пожалуйста, обратите внимание, что в примере используется другой COM-объект — ServerXMLHTTP. Вы можете прочитать об этом (включая отличия от XMLHTTP) здесь: http://msdn.microsoft.com/en-us/library/ms762278 (v = VS.85).aspx
Я надеюсь, что это поможет.
Комментарии:
1. О, извините, что не ответил по поводу обратного вызова. Хотя я не думаю, что использование функции обратного вызова решит проблему, использование этого подхода может помочь вам узнать значение свойства readyState, которое устанавливается при сбое загрузки. Итак, это просто: «objHTTP.onreadystatechange = OnReadyStateChange;». При этом ожидается, что функция будет объявлена в том же модуле: функция OnReadyStateChange() {/*objHTTP должна быть глобальной переменной */ Log.Message(«Состояние чтения изменено на: » objHTTP.readyState);}
2. Спасибо за ваш ответ. Проблема не в цикле while. Проблема в методе отправки, когда я отлаживал код, я обнаружил, что скрипт зависает при методе отправки. Он никогда не достигался даже в начале цикла while.
3. Хм … тогда это похоже на ошибку в компоненте. Затем я бы попробовал использовать объект ServerXMLHTTP — судя по описанию, он использует другой механизм связи, поэтому может случиться, что проблемы для него не существует. Работает ли этот компонент в вашем случае?
4. Я не проверял ServerXMLHTTP. Я проверю и обновлю. Я действительно благодарен за ваше ценное предложение.