Speedtest.net Otomasyonunda Sunucu Seçimi Sorunu

Bu script yapay zeka kullanılarak oluşturulmuştur. Speedtest.net sitesine girince, sunucu seçimi yerine ‘tur’ yazar ve Türkiye’deki sunucular listelenir. Ancak, el ile yazınca listelenirken listeleniyor, bu script yazınca listelenmiyor. ‘tur’ yazmasa da arama kısmında gelen mevcut sunucuları test ediyor ve listenin sonuna gelince duruyor. Bu sorunu nasıl çözülür? Firefox Tampermonkey ile denenmiştir ve çalışıyor

Tampermonkey Script tıkla
// ==UserScript==
// @name         Speedtest.net Otomatik Türkiye Sunucu Testi (Geliştirilmiş Bekleme Süreleri)
// @namespace    http://tampermonkey.net/
// @version      2.7
// @description  Speedtest.net'te otomatik olarak Türkiye'deki farklı sunucularla test yapar, sonuçları kaydeder ve aynı sunucuyu tekrar test etmez. Geliştirilmiş bekleme süreleri içerir.
// @author       AI Yardımcısı
// @match        https://www.speedtest.net/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=speedtest.net
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function() {
    'use strict';

    let testedServers = GM_getValue('testedServers', []);
    const işlemBeklemeSüresi = 3000; // 3 saniye
    const testBeklemeSüresi = 5000; // 5 saniye

    async function bekle(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    async function startTest() {
        const startButton = await waitForElement('.js-start-test');
        if (startButton) {
            startButton.click();
            console.log("Test başlatıldı!");
            await bekle(işlemBeklemeSüresi); // İşlem sonrası bekleme

            await waitForElement('.result-container-speed-active', 60000);

            const downloadSpeedElement = document.querySelector('.download-speed');
            const uploadSpeedElement = document.querySelector('.upload-speed');
            const pingElement = document.querySelector('.ping-speed');
            const serverNameElement = document.querySelector('.server-current .hostUrl');

            const downloadSpeed = downloadSpeedElement ? parseFloat(downloadSpeedElement.textContent) : null;
            const uploadSpeed = uploadSpeedElement ? parseFloat(uploadSpeedElement.textContent) : null;
            const ping = pingElement ? parseInt(pingElement.textContent) : null;
            const serverName = serverNameElement ? serverNameElement.textContent : null;

            console.log(`Test Sonucu (${serverName}): İndirme: ${downloadSpeed} Mbps, Yükleme: ${uploadSpeed} Mbps, Ping: ${ping} ms`);
            return serverName;
        } else {
            console.error("Başlat butonu bulunamadı!");
            return null;
        }
    }

    async function selectNextServer() {
        await openServerModal();
        await bekle(işlemBeklemeSüresi); // İşlem sonrası bekleme
        await filterServers("tur");
        const inputElement = document.querySelector('#host-search'); // Input elementini seç
        await bekle(işlemBeklemeSüresi); // İşlem sonrası bekleme
        const serverListItems = Array.from(document.querySelectorAll('.server-hosts-list li a'));
        let nextServer = null;
        for (const serverItem of serverListItems) {
            const serverId = serverItem.getAttribute('data-server-id');
            if (!testedServers.includes(serverId)) {
                nextServer = serverItem;
                break;
            }
        }

        if (nextServer) {
            nextServer.click();
            const serverId = nextServer.getAttribute('data-server-id');
            testedServers.push(serverId);
            GM_setValue('testedServers', testedServers);
            console.log("Yeni sunucu seçildi:", nextServer.querySelector('.host-location').textContent);
            await bekle(işlemBeklemeSüresi); // İşlem sonrası bekleme
            return true;
        } else {
            console.log("Türkiye'de test edilecek başka sunucu kalmadı!");
            return false;
        }
    }

    async function openServerModal() {
        const changeServerButton = await waitForElement('.btn-server-select');
        if (changeServerButton) {
            changeServerButton.click();
            console.log("Sunucu Seçme Ekranı Açıldı");
            await bekle(işlemBeklemeSüresi); // İşlem sonrası bekleme
            await waitForElement('.server-hosts-list', 5000);
            await bekle(işlemBeklemeSüresi); // İşlem sonrası bekleme
        } else {
            console.error("Sunucu Değiştirme Butonu Bulunamadı!");
        }
    }

    async function filterServers(searchText) {
        const searchInput = await waitForElement('#host-search');
        if (searchInput) {
            searchInput.value = searchText;
            searchInput.dispatchEvent(new Event('input'));
            console.log("Sunucular Filtrelendi:", searchText);
            await bekle(işlemBeklemeSüresi); // İşlem sonrası bekleme
            await waitForElement('.server-hosts-list li a', 5000);
            await bekle(işlemBeklemeSüresi); // İşlem sonrası bekleme
        } else {
            console.error("Arama Kutusu Bulunamadı!");
        }
    }

    async function waitForElement(selector, timeout = 10000) {
      return new Promise((resolve, reject) => {
        const startTime = Date.now();
        const interval = setInterval(() => {
          const element = document.querySelector(selector);
          if (element) {
            clearInterval(interval);
            resolve(element);
          } else if (Date.now() - startTime > timeout) {
            clearInterval(interval);
            reject(new Error(`Element "${selector}" not found within ${timeout}ms`));
          }
        }, 100);
      });
    }

    async function runTests() {
        let continueTesting = true;
        while (continueTesting) {
            if (await selectNextServer()){
               const testedServer = await startTest();
            if (!testedServer)
            {
                continueTesting = false;
                break;
            }
            await bekle(testBeklemeSüresi); // Testler arasında bekleme
            } else {
                continueTesting = false;
                break;
            }
        }
        testedServers = [];
        GM_setValue('testedServers', testedServers);
        console.log("Tüm testler tamamlandı veya Türkiye'de test edilecek sunucu kalmadı. Liste Sıfırlanıyor.");
    }

    window.addEventListener('load', function() {
        setTimeout(runTests, 2000);
    });
})();

Son düzenleyen: @wise 2024-12-25T22:24:45Z

Zen browser’da Violentmonkey ile denedim, çalışıyor.

şehirleri arayıp çıkan sunucuları test etme özeliği
arma yeri sorunu hala devam ediyor

// ==UserScript==
// @name        Speedtest.net Otomatik Türkiye Sunucu Testi (Geliştirilmiş ve Hatalara Dayanıklı)
// @namespace   http://tampermonkey.net/
// @version     3.18
// @description Speedtest.net'te otomatik olarak Türkiye'deki farklı şehirlerdeki sunucularla test yapar, sonuçları kaydeder ve aynı sunucuyu tekrar test etmez. Açılır menü ile şehir seçimi yapılır.
// @author      AI Yardımcısı
// @match       https://www.speedtest.net/
// @icon        https://www.google.com/s2/favicons?sz=64&domain=speedtest.net
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_deleteValue
// @grant       GM_addStyle
// @grant       GM_download
// ==/UserScript==

(function() {
    'use strict';

    // Stil ekleme
    GM_addStyle(`
        #test-status {
            position: fixed;
            top: 10px;
            left: 10px;
            background-color: rgba(0, 0, 0, 0.7);
            color: white;
            padding: 10px;
            border-radius: 5px;
            z-index: 9999;
        }
        #reset-button {
            position: fixed;
            top: 10px;
            right: 10px;
            background-color: rgba(255, 0, 0, 0.7);
            color: white;
            padding: 10px 20px;
            border-radius: 5px;
            z-index: 9999;
            cursor: pointer;
        }
        #log-container {
            position: fixed;
            bottom: 10px;
            left: 10px;
            width: 300px;
            height: 200px;
            background-color: rgba(0, 0, 0, 0.7);
            color: white;
            padding: 10px;
            border-radius: 5px;
            overflow-y: auto;
            z-index: 9998;
        }
        #city-selector {
            position: fixed;
            top: 60px;
            left: 10px;
            background-color: rgba(0, 0, 0, 0.7);
            color: white;
            padding: 10px;
            border-radius: 5px;
            z-index: 9999;
        }
    `);

    // UI Elemanları Oluşturma
    let testStatusDiv = document.createElement('div');
    testStatusDiv.id = 'test-status';
    document.body.appendChild(testStatusDiv);

    let resetButton = document.createElement('div');
    resetButton.id = 'reset-button';
    resetButton.textContent = 'Sunucu Listesini Sıfırla';
    document.body.appendChild(resetButton);

    let logContainer = document.createElement('div');
    logContainer.id = 'log-container';
    document.body.appendChild(logContainer);

    let citySelectorDiv = document.createElement('div');
    citySelectorDiv.id = 'city-selector';
    citySelectorDiv.innerHTML = `
        <label for="city-dropdown">Şehir Seç:</label>
        <select id="city-dropdown">
            <option value="Adana">Adana</option>
            <option value="Adıyaman">Adıyaman</option>
            <option value="Afyonkarahisar">Afyonkarahisar</option>
            <option value="Ağrı">Ağrı</option>
            <option value="Amasya">Amasya</option>
            <option value="Ankara">Ankara</option>
            <option value="Antalya">Antalya</option>
            <option value="Artvin">Artvin</option>
            <option value="Aydın">Aydın</option>
            <option value="Balıkesir">Balıkesir</option>
            <option value="Bilecik">Bilecik</option>
            <option value="Bingöl">Bingöl</option>
            <option value="Bitlis">Bitlis</option>
            <option value="Bolu">Bolu</option>
            <option value="Burdur">Burdur</option>
            <option value="Bursa">Bursa</option>
            <option value="Çanakkale">Çanakkale</option>
            <option value="Çankırı">Çankırı</option>
            <option value="Çorum">Çorum</option>
            <option value="Denizli">Denizli</option>
            <option value="Diyarbakır">Diyarbakır</option>
            <option value="Edirne">Edirne</option>
            <option value="Elazığ">Elazığ</option>
            <option value="Erzincan">Erzincan</option>
            <option value="Erzurum">Erzurum</option>
            <option value="Eskişehir">Eskişehir</option>
            <option value="Gaziantep">Gaziantep</option>
            <option value="Giresun">Giresun</option>
            <option value="Gümüşhane">Gümüşhane</option>
            <option value="Hakkari">Hakkari</option>
            <option value="Hatay">Hatay</option>
            <option value="Isparta">Isparta</option>
            <option value="Mersin">Mersin</option>
            <option value="İstanbul">İstanbul</option>
            <option value="İzmir">İzmir</option>
            <option value="Kars">Kars</option>
            <option value="Kastamonu">Kastamonu</option>
            <option value="Kayseri">Kayseri</option>
            <option value="Kırklareli">Kırklareli</option>
            <option value="Kırşehir">Kırşehir</option>
            <option value="Kocaeli">Kocaeli</option>
            <option value="Konya">Konya</option>
            <option value="Kütahya">Kütahya</option>
            <option value="Malatya">Malatya</option>
            <option value="Manisa">Manisa</option>
            <option value="Kahramanmaraş">Kahramanmaraş</option>
            <option value="Mardin">Mardin</option>
            <option value="Muğla">Muğla</option>
            <option value="Muş">Muş</option>
            <option value="Nevşehir">Nevşehir</option>
            <option value="Niğde">Niğde</option>
            <option value="Ordu">Ordu</option>
            <option value="Rize">Rize</option>
            <option value="Sakarya">Sakarya</option>
            <option value="Samsun">Samsun</option>
            <option value="Siirt">Siirt</option>
            <option value="Sinop">Sinop</option>
            <option value="Sivas">Sivas</option>
            <option value="Tekirdağ">Tekirdağ</option>
            <option value="Tokat">Tokat</option>
            <option value="Trabzon">Trabzon</option>
            <option value="Tunceli">Tunceli</option>
            <option value="Şanlıurfa">Şanlıurfa</option>
            <option value="Uşak">Uşak</option>
            <option value="Van">Van</option>
            <option value="Yozgat">Yozgat</option>
            <option value="Zonguldak">Zonguldak</option>
            <option value="Aksaray">Aksaray</option>
            <option value="Bayburt">Bayburt</option>
            <option value="Karaman">Karaman</option>
            <option value="Kırıkkale">Kırıkkale</option>
            <option value="Batman">Batman</option>
            <option value="Şırnak">Şırnak</option>
            <option value="Bartın">Bartın</option>
            <option value="Ardahan">Ardahan</option>
            <option value="Iğdır">Iğdır</option>
            <option value="Yalova">Yalova</option>
            <option value="Karabük">Karabük</option>
            <option value="Kilis">Kilis</option>
            <option value="Osmaniye">Osmaniye</option>
            <option value="Düzce">Düzce</option>
        </select>
        <button id="start-tests">Testleri Başlat</button>
        <button id="start-all-tests">Tüm Şehirlerde Test Başlat</button>
    `;
    document.body.appendChild(citySelectorDiv);

    // Durum ve Log Mesajları
    const showStatus = (message) => {
        testStatusDiv.textContent = message;
    };

    const logMessage = (message) => {
        let logEntry = document.createElement('div');
        logEntry.textContent = message;
        logContainer.appendChild(logEntry);
        logContainer.scrollTop = logContainer.scrollHeight;
    };

    // Sıfırlama Butonu
    resetButton.addEventListener('click', () => {
        testedServers = [];
        GM_setValue('testedServers', testedServers);
        logMessage("Sunucu listesi sıfırlandı.");
        showStatus("Sunucu listesi sıfırlandı.");
    });

    // Test Edilen Sunucular
    let testedServers = GM_getValue('testedServers', []);
    const işlemBeklemeSüresi = 2500;
    const testBeklemeSüresi = 10000;

    // Bekleme Fonksiyonu
    async function bekle(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    // Element Bekleme Fonksiyonu
    async function waitForElement(selector, timeout = 15000) {
        return new Promise((resolve, reject) => {
            const startTime = Date.now();
            const interval = setInterval(() => {
                const element = document.querySelector(selector);
                if (element) {
                    clearInterval(interval);
                    resolve(element);
                } else if (Date.now() - startTime > timeout) {
                    clearInterval(interval);
                    reject(new Error(`Element "${selector}" not found within ${timeout}ms`));
                }
            }, 250);
        });
    }

    // Test Başlatma Fonksiyonu
    async function startTest() {
        showStatus("Test Başlatılıyor...");
        try {
            const startButton = await waitForElement('.js-start-test');
            startButton.click();
            console.log("Test başlatıldı!");
            await bekle(işlemBeklemeSüresi);

            await waitForElement('.result-container-speed-active', 90000);

            const downloadSpeed = document.querySelector('.download-speed')?.textContent || "Bulunamadı";
            const uploadSpeed = document.querySelector('.upload-speed')?.textContent || "Bulunamadı";
            const ping = document.querySelector('.ping-speed')?.textContent || "Bulunamadı";
            const serverName = document.querySelector('.server-current .hostUrl')?.textContent || "Bulunamadı";

            const resultMessage = `Test Sonucu (${serverName}): İndirme: ${downloadSpeed} Mbps, Yükleme: ${uploadSpeed} Mbps, Ping: ${ping} ms`;
            console.log(resultMessage);
            showStatus(resultMessage);
            logMessage(resultMessage);
            return serverName;
        } catch (error) {
            console.error("Test sırasında hata oluştu:", error);
            showStatus("Test sırasında hata oluştu!");
            logMessage("Test sırasında hata oluştu: " + error.message);
            return null;
        }
    }

    // Bir Sonraki Sunucuyu Seçme Fonksiyonu
    async function selectNextServer(searchText) {
        try {
            showStatus("Sunucu Seçiliyor...");
            await openServerModal();
            await bekle(işlemBeklemeSüresi);
            await filterServers(searchText);
            await bekle(işlemBeklemeSüresi * 3); // Filtreleme sonrası bekleme süresi artırıldı

            const serverListItems = Array.from(document.querySelectorAll('.server-hosts-list li a'));
            let nextServer = null;

            for (const serverItem of serverListItems) {
                const serverId = serverItem.getAttribute('data-server-id');
                if (serverId && !testedServers.includes(serverId)) {
                    nextServer = serverItem;
                    break;
                }
            }

            if (nextServer) {
                nextServer.click();
                const serverId = nextServer.getAttribute('data-server-id');
                testedServers.push(serverId);
                GM_setValue('testedServers', testedServers);
                const serverLocation = nextServer.querySelector('.host-location').textContent;
                console.log("Yeni sunucu seçildi:", serverLocation);
                showStatus("Yeni sunucu seçildi: " + serverLocation);
                logMessage("Yeni sunucu seçildi: " + serverLocation);
                await bekle(işlemBeklemeSüresi);
                return true;
            } else {
                console.log("Seçilen şehirde test edilecek başka sunucu kalmadı!");
                showStatus("Seçilen şehirde test edilecek sunucu kalmadı!");
                logMessage("Seçilen şehirde test edilecek sunucu kalmadı.");
                return false;
            }
        } catch (error) {
            console.error("Sunucu seçimi sırasında hata oluştu:", error);
            showStatus("Sunucu seçimi sırasında hata oluştu!");
            logMessage("Sunucu seçimi sırasında hata oluştu: " + error.message);
            return false;
        }
    }

    // Sunucu Seçme Modalını Açma Fonksiyonu
    async function openServerModal() {
        try {
            const changeServerButton = await waitForElement('.btn-server-select');
            changeServerButton.click();
            console.log("Sunucu Seçme Ekranı Açıldı");
            await bekle(işlemBeklemeSüresi);
            await waitForElement('.server-hosts-list', 10000);
            await bekle(işlemBeklemeSüresi);
        } catch (error) {
            console.error("Sunucu Değiştirme Butonu veya Sunucu Listesi Bulunamadı:", error);
            showStatus("Sunucu ekranı açılamadı!");
            logMessage("Sunucu ekranı açılamadı: " + error.message);
        }
    }

    // Sunucuları Filtreleme Fonksiyonu
    async function filterServers(searchText) {
        try {
            const searchInput = await waitForElement('#host-search');
            searchInput.value = '';
            searchInput.focus();
            searchInput.click(); // Arama kutusuna tıklama

            for (let char of searchText) {
                searchInput.value += char;
                searchInput.dispatchEvent(new Event('input'));
                await bekle(500); // Her harften sonra 500ms bekle

                // Enter tuşuna basma olayını tetikle
                const enterEvent = new KeyboardEvent('keydown', {
                    key: 'Enter',
                    code: 'Enter',
                    keyCode: 13,
                    charCode: 13,
                    which: 13,
                    shiftKey: false,
                    ctrlKey: false,
                    metaKey: false,
                    altKey: false
                });
                searchInput.dispatchEvent(enterEvent);
                await bekle(500); // Enter sonrası 500ms bekle
            }

            console.log("Sunucular Filtrelendi:", searchText);
            logMessage("Sunucular filtrelendi: " + searchText);

            // Liste gelene kadar beklemek için döngü
            let listLoaded = false;
            for (let i = 0; i < 20; i++) { // Maksimum 20 deneme
                await bekle(500); // Her denemede 500ms bekle
                if (document.querySelectorAll('.server-hosts-list li a').length > 0) {
                    listLoaded = true;
                    break;
                }
            }

            if (!listLoaded) {
                throw new Error("Sunucu listesi yüklenemedi!");
            }

            // Sunucu bulunup bulunmadığına bak
            const serverListItems = Array.from(document.querySelectorAll('.server-hosts-list li a'));
            const foundServer = serverListItems.some(item => item.querySelector('.host-location').textContent.toLowerCase().includes(searchText.toLowerCase()));

            if (!foundServer) {
                console.log(`"${searchText}" isimli sunucu bulunamadı. Enter tuşuna basınız...`);
                logMessage(`"${searchText}" isimli sunucu bulunamadı. Enter tuşuna basınız...`);
                alert(`"${searchText}" isimli sunucu bulunamadı. Lütfen manuel olarak enter tuşuna basınız.`);
                return false;
            }

            await bekle(işlemBeklemeSüresi);
            return true;
        } catch (error) {
            console.error("Arama Kutusu veya Sunucu Listesi Bulunamadı:", error);
            showStatus("Arama kutusu veya sunucu listesi bulunamadı!");
            logMessage("Arama kutusu veya sunucu listesi bulunamadı: " + error.message);
            return false;
        }
    }

    // Testleri Çalıştırma Fonksiyonu
    async function runTestsForCity(city) {
        try {
            showStatus(`Testler Başlatılıyor: ${city}`);
            let continueTesting = true;

            while (continueTesting) {
                if (await selectNextServer(city)) {
                    await startTest();
                    await bekle(testBeklemeSüresi);
                } else {
                    continueTesting = false;
                    break;
                }
            }

            console.log(`Seçilen şehirdeki tüm testler tamamlandı: ${city}. Liste Sıfırlanıyor.`);
            showStatus(`Seçilen şehirdeki tüm testler tamamlandı: ${city}!`);
            logMessage(`Seçilen şehirdeki tüm testler tamamlandı: ${city}.`);
        } catch (error) {
            console.error(`Test sırasında hata oluştu: ${city}`, error);
            showStatus(`Test sırasında hata oluştu: ${city}!`);
            logMessage(`Test sırasında hata oluştu: ${city}: ` + error.message);
        }
    }

    // Tüm Şehirlerde Test Başlatma Fonksiyonu
    async function runAllTests() {
        try {
            const cities = Array.from(document.querySelectorAll('#city-dropdown option')).map(option => option.value);
            for (const city of cities) {
                testedServers = []; // Her şehirdeki testlerden önce listedeki sunucuları sıfırla
                GM_setValue('testedServers', testedServers);
                if (await filterServers(city)) {
                    await runTestsForCity(city);
                } else {
                    // Sunucu bulunamadıysa, bir sonraki şehire geç
                    logMessage(`"${city}" isimli sunucu bulunamadı. Bir sonraki şehire geçiliyor...`);
                    showStatus(`"${city}" isimli sunucu bulunamadı. Bir sonraki şehire geçiliyor...`);
                }
            }
            console.log("Tüm şehirlerdeki testler tamamlandı. Liste Sıfırlanıyor.");
            showStatus("Tüm şehirlerdeki testler tamamlandı!");
            logMessage("Tüm şehirlerdeki testler tamamlandı.");
        } catch (error) {
            console.error("Test sırasında genel bir hata oluştu:", error);
            showStatus("Test sırasında genel bir hata oluştu!");
            logMessage("Test sırasında genel bir hata oluştu: " + error.message);
        }
    }

    // Test Başlatma Butonu
    document.querySelector('#start-tests').addEventListener('click', () => {
        const selectedCity = document.querySelector('#city-dropdown').value;
        runTestsForCity(selectedCity);
    });

    // Tüm Şehirlerde Test Başlatma Butonu
    document.querySelector('#start-all-tests').addEventListener('click', () => {
        runAllTests();
    });

    // Sayfa Yüklenme Eventi
    window.addEventListener('load', function() {
        setTimeout(() => {
            document.querySelector('#city-dropdown').focus();
        }, 3000);
    });
})();