Scarnox · Blog

CI'yi yeşil tutmak: uygulamanızda captcha varken

Kayıt formunuzda bir PopularCaptcha var. Uçtan uca test paketiniz ise kayıt olmak zorunda. Şimdi CI kırmızı ve cazip çözüm, test build'inde captcha'yı kapatmak; ama bu durumda test ettiğiniz akış, kullanıcılarınızın kullandığı akış olmaz.

Bundan çıkmanın birkaç yolu var. Gerçek akışı ne kadar kapsadıkları bakımından farklılar, bu yüzden testinizin cevaplamaya çalıştığı soruya uygun olanı seçin. Seçenekler en ucuzdan en gerçekçiye doğru sıralanmıştır.

Scarnox bugün PopularCaptcha'yı çözer. Diğer captcha türleri yakında geliyor; bu yüzden aşağıdaki çözme seçeneği yalnızca PopularCaptcha içindir.

1. Birim ve yerel testler için test anahtarları

Birçok captcha sağlayıcısı her zaman geçen test anahtarları yayınlar. Ortamın sizin kontrolünüzde olduğu ve yalnızca formun render edilip gönderilebildiğini görmeniz gerektiğinde bunları kullanın. Test anahtarları gerçek doğrulamayı sınamaz ve gerçek anahtarlarla dağıtılmış bir ortamı test ettiğinizde işe yaramazlar.

2. Kendi staging ortamınız için bir bypass

Bazı ekipler, captcha token'ı yerine backend'in kabul ettiği gizli bir başlık ekler. Hızlı ve ücretsizdir; ancak yalnızca testler için var olan bir kod yoludur ve tek bir yanlış yapılandırmayla üretimde de bulunabilir. Kullanacaksanız bunu bir ortam kontrolünün arkasına koyun, gizli değeri uzun ve rastgele yapın ve üretimde reddedildiğini test edin.

3. Doğrulama çağrısını taklit edin

Entegrasyon testlerinde sunucu tarafındaki doğrulama isteğini stub'layın. Bu, doğrulama başarısız olduğunda neler olduğu gibi backend mantığınızı kontrol etmek için iyidir. Ancak ön yüzün token'ı doğru gönderip göndermediği hakkında hiçbir şey söylemez; bu yüzden diğer seçeneklerden biriyle eşleştirin.

4. Staging ve duman testlerinde gerçekten çözün

Gerçek akışın uçtan uca çalıştığını kanıtlamanız gerektiğinde (gerçek anahtarlar, gerçek widget ve gerçek doğrulama) testin içinde bir çözme API'sinden token alın. Kırık bir widget entegrasyonunu yakalayabilen tek seçenek budur.

Bir Playwright yardımcısı şöyle görünür:

// Playwright test yardımcısı
export async function solveCaptcha(page) {
  const sitekey = await page.getAttribute("[data-sitekey]", "data-sitekey");
  const r = await fetch("https://api.scarnox.com/api/tasks/create", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.SCARNOX_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      captcha_type: "PopularCaptchaTaskProxyless",
      site_key: sitekey,
      site_url: page.url(),
    }),
  });
  const { errorId, solution, errorCode, errorDescription } = await r.json();
  if (errorId !== 0) throw new Error(`${errorCode}: ${errorDescription}`);

  await page.evaluate((t) => {
    document.querySelectorAll('[name="h-captcha-response"],[name="g-recaptcha-response"]')
      .forEach((el) => { el.value = t; });
  }, solution.token);
}

Bunu testte, formu göndermeden hemen önce çağırın; testin başında değil. Token yaklaşık iki dakika içinde süresi dolar ve testteki daha önceki yavaş bir adım bu süreyi tüketebilir.

Çözme sayısını en aza indirin

Her çalıştırmada kayıt olan bir paket, bir hafta içinde çok sayıda çözme yapabilir. Sayıyı düşük tutun:

Yardımcının içindeki yeniden deneme kuralları için hata yönetimi ve backoff bölümündeki politikayı kullanın.

Anahtarı repodan uzak tutun

Anahtarı SCARNOX_KEY gibi bir CI secret'ı olarak saklayın; asla test kodunda ya da fixture'larda tutmayın. Sızarsa panelden yeniden üretin. Eski anahtar hemen çalışmayı durdurur; böylece sızmış bir anahtar uzun süre çözme çalıştırmak için kullanılamaz.

CI için ayrı bir anahtar kullanın. Bir pipeline hatalı davranırsa, başka hiçbir şeye dokunmadan o anahtarı değiştirebilirsiniz.

Kendi staging ortamınızda deneyin

Hesap oluşturun ve kredi kartı gerekmeden ücretsiz deneme kredisiyle başlayın. Yardımcıyı önce tek bir duman testine bağlayın, temiz şekilde kayıt olduğunu doğrulayın ve ancak ondan sonra paketin geri kalanına ekleyin. Hacimde çözmenin maliyeti için güncel fiyatlandırmaya bakın.

Gönderimden sonra neyi doğrulamalısınız

Çözülmüş bir captcha yalnızca widget adımının çalıştığını kanıtlar. Gönderimden sonra kullanıcı için önemli olanları doğrulayın: bir sonraki sayfa yüklenir mi, başarı mesajı çıkar mı, hesap ya da sipariş veritabanınızda var mı. "Formda hata yok" noktasında duran bir test, backend'de kayıt sessizce başarısız olurken geçebilir.

Doğrulamalarınızı iş sonucuna yakın tutun. URL'yi, görünür mesajı ve testin oluşturduğu tek bir kaydı kontrol edin. Bir sonraki çalıştırmanın bilinen bir durumdan başlaması için kaydı çalıştırmanın sonunda temizleyin.

Duman testini bir zamanlamada çalıştırmak

Gerçek çözmeli duman testini, her pull request yerine bir zamanlamada çalıştırın; örneğin staging'e karşı günde bir kez. Zamanlanmış çalıştırmalar, sitenin gece yaptığı değişiklikleri yakalar; örneğin yeni bir widget sürümü ya da taşınmış bir sitekey. Her commit'e çözme harcamadan bunu yapar. Zamanlanmış çalıştırma başarısız olduğunda ekibi uyarın ve commit başına çalışan paketi daha hızlı seçeneklerde tutun.

Sonraki adımlar