为什么我的无限重复的 selenium java 代码有内存泄漏?

Why does my infinitely repeating selenium java code have memory leak?

提问人:Michael 提问时间:9/4/2023 最后编辑:Michael 更新时间:9/4/2023 访问量:75

问:

我创建了一个程序,可以自动执行公司的工作。我打开了 3 个 Chrome 选项卡,使用 giris1ActionPerformed 方法登录了 3 个不同的银行。在手动输入公司电话的 OTP 后,我使用 giris2ActionPerformed 方法导航到每家银行的帐户活动页面。

在此之后,我使用 baslaActionPerformed 方法开始我的无限重复循环,我逐一前往每家银行,找到新到账的付款,并将它们写入 Google 电子表格页面。执行此操作后,我等待 30 秒并重复该过程。

该程序可以正常工作,但存在内存泄漏。在具有 16 GB 内存的笔记本电脑中,此程序持续 5 小时。随着时间的流逝,它消耗的RAM越来越多。最后,它崩溃了。

我在 basla 方法中确实有一个线程,但我认为这不会导致内存泄漏。因为我不会继续创建新线程。我只有一个线程。在那个线程中,我有一个无限循环。

我熟悉调试,但不熟悉分析软件项目。使用 Netbeans IDE 的配置文件工具是否有助于查找内存泄漏?

为了保护隐私,我用“XXX”替换了银行密码和谷歌表格 ID。

package bankaotomasyonu;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.ValueRange;
import java.awt.Toolkit;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.chrome.ChromeDriver;

public class ControlPanel extends javax.swing.JFrame
{
    private WebDriver driver;
    private String ziraatHandle;
    private String isHandle;
    private String garantiHandle;

    private Sheets service;
    private float satisFiyatiDakika = 0.06667F;
    private float satisFiyati = 10;
    private float alisFiyati = 14;

    private final String APPLICATION_NAME = "Bank Automation";
    private final String CREDENTIALS_FILE_PATH = "/credentialsClient1.json";
    private final String TOKENS_DIRECTORY_PATH = "tokens";
    private final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    private final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS);

    public ControlPanel()
    {
        initComponents();
    }

    @SuppressWarnings("unchecked")
   // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
   private void initComponents()
   {

      giris1 = new javax.swing.JButton();
      giris2 = new javax.swing.JButton();
      basla = new javax.swing.JButton();
      jScrollPane2 = new javax.swing.JScrollPane();
      errorScreen = new javax.swing.JTextPane();

      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
      setTitle("Ertürkler Banka");

      giris1.setText("Giriş 1");
      giris1.addActionListener(new java.awt.event.ActionListener()
      {
         public void actionPerformed(java.awt.event.ActionEvent evt)
         {
            giris1ActionPerformed(evt);
         }
      });

      giris2.setText("Giriş 2");
      giris2.addActionListener(new java.awt.event.ActionListener()
      {
         public void actionPerformed(java.awt.event.ActionEvent evt)
         {
            giris2ActionPerformed(evt);
         }
      });

      basla.setText("Başla");
      basla.addActionListener(new java.awt.event.ActionListener()
      {
         public void actionPerformed(java.awt.event.ActionEvent evt)
         {
            baslaActionPerformed(evt);
         }
      });

      jScrollPane2.setViewportView(errorScreen);

      javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
      getContentPane().setLayout(layout);
      layout.setHorizontalGroup(
         layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
         .addGroup(layout.createSequentialGroup()
            .addGap(20, 20, 20)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
               .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.LEADING)
               .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                  .addComponent(giris1)
                  .addGap(18, 18, 18)
                  .addComponent(giris2)
                  .addGap(18, 18, 18)
                  .addComponent(basla)
                  .addGap(0, 335, Short.MAX_VALUE)))
            .addGap(20, 20, 20))
      );
      layout.setVerticalGroup(
         layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
         .addGroup(layout.createSequentialGroup()
            .addGap(20, 20, 20)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
               .addComponent(giris1)
               .addComponent(basla)
               .addComponent(giris2))
            .addGap(20, 20, 20)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(20, Short.MAX_VALUE))
      );

      pack();
   }// </editor-fold>                        

   private void giris1ActionPerformed(java.awt.event.ActionEvent evt)                                       
   {                                           
        System.setProperty("webdriver.chrome.driver", "C:\\Banka Otomasyon\\chromedriver.exe");

        driver = new ChromeDriver();
        driver.manage().window().maximize();

        // Ziraat Bankası
        driver.get("https://kurumsal.ziraatbank.com.tr/Transactions/Login/FirstLogin.aspx?customertype=crp");
        driver.findElement(By.id("ctl00_c_CorporateIdentityTextBox")).sendKeys("XXX");
        driver.findElement(By.id("ctl00_c_CorporatePinTextBox")).sendKeys("XXX"); // 3/6 Ayda bir değişen
        driver.findElement(By.id("ctl00_c_CorporateUserNameTextBox")).sendKeys("XXX");
        driver.findElement(By.id("ctl00_c_CorporateLoginButton")).click();
        ziraatHandle = driver.getWindowHandle();

        // İş Bankası
        driver.switchTo().newWindow(WindowType.TAB);
        driver.get("https://www.isbank.com.tr/TicariInternet/Transactions/Login/FirstLogin.aspx");
        driver.findElement(By.id("CustomerNumberTextBox")).sendKeys("XXX");
        driver.findElement(By.id("CorporateCustomerNumberTextbox")).sendKeys("XXX");
        driver.findElement(By.id("PinTextBox")).sendKeys("XXX"); // 3/6 Ayda bir değişen
        driver.findElement(By.id("ctl00_t_NextButton")).click();
        isHandle = driver.getWindowHandle();

        // Garanti Bankası
        driver.switchTo().newWindow(WindowType.TAB);
        driver.get("https://sube.garantibbva.com.tr/isube/login/login/passwordentrycorporate-tr");
        driver.findElement(By.id("custno")).sendKeys("XXX");
        driver.findElement(By.id("password")).sendKeys("XXX"); // 3/6 Ayda bir değişen
        driver.findElement(By.id("userid")).sendKeys("XXX");
        driver.findElement(By.id("formSubmit")).click();
        garantiHandle = driver.getWindowHandle();
   }                                      

   private void giris2ActionPerformed(java.awt.event.ActionEvent evt)                                       
   {                                           
        try
        {
            // Ziraat Bankası - Vadesiz Hesaplarım
            driver.switchTo().window(ziraatHandle);
            driver.switchTo().frame("mainFrame");
            driver.findElement(By.xpath("/html/body/form/div[3]/div[2]/div[1]/"
                + "section[1]/div[2]/div[1]/div[1]/div/a")).click();
            Thread.sleep(1000);

            // 5013 NOLU HESAP
            driver.switchTo().frame("iframe1");
            driver.findElement(By.id("ctl00_c_GridDemandDeposit_AccountListSelector"
                + "_ctl11_ctl03_AccountName2Panel")).click();
            Thread.sleep(1000);

            // Hesap hareketleri
            driver.switchTo().frame("mainFrame");
            driver.findElement(By.id("ctl00_c_AccountHistoryButton")).click();

            // İş Bankası - Hesaplar
            driver.switchTo().window(isHandle);
            driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/div[3]/div[2]/"
                + "div[1]/div[1]/div[1]")).click();

            // Hesaplarım
            driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/div[3]"
                + "/div[2]/div[1]/div[1]/div[1]/div[2]/div[1]/div")).click();
            Thread.sleep(1000);

            // Hesap Hareketleri
            driver.findElement(By.cssSelector("#MenuEntityList_tutorialElement_actions"
                + " > div:nth-child(3) > div")).click();

            // Garanti Bankası -    Hesap ve Ürün
            driver.switchTo().window(garantiHandle);
            driver.findElement(By.id("primary1")).click();

            // Hesap
            driver.findElement(By.cssSelector("#primaryLi1 > ul > li:nth-child(1) > a")).click();
            Thread.sleep(1000);

            // Dönem
            driver.findElement(By.cssSelector("#dateRangeText > div > div > div > div > div > div")).click();
            Thread.sleep(1000);

            // Son 7 gün
            driver.findElement(By.xpath("/html/body/div[2]/div[4]/div[4]/div/div/div/"
                + "div/div[3]/div[2]/div[4]/div/div[2]/div/div[2]/div[2]/div[1]/div[2]/"
                + "div/form/div[1]/div/div[1]/div[1]/div/div/div/div/div/ul/li[3]/a")).click();
            Thread.sleep(1000);

            // Görüntüle
            driver.findElement(By.id("updateSubmitButton")).click();
        }
        catch (Exception e)
        {
            //System.out.println(e);
            //e.printStackTrace();

            showError("GIRIS 2", e.toString());
        }
   }                                      

   private void baslaActionPerformed(java.awt.event.ActionEvent evt)                                      
   {                                          
        try
        {
            final HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
            service = new Sheets.Builder(httpTransport, JSON_FACTORY, getCredentials(httpTransport))
                .setApplicationName(APPLICATION_NAME).build();

            new Thread(new Runnable()
            {
                @Override
                public void run()
                {
                    while (true)
                    {
                        try
                        {
                            driver.switchTo().window(ziraatHandle);
                            ziraatBank();

                            driver.switchTo().window(isHandle);
                            isBank();

                            driver.switchTo().window(garantiHandle);
                            garantiBank();

                            Thread.sleep(30000);
                        }
                        catch (Exception e)
                        {
                            //System.out.println(e);
                            //e.printStackTrace();

                            showError("BASLA 2", e.toString());
                        }
                    }
                }
            }).start();
        }
        catch (Exception e)
        {
            //System.out.println(e);
            //e.printStackTrace();

            showError("BASLA 1", e.toString());
        }
   }                                     

    void ziraatBank() throws IOException, GeneralSecurityException, InterruptedException
    {
        List<Object> lastCustomer;
        String lastAciklama;
        String lastAmount;
        ArrayList<String> aciklamaList = new ArrayList<>();
        String aciklama;
        String amountString = "0";
        String customerName = "";
        String dekontText;
        String[] dekontTextArray;

        // Hesap Hareketlerini Güncelle 1
        driver.switchTo().frame("iframe1");
        boolean successfullRead = false;
        while (!successfullRead)
        {
            try
            {
                driver.findElement(By.cssSelector("#ctl00_InnerContentWrapperPanel > a")).click();
                successfullRead = true;
            }
            catch (Exception e)
            {
            }
        }
        successfullRead = false;

        // Hesap Hareketlerini Güncelle 2
        while (!successfullRead)
        {
            try
            {
                driver.switchTo().frame("mainFrame");
                successfullRead = true;
            }
            catch (Exception e)
            {
            }
        }
        successfullRead = false;

        for (short row = 1; row <= 3; row++)
        {
            if ("MALTEPE E5 - 5013".equals(driver.findElement(By.cssSelector("#ctl00_c_AccountBoxSelector_AccountListSelector_ctl11 "
                + "> tbody > tr:nth-child(" + row + ") > td.firstColumn > div:nth-child(1)")).getText()))
            {
                driver.findElement(By.cssSelector("#ctl00_c_AccountBoxSelector_AccountListSelector_ctl11 "
                    + "> tbody > tr:nth-child(" + row + ") > td.firstColumn > div:nth-child(1)")).click();
                break;
            }
        }

        while (!successfullRead)
        {
            try
            {
                driver.switchTo().frame("iframe1");
                successfullRead = true;
            }
            catch (Exception e)
            {
            }
        }

        // Find which row is the last customer
        lastCustomer = readLastCustomer("A1:B1");
        lastAciklama = lastCustomer.get(0).toString();
        lastAmount = lastCustomer.get(1).toString();
        short rowNumber = 0;

        do
        {
            rowNumber++;
            successfullRead = false;
            while (!successfullRead)
            {
                try
                {
                    aciklamaList.add(driver.findElement(By.cssSelector("#ctl00_c_GridAccountHistoryList"
                        + " > tbody > tr:nth-child(" + rowNumber + ") > td.description")).getText());
                    amountString = driver.findElement(By.xpath("/html/body/form/"
                        + "div[3]/div[3]/div[3]/div[1]/div/div[3]/div[2]/div[2]/div/div/"
                        + "table/tbody/tr[" + rowNumber + "]/td[4]")).getText();
                    successfullRead = true;
                }
                catch (Exception e)
                {
                }
            }
        } while (!((lastAciklama.equals(aciklamaList.get(rowNumber - 1))) && (lastAmount.equals(amountString))));

        // If last row is the last customer, quit
        if (rowNumber != 1)
        {
            // Process new customers (the ones after the last customer)
            do
            {
                rowNumber--;

                aciklama = aciklamaList.get(rowNumber - 1);

                // Date
                String date = driver.findElement(By.cssSelector("#ctl00_c_GridAccountHistoryList >"
                    + " tbody > tr:nth-child(" + rowNumber + ") > td.firstColumn.nowrap.date")).
                    getText().replace("/", ".");

                // Amount
                amountString = driver.findElement(By.xpath("/html/body/form/"
                    + "div[3]/div[3]/div[3]/div[1]/div/div[3]/div[2]/div[2]/div/div/"
                    + "table/tbody/tr[" + rowNumber + "]/td[4]")).getText();
                if (amountString.startsWith("-"))
                {
                    writeLastCustomer("A1:B1", aciklama, amountString);
                    continue;
                }
                float amount = Float.parseFloat(amountString.replace(".", "").
                    replace(",", ".").replace(" TL", ""));

                // Dekontu aç
                driver.findElement(By.cssSelector("#ctl00_c_GridAccountHistoryList > tbody >"
                    + " tr:nth-child(" + rowNumber + ") > td:nth-child(6) > a")).click();

                // Dekont isim
                driver.switchTo().frame("GenericCustomModalFrame");
                driver.switchTo().frame("mainFrame");
                dekontText = driver.findElement(By.xpath("/html/body/form/div[3]"
                    + "/div/div[2]/div/table[2]/tbody/tr/td/table[1]/tbody/tr[2]/td/div/"
                    + "table[2]/tbody/tr/td/table/tbody/tr/td[1]")).getText();

                // Dekontu kapat
                Thread.sleep(250);
                driver.switchTo().defaultContent();
                driver.switchTo().frame("iframe1");
                driver.findElement(By.xpath("/html/body/form/div[4]/div/div/div[1]/button")).click();

                // Customer name
                if (dekontText.contains("Borçlu Adı Soyadı : ")) // Mobil havale
                    customerName = dekontText.split("Borçlu Adı Soyadı : ")[1].split("\n")[0];
                else if (dekontText.contains("Gönd: ")) // Fast
                {
                    dekontTextArray = dekontText.split("Gönd: ");

                    // Aciklamada fast varsa VE ilk satır alt cizgi değilse bu kod çalışacak
                    if (aciklama.contains("FAST") && !dekontText.startsWith("_") && !dekontText.startsWith("."))
                        customerName = dekontTextArray[1].split(dekontText.split("\n")[0])[0];
                    // 1- fast yoksa. 2- fast varsa VE ilk satır alt çizgiyse. 
                    else
                    {
                        dekontTextArray = dekontTextArray[1].split(" ");
                        for (byte counter = 0; counter <= 2; counter++)
                            if (Character.isUpperCase(dekontTextArray[counter].charAt(0)))
                                customerName += dekontTextArray[counter] + " ";
                    }

                    customerName = customerName.trim().toUpperCase(Locale.forLanguageTag("TR"));
                }
                else if (dekontText.contains("Gönderen : ")) // Referanslı Gelen Havale
                    customerName = dekontText.split("Gönderen : ")[1].split("\n")[0]; // Buranın toUpperCase e ihtiyacı varsa, toUpperCase i assagı at.
                else
                {
                    writeLastCustomer("A1:B1", aciklama, amountString);
                    showError("ZİRAAT BANKASI", aciklama);
                    continue;
                }

                // Google Sheets
                appendToGoogleSheets(date, amount, customerName, "ZİRAAT BANKASI");

                // Last customer text file
                writeLastCustomer("A1:B1", aciklama, amountString);

                customerName = "";
            } while (rowNumber > 1);
        }

        driver.switchTo().defaultContent();
    }

    void isBank() throws IOException, GeneralSecurityException
    {
        List<Object> lastCustomer;
        String lastAciklama;
        String lastAmount;
        ArrayList<String> aciklamaList = new ArrayList<>();
        String aciklama;
        String amountString = "0";
        String customerName = "";

        // Hesap Hareketlerini Güncelle
        driver.findElement(By.cssSelector(" #UpdateActivitiesSubMenu_tutorialElement "
            + "> div.sub-menu-item-text")).click();

        // Find which row is the last customer
        lastCustomer = readLastCustomer("A2:B2");
        lastAciklama = lastCustomer.get(0).toString();
        lastAmount = lastCustomer.get(1).toString();
        short rowNumber = 0;

        do
        {
            rowNumber++;
            boolean successfullRead = false;
            while (!successfullRead)
            {
                try
                {
                    aciklamaList.add(driver.findElement(By.xpath("/html/body/form/div[4]/"
                        + "div[3]/div[2]/div/div[1]/div[3]/div/div[9]/div/div[2]/div[3]/div[3]/"
                        + "div[" + rowNumber + "]/div/div/div[4]/div[2]/div/div")).getText());
                    amountString = driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/"
                        + "div[2]/div/div[1]/div[3]/div/div[9]/div/div[2]/div[3]/div[3]/div["
                        + rowNumber + "]/div/div/div[6]/div[1]/div/div/div/div/div[1]")).getText().replace(" ", "");
                    successfullRead = true;
                }
                catch (Exception e)
                {
                }
            }
        } while (!((lastAciklama.equals(aciklamaList.get(rowNumber - 1))) && (lastAmount.equals(amountString))));

        // If last row is the last customer, quit
        if (rowNumber != 1)
        {
            // Process new customers (the ones after the last customer)
            do
            {
                rowNumber--;

                aciklama = aciklamaList.get(rowNumber - 1);

                // Date
                String date = driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/div[2]/"
                    + "div/div[1]/div[3]/div/div[9]/div/div[2]/div[3]/div[3]/div[" + rowNumber
                    + "]/div/div/div[2]/div[1]/div/div/div/div[1]")).getText().replace("/", ".");

                // Amount
                amountString = driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/"
                    + "div[2]/div/div[1]/div[3]/div/div[9]/div/div[2]/div[3]/div[3]/div["
                    + rowNumber + "]/div/div/div[6]/div[1]/div/div/div/div/div[1]")).getText().replace(" ", "");
                if (amountString.startsWith("-") || aciklama.contains("VODAFONE"))
                {
                    writeLastCustomer("A2:B2", aciklama, amountString);
                    continue;
                }
                float amount = Float.parseFloat(amountString.substring(1).replace(",", ""));

                // Customer Name
                if (driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/div[2]/div/"
                    + "div[1]/div[3]/div/div[9]/div/div[2]/div[3]/div[3]/div[" + rowNumber
                    + "]/div/div/div[2]/div[2]/div/div")).getText().equals("Bankamatik"))
                {
                    String[] arrOfAciklama = aciklama.split(" ");
                    if (arrOfAciklama.length > 1 & arrOfAciklama.length < 4)
                        customerName = (arrOfAciklama.length == 2) ? arrOfAciklama[1] + " "
                            + arrOfAciklama[0] : arrOfAciklama[1] + arrOfAciklama[2] + arrOfAciklama[0];
                    else
                    {
                        writeLastCustomer("A2:B2", aciklama, amountString);
                        showError("İŞ BANKASI", aciklama);
                        continue;
                    }
                }
                else if (aciklama.contains("tarafından"))
                {
                    customerName = aciklama.split("tarafından", 2)[0].trim();
                }
                else if (aciklama.contains("*"))
                {
                    if (Character.isDigit(aciklama.split("\\*")[1].charAt(0)))
                        customerName = aciklama.split("\\*")[0];
                    else
                        customerName = aciklama.split("\\*")[1];
                }
                else
                {
                    writeLastCustomer("A2:B2", aciklama, amountString);
                    showError("İŞ BANKASI", aciklama);
                    continue;
                }

                customerName = customerName.toUpperCase(Locale.forLanguageTag("TR"));

                // Google Sheets
                appendToGoogleSheets(date, amount, customerName, "İŞ BANKASI");

                // Save last customer
                writeLastCustomer("A2:B2", aciklama, amountString);

            } while (rowNumber > 1);
        }
    }

    void garantiBank() throws IOException, GeneralSecurityException, InterruptedException
    {
        List<Object> lastCustomer;
        String lastAciklama;
        String lastAmount;
        ArrayList<String> aciklamaList = new ArrayList<>();
        String aciklama;
        String amountString = "0";
        String customerName = "";
        String dekontText;

        // Görüntüle
        driver.findElement(By.id("updateSubmitButton")).click();
        Thread.sleep(500);

        // Find which row is the last customer
        lastCustomer = readLastCustomer("A3:B3");
        lastAciklama = lastCustomer.get(0).toString();
        lastAmount = lastCustomer.get(1).toString();
        short rowNumber = 0;

        do
        {
            rowNumber++;
            boolean successfullRead = false;
            while (!successfullRead)
            {
                try
                {
                    aciklamaList.add(driver.findElement(By.cssSelector("#myAccountActivitiesGrid > tbody > tr:nth-child("
                        + rowNumber + ") > td.customHoverEnabled > div > div:nth-child(1)")).getText());
                    amountString = driver.findElement(By.cssSelector("#myAccountActivitiesGrid > "
                        + "tbody > tr:nth-child(" + rowNumber + ") > td:nth-child(4) > div")).getText();
                    successfullRead = true;
                }
                catch (Exception e)
                {
                }
            }
        } while (!((lastAciklama.equals(aciklamaList.get(rowNumber - 1))) && (lastAmount.equals(amountString))));

        // If last row is the last customer, quit
        if (rowNumber != 1)
        {
            // Process new customers (the ones after the last customer)
            do
            {
                rowNumber--;

                aciklama = aciklamaList.get(rowNumber - 1);

                // Amount
                amountString = driver.findElement(By.cssSelector("#myAccountActivitiesGrid > "
                    + "tbody > tr:nth-child(" + rowNumber + ") > td:nth-child(4) > div")).getText();
                if (amountString.startsWith("-") || aciklama.startsWith("PK"))
                {
                    writeLastCustomer("A3:B3", aciklama, amountString);
                    continue;
                }
                float amount = Float.parseFloat(amountString.substring(1).
                    replace(".", "").replace(",", ".").replace(" TL", ""));

                // Dekontu aç
                driver.findElement(By.cssSelector("#myAccountActivitiesGrid > tbody > "
                    + "tr:nth-child(" + rowNumber + ") > td:nth-child(3) > a")).click();
                Thread.sleep(1000);

                // Dekont date
                String date = driver.findElement(By.cssSelector(" #receiptScroll " // you can try putting this into an infinite loop like ziraat guncelleme
                    + "> div > table.receiptContainerTable > tbody > tr:nth-child(1) "
                    + "> td:nth-child(1) > table > tbody > tr:nth-child(2) > td > pre")).
                    getText().split("İŞLEM TARİHİ     : ")[1].split("\n")[0].trim().
                    replace("/", "."); // substring(1).trim().replace("/", ".");

                // Dekont isim
                dekontText = driver.findElement(By.xpath("/html/body/div[2]/div[4]/div[7]/div[1]/div/div/"
                    + "div[2]/form/div[2]/div/table[2]/tbody/tr[2]/td/table/tbody/tr[2]/td/pre")).getText();

                // Dekontu kapat
                driver.findElement(By.xpath("/html/body/div[2]/div[4]/div[7]/div[1]/div/div/div[1]/a")).click();

                // Customer name                
                if (dekontText.contains("BORÇLU HESAP")) // hesaptan hesaba havale
                    customerName = dekontText.split("\n")[3].substring(42).trim();
                // "gelen fast", "gelen eft", "kredi kartindan hesaba havale", "hesaba havale (kasadan)" (atm)
                else if (dekontText.contains("GÖNDEREN  "))
                {
                    customerName = dekontText.split("GÖNDEREN  ")[1].split("\n")[0].trim().substring(2);
                    //customerName = dekontText.split("\n")[1].substring(21).trim();
                }
                else
                {
                    writeLastCustomer("A3:B3", aciklama, amountString);
                    showError("GARANTİ BANKASI", aciklama);
                    continue;
                }

                // Google Sheets
                appendToGoogleSheets(date, amount, customerName, "GARANTİ BANKASI");

                // Last customer text file
                writeLastCustomer("A3:B3", aciklama, amountString);

            } while (rowNumber > 1);
        }
    }

    void appendToGoogleSheets(String date, float amount, String customerName, String bankName) throws IOException, GeneralSecurityException
    {
        String spreadsheetId = "XXX"; //XXX
        String range = "A:K";
        List<List<Object>> newValues = new ArrayList<>();

        float dakika = Math.round(amount / satisFiyatiDakika);
        float adet = Math.round((amount / satisFiyati) * 100.0F) / 100.0F;
        float maliyet = Math.round((adet * alisFiyati) * 100.0F) / 100.0F;
        float fark = Math.round((amount - maliyet) * 100.0F) / 100.0F;

        newValues.add(Arrays.asList(date, amount, dakika, adet, maliyet, fark,
            "", "", customerName, bankName, "X+"));

        // Append the new data starting from the first empty row in column A
        ValueRange valueRange = new ValueRange().setValues(newValues);

        service.spreadsheets().values().append(spreadsheetId, range, valueRange)
            .setValueInputOption("RAW").execute();
    }

    List readLastCustomer(String range) throws IOException
    {
        String spreadsheetId = "XXX";
        ValueRange response = service.spreadsheets().values().get(spreadsheetId, range).execute();
        List<List<Object>> values = response.getValues();
        return values.get(0);
    }

    void writeLastCustomer(String range, String aciklama, String amount) throws IOException
    {
        String spreadsheetId = "XXX";

        ValueRange valueRange = new ValueRange().setValues(Arrays.asList(
            Arrays.asList((Object) aciklama, (Object) amount)));

        service.spreadsheets().values().update(spreadsheetId, range, valueRange)
            .setValueInputOption("RAW").execute();
    }

    void showError(String banka, String aciklama)
    {
        Toolkit.getDefaultToolkit().beep();
        errorScreen.setText(errorScreen.getText() + banka + " " + aciklama + "\n\n");
    }

    private Credential getCredentials(final HttpTransport httpTransport) throws IOException
    {
        InputStream credentialsStream = ControlPanel.class
            .getResourceAsStream(CREDENTIALS_FILE_PATH);
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
            new InputStreamReader(credentialsStream));

        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            httpTransport, JSON_FACTORY, clientSecrets, SCOPES)
            .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
            .setAccessType("offline").build();

        return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver.Builder().setPort(8888).build())
            .authorize("user");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[])
    {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try
        {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels())
            {
                if ("Nimbus".equals(info.getName()))
                {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;

                }
            }
        }
        catch (ClassNotFoundException ex)
        {
            java.util.logging.Logger.getLogger(ControlPanel.class
                .getName()).log(java.util.logging.Level.SEVERE, null, ex);

        }
        catch (InstantiationException ex)
        {
            java.util.logging.Logger.getLogger(ControlPanel.class
                .getName()).log(java.util.logging.Level.SEVERE, null, ex);

        }
        catch (IllegalAccessException ex)
        {
            java.util.logging.Logger.getLogger(ControlPanel.class
                .getName()).log(java.util.logging.Level.SEVERE, null, ex);

        }
        catch (javax.swing.UnsupportedLookAndFeelException ex)
        {
            java.util.logging.Logger.getLogger(ControlPanel.class
                .getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new ControlPanel().setVisible(true);
            }
        });
    }

   // Variables declaration - do not modify                     
   private javax.swing.JButton basla;
   private javax.swing.JTextPane errorScreen;
   private javax.swing.JButton giris1;
   private javax.swing.JButton giris2;
   private javax.swing.JScrollPane jScrollPane2;
   // End of variables declaration                   
}
java google-chrome selenium-webdriver 内存泄漏

评论

1赞 aled 9/4/2023
捕获磁头转储并使用堆转储分析工具(如 eclipse MAT)查找正在使用内存的内容。
1赞 BernardV 9/4/2023
只是一些一般的反馈,你的代码完全是一团糟!老实说,你需要用重新考虑的设计来重写所有这些。(此外,将来可能会说明您构建应用程序的 Java 版本,因为答案可能因您的 Java 版本而异。
1赞 aled 9/4/2023
你不应该指望这里的人会审查一大块代码,并找到在执行时发生的问题的特定行。在内存较高的执行时捕获堆转储,并首先对其进行分析。
0赞 pcalkins 9/6/2023
第一个 do/while 循环对我来说看起来很糟糕......有点像 do-while 和 while...而且可能是无限的。然后有一段时间没有尸体了......很难跟上。giris1ActionPerformed 在 switchTo 调用时存在一些问题...但主要原因可能就是你说的......无限重复,一些变量总是变大。不是泄漏...但也许你应该在上面戳一个洞......
1赞 pcalkins 9/6/2023
可能需要在写入值后处理东西。

答: 暂无答案