Запустите функцию селена в l oop с данными из массива - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь запустить сценарий селена в l oop для заполнения базы данных. У меня есть массив объектов с 57 позициями, и мне нужно l oop через каждый из них. Как мне сделать это в l oop, сохраняя его асинхронным? Я в основном хочу, чтобы l oop через каждый магазин проверял статус и сохранял в базу данных. Теперь проблема в том, что когда я запускаю его в l oop, он запускает асинхронный код в синхронном l oop, поэтому это проблема, потому что он не ждет, пока одна задача не завершится sh, и запускается другой.


Это одна часть моего массива. Представлена ​​в коде как магазины.


module.exports = [{ id: '1031', store: 'CANNES - LA BOCCA' },
  { id: '1009', store: 'ST ANDRÉ-LES-VERGERS' },
  { id: '1046', store: 'MARSEILLE ST MENET' },
  { id: '1071', store: 'MARIGNANE' },
  { id: '1020', store: 'IFS' },
  { id: '1032', store: 'CORMEILLES-EN-PARISIS' },
  { id: '1044', store: 'CERGY' },
  { id: '1055', store: 'HERBLAY' }];

Вот мой код

const chromeOptions = new chrome.Options().addArguments('disable-infobars', 'headless');
      const chromeDesktop = {
        prefs: {
          profile: {
            default_content_settings: {
              images: 2,
            },
            managed_default_content_settings: {
              images: 2,
            },
          },
        },
      };
      const driver = new webdriver.Builder()
        .withCapabilities(chromeDesktop)
        .forBrowser('chrome')
        .setChromeOptions(chromeOptions)
        .build();

for (let index = 0; index < Stores.length; index++) {
  (async function getStores(index) {
    setTimeout(async () => {
      try {
        await driver.get('https://www.chronodrive.com');
        await driver.manage().addCookie({
          name: 'chronoShop',
          value: `"shopId=${Stores[index].id}"`,
        });
        await driver.get('https://www.chronodrive.com');
        await driver.wait(webdriver.until.elementLocated(webdriver.By.id('layer-overlay')), 4000);
        await driver.executeScript('document.querySelector(\'#layer-overlay\').style.display = \'none\'');
        await driver.executeScript('document.querySelector(\'#layer-wrapper\').style.visibility = \'hidden\'');
        const text = await driver.findElement(webdriver.By.className('dispo--empty')).getText();
        if (text.length > 30) {
          const objA = {
            store: Stores[index].store,
            dispo: text,
            id: Stores[index].id,
            lastChecked: new Date(),
          };
          await Store.create(objA);
          console.log(text);
        } else {
          const objB = {
            store: Stores[index].store,
            dispo: `*** Pas de disponibilité dans magasin de ${Stores[index].store} ***`,
            id: Stores[index].id,
            lastChecked: new Date(),
          };
          await Store.create(objB);
          console.log(`*** Pas de disponibilité dans magasin de ${Stores[index].store} ***`);
        }
      } finally {
        await driver.quit()
      }
    }, 1000 * index);
  }(index));
}

Я использовал для функции тайм-аута временного решения, но это не является реальным решением, так как есть много факторов, которые могут повлиять на функцию.

Я читал, что могу как-то использовать функцию map и Promise.all (), но как Я делаю это? Должен ли я выполнить Promise.all () для каждой ожидающей строки кода? Кажется, это неэффективно, и писать задницу было бы больно.

Спасибо

1 Ответ

1 голос
/ 23 марта 2020
const chromeOptions = new chrome.Options().addArguments("disable-infobars", "headless");
const chromeDesktop = {
  prefs: {
    profile: {
      default_content_settings: {
        images: 2
      },
      managed_default_content_settings: {
        images: 2
      }
    }
  }
};
const driver = new webdriver.Builder()
  .withCapabilities(chromeDesktop)
  .forBrowser("chrome")
  .setChromeOptions(chromeOptions)
  .build();

async function getStores(index) {
  try {
    await driver.get("https://www.chronodrive.com");
    await driver.manage().addCookie({
      name: "chronoShop",
      value: `"shopId=${Stores[index].id}"`
    });
    await driver.get("https://www.chronodrive.com");
    await driver.wait(webdriver.until.elementLocated(webdriver.By.id("layer-overlay")), 4000);
    await driver.executeScript("document.querySelector('#layer-overlay').style.display = 'none'");
    await driver.executeScript("document.querySelector('#layer-wrapper').style.visibility = 'hidden'");
    const text = await driver.findElement(webdriver.By.className("dispo--empty")).getText();
    if (text.length > 30) {
      const objA = {
        store: Stores[index].store,
        dispo: text,
        id: Stores[index].id,
        lastChecked: new Date()
      };
      await Store.create(objA);
      console.log(text);
    } else {
      const objB = {
        store: Stores[index].store,
        dispo: `*** Pas de disponibilité dans magasin de ${Stores[index].store} ***`,
        id: Stores[index].id,
        lastChecked: new Date()
      };
      await Store.create(objB);
      console.log(`*** Pas de disponibilité dans magasin de ${Stores[index].store} ***`);
    }
  } finally {
    await driver.quit();
  }

}

(async() => {
  for (let index = 0; index < Stores.length; index++) {
    await getStores(index);
  }
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...