Использование Tampermonkey для сбора данных с нескольких страниц в новых вкладках может быть непростой задачей, особенно когда дело касается правильного ожидания загрузки страниц и извлечения данных. В вашем случае проблема, скорее всего, связана с тем, что вы не учитываете состояние новой вкладки после каждой загрузки.
Ниже приведен пример того, как можно улучшить ваш скрипт, чтобы он корректно обрабатывал загрузку страниц и собирал данные:
```javascript
// Функция для ожидания полной загрузки DOM
function waitForDOMReady(callback) {
const checkReady = () => {
if (document.readyState === "complete") {
callback();
} else {
setTimeout(checkReady, 100);
}
};
checkReady();
}
// Функция для сбора данных
function extractData() {
// Ваша логика для извлечения данных из текущей страницы
// Например:
let data = document.querySelector("selector").innerText; // замените на собственный селектор
return data;
}
// Основная функция для последовательного посещения ссылок
function visitLinksSequentially(links) {
let index = 0;
const newTab = window.open(); // открываем новую вкладку
function visitNextLink() {
if (index < links.length) {
const link = links[index];
index++;
newTab.location.href = link;
// Ждем, пока страница полностью загрузится
newTab.addEventListener('load', () => {
waitForDOMReady(() => {
// Извлекаем данные
const data = extractData();
console.log(data); // Здесь можно сохранить данные или обработать их как нужно
visitNextLink(); // Переходим к следующей ссылке
});
});
} else {
newTab.close(); // Закрываем вкладку, когда все ссылки обработаны
}
}
visitNextLink();
}
// Пример использования
const links = ["https://example.com/page1", "https://example.com/page2"]; // Ваши ссылки
visitLinksSequentially(links);
```
### Описание изменений:
1. **Логика ожидания загрузки страницы**: Мы добавили обработчик события `load` для новой вкладки, который будет ожидать, пока она полностью загрузится, прежде чем продолжать обработку.
2. **Извлечение данных**: Узлы для извлечения данных теперь помещены в отдельной функции `extractData()`, что позволит вам легко адаптировать логику извлечения в зависимости от структуры загружаемой страницы.
3. **Открытие новой вкладки**: Мы открываем новую вкладку в начале и добавляем слушателя события `load`, чтобы ожидать ее полной загрузки перед выполнением дальнейших действий.
4. **Закрытие новой вкладки**: Вкладка закроется только после обработки всех ссылок.
Теперь это должно дать вам возможность извлекать данные из каждой страницы загруженной в новой вкладке, исключив дублирование данных. Убедитесь, что вы правильно настраиваете селекторы в функции `extractData()`, чтобы получать только те данные, которые вам нужны.