как заставить транспортир JavaScript ждать завершения чтения файла?

#javascript #protractor

Вопрос:

Я поместил URL-адрес тестируемого приложения в текстовый файл, поэтому я хотел бы, чтобы выполнение транспортира подождало без использования метода «Sleep ()», пока он не закончит чтение, чтобы Protactor мог запустить браузер на веб-сайт, используя текст из файла. Но до сих пор транспортир работает так быстро, что ему не удается получить текст из файла, поэтому он не может открыть веб-сайт в Chrome

 function retrieveAppURL(){
    const fs = require('fs')
    var data = null;

    fs.readFile("appURL.txt", (err, text) => {
        if (err){
            console.log("error "   err);
        }
        else
        {
            console.log("text file data = "   text.toString());
            data = text.toString();
        }
    });

    return data;
}

function launchAppURL(){
        var data = retrieveAppURL();

        browser.get(data );
        browser.waitForAngularEnabled(false);
    } catch (err) {
        console.log("exception "   err.message);    
    }
}
 

Ответ №1:

Я сделал для вас решение, оно получает URL-адрес из файла и открывает ссылку в браузере. Все мое решение для вас приведено ниже.

url-spec.js

 describe('Open an URL from a text file', function() {
  async function retrieveAppURL(){
    const fs = require('fs')

    return browser.wait(async function () {
      return new Promise((resolve, reject) => {
        fs.readFile("appURL.txt", (err, text) => {
          if (err){
            console.log("error "   err);
          }
          else
          {
            console.log("text file data = "   text.toString());
            resolve(text.toString())
          }
        });
      })
    }, 10000, "File has not been read within 10 seconds")
  }

  async function launchAppURL(){
    try{
      const data = await retrieveAppURL();
      await browser.get(data);
      // sleep for 5 sec to see the result
      await browser.sleep(5000);
    } catch (err) {
      console.log("exception "   err.message);
    }
  }
  it('should add a todo', function() {
    launchAppURL();
  });
});
 

conf.js

 exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['url-spec.js']
};
 

appURL.txt

 https://google.com
 

Запустите его с помощью protractor conf.js

Пожалуйста, не забудьте установить fs и транспортир для проекта. Это работает очень быстро. Я просто запускаю protractor conf.js , и он открывает URL — адрес в браузере для меня.

Ответ №2:

Вы можете использовать browser.wait (), который будет ждать, пока файл будет прочитан таким образом.

 await browser.wait(async function () {
    return fs.readFile("appURL.txt", (err, text) => {
        if (err){
            console.log("error "   err);
        }
        else
        {
            console.log("text file data = "   text.toString());
            data = text.toString();
        }
    });
}, 30*1000, "File has not been read within 30 seconds")
 

Комментарии:

1. в нем говорится об ошибке тайм-аута через 30 секунд. и он вызывает «browser.get ()», но значение данных равно нулю. В текстовом файле есть только одна строка «www.google.com»

2. знаете ли вы, как я могу избавиться от ошибки тайм-аута с помощью вашего решения кода выше?

3. Я опубликовал другое решение, которое решает вашу проблему. В нем нет никаких ошибок тайм-аута. 🙂

4. Я также добавил немного асинхронности/ожидания в код, чтобы сделать его асинхронным

5. классно! Спасибо. Я посмотрю. Я ценю ваше время и усилия.