Тайм-аут при загрузке файла - PullRequest
1 голос
/ 24 октября 2019

В моем Fixture у меня есть действие, которое начнет загружать файл с помощью браузера. Это работало очень хорошо, пока сервер не ответит напрямую.

.expect(fs.existsSync(downloadsFolder()+'/export.xml')).ok()

Но теперь у меня есть файл, который необходимо создать серверу, и, таким образом, наступит время ожидания. Я попытался расширить функцию:

.expect(fs.existsSync(downloadsFolder()+'/export.xml')).ok('War wohl nicht erfolgreich',{ timeout: 300000 })

Но результат такой же, как и при первой попытке. Я провел некоторое исследование и обнаружил:

async function CheckFileExistsWithTimeDelay(t, timeDelay, fileNameAndPath) {
    for (var i = 0; i < timeDelay; i++) {
        console.log('Waited for a total of ' + i.toString() + ' microseconds');
        await t.wait(1);
        if (fs.existsSync(fileNameAndPath)) {
            // break;
            return;
        }
    }
};

Это тоже не работает. Я думаю, что функция watch file блокирует Fs, и поэтому браузер не может загрузить файл (записать файл). Также это не работает:

        async function waitForFile (path) {
            for (let i = 0; i < 300; i++) {
                if (fs.existsSync(path))
                    return true;

                await t.wait(1000);
            }

            return fs.existsSync(path);
        }

        await t.expect(await waitForFile(downloadsFolder()+'/export.xml')).ok("War wohl nicht erfolgreich", { timeout: 300000 });

Похоже, что загрузка файла завершится неудачно, пока testcafe не будетжду некоторое время. Если файл загружен напрямую, все в порядке.

Есть ли хороший пример ожидания загруженного файла без блокировки fs?

Был запрошен, поэтому я добавляю его сюда: Строка, где testcafeполучит команду на скачивание)

        await t
            .click(Selector('button').withText('Aktionen'))
            .click(Selector('a').withText('Xml Exportieren'));

Как я уже писал. Сразу загрузка работает отлично. Пока загрузка не задерживается, это терпит неудачу. Похоже, что какой-то хук висит на файле, и поэтому хром не может загрузить.

НОВАЯ ИНФОРМАЦИЯ 1 Сервер ответит ровно через 38,7 секунды после нажатия на ссылку для скачивания. После того, как я сделаю это с testcafe, я попаду в окно браузера

error

Если я использую реальный случай, значит, я нажму на ссылку наНа физическом сайте файл скачивается хорошо через 38 секунд. Нет ошибки.

НОВАЯ ИНФОРМАЦИЯ 2 Я также попытался добавить длинный .wait (150000) к устройству и затем проверить, существует ли файл. Браузер пытался загрузить файл в фоновом режиме, ожидая в цикле .wait (150000). А также это не удалось.

Так что я думаю, что это доказательство того, что это проблема Testcafe, а не проблема узла.

1 Ответ

1 голос
/ 24 октября 2019

Вот еще один пример того, как ждать загруженный файл в тесте:

import { Selector } from 'testcafe';
import fs from 'fs';

const waitForFileDownloaded = (filePath, timeDelay) => new Promise(resolve => {
        let i = 1; 
        const intervalId = setInterval(() => {
            if (fs.existsSync(filePath)) {
                clearInterval(intervalId);
                resolve(true);
            }
            i++;
            if (i > timeDelay) {
                clearInterval(intervalId);
                resolve(false);
            }
        }, 1000);
    });

fixture `Downloading`
    .page `https://github.com/DevExpress/testcafe`;

test('Test', async t => {
    await t
        .click(Selector('a').withText('218 releases'))
        .click(Selector('a').withText('Source code'))
        .expect(await waitForFileDownloaded('c:\\Users\\username\\Downloads\\testcafe-1.6.0.zip', 60)).ok();
});

Также не могли бы вы уточнить, начался ли процесс загрузки после того, как TestCafe нажал на ссылку (например, используятолько await t.wait() с большим таймаутом)?

...