"test (string)".match(/[()]/g) // [ "(", ")" ] 'chromedriver' executable needs to be in PATH. Please see https://chromedriver.chromium.org/home
main.js с простынёй последовательных синхронных инструкций. Вместо этого — куча функций наготове. И вызывать ту, другую, эту – по событиям. Нажали кнопку – вызывали f1(); получили ответ от fetch() – вызвали f2(). Array(N).fill() – распространённый вроде бы способ создать массив длиной N.fill() нужен, чтобы массив был не с пустыми слотами, а со значениями, пусть и undefined – их уже можно обходить всякими map() / reduce().