Selenium Login CAPTCHA Otomatik Çözümü (IntelliJ IDEA)

Herkese Merhabalar, Selenium ile yazılarıma devam ediyorum. Bir önceki yazımda Selenium nedir ve Intellij IDEA ile kurulumu nasıl yapılır konularına yer verdim. Bu yazımda ise Selenium da otomatik testleri nasıl yazdığımızı basit bir login sayfası üzerinden anlatmaya çalışacağım. Ayrıca toplama işlemini içeren Captcha ‘ları otomatik olarak nasıl çözümleyebileceğimize de yer vereceğim.

Haydi başlayalım..

Test edeceğimiz giriş sayfasının yapısı aşağıdaki görselde yer aldığı şekilde olacaktır. Sayfada Kullanıcı Adı , Şifre , Captcha ve Giriş Butonu bulunmaktadır.

İlk olarak Intellij IDEA src > test >java klasörü içerisinde yeni bir Java Class tanımlayarak başlayalım. Ben bu yazı için “Deneme ” adında bir class tanımladım. Testlerimi bir önceki yazımda da belirtiğim gibi Chrome Driver üzerinden çalıştıracağım. Bu aşamada iken kesinlikle hata yapmamanız gereken husus, projeye kök dizinine eklemiş olduğumuz driver nesnesine ait pathin doğru olmasıdır.

Bu aşamadan sonra test edeceğiniz web sayfasının url bilgisini kodda yer alan aşağıdaki alanlara yazmalısınız.

    driver.navigate().to("https://...");
    driver.get("https://...");

Test edilecek sayfada yer alan elementler için Chrome Web Browser tarayıcısında sağ tıklayıp “İncele” seçeneği seçilir. Elements alanından ilgili input alanlarına veya butonlara ait id bilgisi alınır.

Eğer element bir input alanı ise , örneğin kullanıcı adı alanına otomatik olarak “admin” yazabilmek için aşağıdaki kod satırı eklenmelidir. İlk olarak Elements kısmından kullanıcı adı alanının id bilgisi bulunur ardından yazılacak text ifadesi sendkeys kısmına yazılır.

driver.findElement(By.id("kullanici_adi")).sendKeys("admin");
public class Deneme{

    public  WebDriver driver = new ChromeDriver();

    @Test
    public void Giris_Sayfasi () throws Exception {

        System.setProperty("webdriver.chrome.driver","chromedriver.exe");
        driver.manage().window().maximize();
        driver.navigate().to("https://...");
        driver.get("https://...");

        driver.findElement(By.id("kullanici_adi")).sendKeys("admin");
        driver.findElement(By.id("sifre")).sendKeys("123");
    }
}

Evet yukarıdaki class içerisinde tanımlı Giris_Sayfasi() fonksiyonunda ilk olarak sayfa Chrome browser da açıldı. Ardından Kullanıcı Adı alanına “admin” , şifre alanına ise “123” ifadeleri yazıldı.

Bundan sonraki adımda Captcha çözümlemesi yapacağız. Biliyorsunuz ki otomatik testleri yazarken giriş sayfalarında yer alan Captcha ‘ lar otomatikleştirmede sıkıntılara neden oluyor. Bu yazıda örnek olarak vereceğim Captcha basit toplama işlemini içeriyor. Sayfa her yinelendiğinde veya Captcha görseline her basıldığında random olarak yeni bir toplama ifadesi ekrana gelmektedir.

Yukarıda yer alan Giris_Sayfasi() fonksiyonuna ek olarak aşağıdaki kod satırlarını ekleyerek otomatik testimiz her çalıştığında Captcha ‘nın otomatik olarak hesaplanmasını sağlayacağız.

//Elementin ekran görüntüsünü alma 
WebElement ele = driver.findElement(By.id("captcha"));
File source = ((TakesScreenshot)ele).getScreenshotAs(OutputType.FILE);

FileHandler.copy(source,new File("C:\\Users\\CASPER\\IdeaProjects\\test\\Screenshots\\resim.png"));

sleep(3000);

//Local de yer alan bir görsel içerisinde ki metinleri string olarak tanımlama adımları :

tesseract.TessBaseAPI instance = new tesseract.TessBaseAPI();
instance.Init("C://Users//CASPER//IdeaProjects//seleniumtest//tessdata","eng");


lept.PIX image = lept.pixRead("C:\\Users\\CASPER\\IdeaProjects\\test\\Screenshots\\resim.png");
instance.SetImage(image);
BytePointer bytePointer = instance.GetUTF8Text();
String output = bytePointer.getString();
System.out.println(output);


//Text içeriğine alınan a+b=? ifadesi parçalanarak önce a ve b sayılarına dönüştürülür. Ardından toplam sonuç captcha alanına yazdırılır.
String[] captcha = output.split("[+]");

int captchalen = captcha.length-1;


String toplamifadesi ="";
for(int i=0; i< captchalen; i++) {

    int sayı1 = Integer.parseInt(captcha[i]) ;
    String[] x = captcha[i+1].split("=");
    int xlen = x.length-1;
    for (int j=0; j< xlen; j++){
        int sayı2=Integer.parseInt(x[j]);
        System.out.println(sayı1);
        System.out.println(sayı2);
        int  toplam = sayı1+sayı2;
        toplamifadesi = Integer.toString(toplam);
        System.out.println("captcha :" + toplamifadesi);
    }


}

Yukarıdaki kodda ilk olarak Captcha elementinin ekran görüntüsünü alıp , lokale kaydedeceğiz. Bir elementin ekran görüntüsünü alıp , lokale kaydedebilmek için aşağıdaki kod satırını ekledik.

WebElement ele = driver.findElement(By.id("captcha"));
File source = ((TakesScreenshot)ele).getScreenshotAs(OutputType.FILE);
FileHandler.copy(source,new File("C:\\Users\\CASPER\\IdeaProjects\\test\\Screenshots\\resim.png"));

Ardından aşağıdaki kod satırı ile görsel içerisinde yer alan text ifadelerini string ‘ e dönüştüreceğiz.

Bu aşama için ilk olarak https://github.com/tesseract-ocr/tessdata/blob/master/eng.traineddata adresinde yer alan içerik indirilir ve tessdata adında bir klasör oluşturularak içerisine eklenir.

Ayrıca POM.xml içeriği de aşağıdaki eklentiler yazılarak güncellenir.

https://mvnrepository.com/artifact/ru.yandex.qatools.ashot/ashot –>

   <dependency>

     <groupId>ru.yandex.qatools.ashot</groupId>

     <artifactId>ashot</artifactId>

     <version>1.5.4</version>

   </dependency>

   <!– https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java –>

   <dependency>

     <groupId>org.seleniumhq.selenium</groupId>

     <artifactId>selenium-java</artifactId>

     <version>3.141.59</version>

   </dependency>

   <!– https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j –>

   <dependency>

     <groupId>net.sourceforge.tess4j</groupId>

     <artifactId>tess4j</artifactId>

     <version>4.5.3</version>

   </dependency>

   <!– https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/tesseract –>

   <dependency>

     <groupId>org.bytedeco.javacpp-presets</groupId>

     <artifactId>tesseract</artifactId>

     <version>3.04-1.1</version>

   </dependency>

   <!– https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-remote-driver –>

   <dependency>

     <groupId>org.seleniumhq.selenium</groupId>

     <artifactId>selenium-remote-driver</artifactId>

     <version>3.141.59</version>

   </dependency>

tesseract.TessBaseAPI instance = new tesseract.TessBaseAPI();
instance.Init("C://Users//CASPER//IdeaProjects//seleniumtest//tessdata","eng");


lept.PIX image = lept.pixRead("C:\\Users\\CASPER\\IdeaProjects\\test\\Screenshots\\resim.png");
instance.SetImage(image);
BytePointer bytePointer = instance.GetUTF8Text();
String output = bytePointer.getString();
System.out.println(output);

Bu aşamadan sonra kod içerisinde output olarak tanımlanan ” a+b=?” text içeriği parçalanarak a ve b sayılarına ardından da toplam ifadesi elde edilerek sayfada yer alan Captcha alanına yazılmalıdır.

//Text içeriğine alınan a+b=? ifadesi parçalanarak önce a ve b sayılarına dönüştürülür. Ardından toplam sonuç captcha alanına yazdırılır.
String[] captcha = output.split("[+]");

int captchalen = captcha.length-1;


String toplamifadesi ="";
for(int i=0; i< captchalen; i++) {

int sayı1 = Integer.parseInt(captcha[i]) ;
String[] x = captcha[i+1].split("=");
int xlen = x.length-1;
for (int j=0; j< xlen; j++){
int sayı2=Integer.parseInt(x[j]);
System.out.println(sayı1);
System.out.println(sayı2);
int toplam = sayı1+sayı2;
toplamifadesi = Integer.toString(toplam);
System.out.println("captcha :" + toplamifadesi);

Ve giriş işleminin gerçekleştirilebilmesi için gerekli son adım ise ; toplamifadesi değişkeninin Captcha alanına yazdırılması ve giriş butonuna tıklanmasıdır. Bunun için aşağıdaki kod satırları da eklenir.

driver.findElement(By.id("captcha")).sendKeys(toplamifadesi);

driver.findElement(By.cssSelector("#giris_button")).click();

Bu aşama ile beraber Giris_Sayfasi() fonksiyonuna ait kodlamalar tamamlanış oldu. Artık ilgili web giriş sayfası fonksiyon her çalıştırıldığında otomatik olarak kullanıcı adı , şifre ve Captcha ‘ yı girecek ve giriş butonuna basacaktır.

Giris_Sayfasi() fonksiyonuna ait kodlara buradan ulaşabilirsiniz.

Umuyorum yararlı bir yazı olmuştur. Bir sonraki yazımda görüşmek üzere..

                         Emine Aktürk

Yorum bırakın