entities.GPTPlanet.java Source code

Java tutorial

Introduction

Here is the source code for entities.GPTPlanet.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package entities;

import interfaces.CTP;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Point;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.UnhandledAlertException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.sikuli.api.ImageTarget;
import org.sikuli.api.ScreenRegion;
import org.sikuli.api.StaticImageScreenRegion;
import utilities.Helper;

/**
 *
 * @author Rypon
 */
public class GPTPlanet implements CTP {

    private WebDriver driver;
    private String homeUrl = "http://www.gptplanet.com/";
    private String advertismentPageUrl;
    private String currentWindow;
    private Helper helper;
    private String username;
    private String password;
    private JTextArea logger;

    public GPTPlanet(WebDriver driver) {
        this.driver = driver;
    }

    public GPTPlanet(WebDriver driver, String username, String password) {
        this.driver = driver;
        this.username = username;
        this.password = password;
    }

    public GPTPlanet(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public String getHomeUrl() {
        return this.homeUrl;
    }

    @Override
    public void setHomeUrl(String homeUrl) {
        this.homeUrl = homeUrl;
    }

    @Override
    public String getAdvertismentPageUrl() {
        return this.advertismentPageUrl;
    }

    @Override
    public void setAdvertismentPageUrl(String advertismentPageUrl) {
        this.advertismentPageUrl = advertismentPageUrl;
    }

    @Override
    public String getUsername() {
        return this.username;
    }

    @Override
    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String getPassword() {
        return this.password;
    }

    @Override
    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public void setDriver(WebDriver driver) {
        this.driver = driver;
        driver.manage().window().setSize(new Dimension(400, 300));
    }

    private String getCurrentWindow() {
        if (this.currentWindow == null) {
            this.currentWindow = driver.getWindowHandle();
        }
        return this.currentWindow;
    }

    private Helper getHelper() {
        if (this.helper == null) {
            this.helper = new Helper(driver);
        }
        return this.helper;
    }

    private void appendLog(String log) {
        if (logger == null) {
            System.out.println("No logger available for:\n\t" + homeUrl + "\n\t" + username + " - " + password);
        } else {
            logger.append("\n" + log);
        }
    }

    @Override
    public void login() {
        login(username, password);
    }

    @Override
    public void login(String username, String pwd) {
        String captcha = "";
        driver.get(homeUrl);

        boolean correct = false;
        while (!correct) {
            if (driver.findElements(By.linkText("Login")).size() > 0
                    && driver.findElements(By.id("l2loader2loginform")).size() < 1) {
                appendLog("--- Logging in.... ---");
                driver.findElement(By.linkText("Login")).click();
                driver.findElement(By.xpath("//*[@id=\"loginform\"]/table/tbody/tr[1]/td[2]/input"))
                        .sendKeys(username);
                driver.findElement(By.xpath("//*[@id=\"loginform\"]/table/tbody/tr[2]/td[2]/input")).sendKeys(pwd);
                if (driver.findElements(By.id("captcha_login")).size() > 0) {
                    if (driver.findElement(By.id("captcha_login")).isDisplayed()) {
                        captcha = JOptionPane.showInputDialog("Captcha for " + homeUrl);
                        driver.findElement(By.id("captcha_login")).sendKeys(captcha);
                    }
                }
                driver.findElement(By.xpath("//*[@id=\"loginform\"]/table/tbody/tr[5]/td[2]/input")).click();
                while (driver.findElements(By.id("l2loader2loginform")).size() > 0) {
                    try {
                        //                        if (driver.findElement(By.id("l2loader2loginform")).isDisplayed()) {
                        Thread.sleep(3000);
                        //                        }
                    } catch (InterruptedException ex) {
                        Logger.getLogger(ScarletClicks.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (Exception e) {
                        Logger.getLogger(ScarletClicks.class.getName()).log(Level.SEVERE, null, e);
                    }

                }
            }
            while (driver.findElements(By.id("progress")).size() > 0) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(ScarletClicks.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (driver.findElements(By.linkText("Logout")).size() > 0) {
                correct = true;
                appendLog("--- Logged in ---");
            }
        }
        this.advertismentPageUrl = driver.findElement(By.linkText("VIEW ADS")).getAttribute("href");
        appendLog("home: " + homeUrl);
        appendLog("ads page: " + advertismentPageUrl);
        appendLog("-----");
    }

    private void openAdsPage() {
        appendLog("--- Opening Ads page.... ---");
        getHelper().cleanupWindows(getCurrentWindow());
        while (!driver.getCurrentUrl().equals(this.advertismentPageUrl)) {
            appendLog("Opening Ads page \n\t" + advertismentPageUrl + "\nbut another page is opening\n\t"
                    + driver.getCurrentUrl());
            driver.get(advertismentPageUrl);
        }
        appendLog("--- Ads Page opened ---");
    }

    private ArrayList getAllAds() {
        openAdsPage();
        ArrayList<String> links = new ArrayList<String>();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Neobux.class.getName()).log(Level.SEVERE, null, ex);
        }

        String[] target = { "//div[contains(@class,'ad-block')]" };
        for (String str : target) {
            for (WebElement e : driver.findElements(By.xpath(str))) {
                if (getHelper().isAdAvailable(e)) {
                    links.add(e.findElement(By.xpath("./div[@class='ad-title']/span")).getAttribute("onclick")
                            .split("'")[1]);
                }
            }
        }
        appendLog("--- Checking Ads.... --- \nAvailable Ads: " + links.size() + "\n-----");
        return links;
    }

    @Override
    public void openAd() {
        openAdsPage();
        ArrayList<String> links = getAllAds();
        for (String link : links) {
            int timeout = 30;
            appendLog("-- Opening Ad: " + link);
            driver.get(homeUrl + link);
            while (timeout > 0) {
                List<WebElement> elements = null;
                try {
                    elements = driver.findElements(
                            By.xpath("//div[@id='surfbar' and not(contains(@style,'display: none'))]"));
                } catch (UnhandledAlertException ex) {
                    appendLog("\tError: UnhandledAlertException");
                    elements = driver.findElements(
                            By.xpath("//div[@id='surfbar' and not(contains(@style,'display: none'))]"));
                }
                if (elements.size() > 0) {
                    WebElement e = elements.get(0);
                    if (e.getText().contains("Wait please") || (e
                            .findElements(By.xpath(
                                    "./div/div[@id='progressbar' and not(contains(@style,'display: none'))]"))
                            .size() > 0)) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Neobux.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        timeout--;
                    } else if (e.getText().contains("Thanks for watching!")
                            || e.getText().contains("Invalid Advertisement")
                            || e.getText().contains("already visited")) {
                        break;
                    } else if (e
                            .findElements(
                                    By.xpath("./div[@id='focusoff' and not(contains(@style,'display: none'))]"))
                            .size() > 0) {
                        appendLog("--- Off Focus...... ---");
                        driver.switchTo().window(getCurrentWindow());
                        e.findElement(By.xpath("./a")).click();
                    } else {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Neobux.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        timeout--;
                        if (timeout < (timeout / 3)) {
                            driver.navigate().refresh();
                        }
                    }
                } else if (driver
                        .findElements(By.xpath("//div[@id='vnumbers' and not(contains(@style,'display: none'))]"))
                        .size() > 0) {
                    try {
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Neobux.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        WebElement element = driver
                                .findElement(By.xpath("//*[@id=\"vnumbers\"]/table/tbody/tr/td[2]"));
                        Point point = element.getLocation();
                        File ss = (File) ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
                        BufferedImage src = ImageIO.read(ss);
                        BufferedImage screen = src.getSubimage(point.getX(), point.getY(),
                                element.getSize().getWidth(), element.getSize().getHeight());
                        StaticImageScreenRegion region = new StaticImageScreenRegion(screen);
                        boolean found = false;
                        for (File file : new File("./src/imgs").listFiles()) {
                            if (file.isFile()) {
                                for (ScreenRegion match : region.findAll(new ImageTarget(ImageIO.read(file)))) {
                                    found = true;

                                    System.out.println("---location: " + point + " - " + element.getSize());
                                    System.out.println("---match: " + match.getCenter());
                                    System.out.println("-order: " + ((match.getCenter().getX() / 50) + 1));
                                    System.out
                                            .println("- target: " + (point.getX() + 50 + match.getCenter().getX()));
                                    new Actions(driver).moveToElement(element, 0, 0)
                                            .moveByOffset(match.getCenter().getX(), match.getCenter().getY())
                                            .click().perform();
                                    break;
                                }
                            }
                            if (found) {
                                break;
                            }
                        }
                        if (!found) {
                            ImageIO.write(screen, "PNG", new File("./src/imgs/detected/notfound-"
                                    + link.substring(link.lastIndexOf("=") + 1) + ".png"));
                        }
                        //                        break;
                    } catch (Exception ex) {
                        Logger.getLogger(ScarletClicks.class.getName()).log(Level.SEVERE, null, ex);
                    }

                } else {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Neobux.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    timeout--;
                    if (timeout < (timeout / 3)) {
                        driver.navigate().refresh();
                    }
                }
            }
        }
    }

    @Override
    public void openCustomAds() {
        //        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void setLogger(JTextArea taLog) {
        this.logger = taLog;
    }

    @Override
    public void closeAll() {
        getHelper().closeAllWindows();
    }

}