Selenium Driver web Java Contoh Program

โšก Ringkasan Cerdas

Selenium webdriver Java Contoh Program ini memandu Anda melalui skrip otomatisasi ujung-ke-ujung pertama Anda. LessMateri ini mencakup pengaturan lingkungan, pencarian elemen, pengiriman input, navigasi, validasi, penantian, penanganan pengecualian, dan praktik terbaik untuk pengujian WebDriver yang andal.

  • โš™๏ธ Pengaturan Lingkungan: Install Java, Eclipse atau IntelliJ, konfigurasikan Selenium perpustakaan, dan pilih biner driver yang tepat untuk versi browser Anda.
  • ๐Ÿงญ Pencari Elemen: Gunakan ID, nama, kelas, XPath, pemilih CSS, dan linkText untuk mengidentifikasi elemen secara stabil di berbagai browser dan rilis.
  • ๏ธ Tindakan dan Masukan: WebDriver mendukung klik, sendKeys, submit, pemilihan dropdown, dan event keyboard untuk interaksi gaya pengguna sepenuhnya.
  • โณ Menunggu dengan Cerdas: Gantikan Thread.sleep dengan penantian implisit, eksplisit, dan lancar yang didorong oleh ExpectedConditions untuk menghilangkan pengujian yang tidak stabil.
  • ๐Ÿšจ Penanganan Pengecualian: Tangkap NoSuchElementException, TimeoutException, dan StaleElementReferenceException untuk menjaga agar rangkaian otomatisasi tetap tangguh.
  • ๐Ÿค– Pembuatan Tes AI: Asisten AI menghasilkan skrip WebDriver standar, menyarankan locator, dan secara otomatis memperbaiki selector ketika DOM berubah.

Selenium webdriver Java program

Selenium Java Example

Menggunakan Java class โ€œmyclassโ€ yang kita buat pada tutorial sebelumnya, mari kita coba membuat skrip WebDriver yang akan:

Langkah 1: mengambil Mercury Beranda tur
Langkah 2: verifikasi judulnya
Langkah 3: cetak hasil perbandingannya
Langkah 4: tutup sebelum mengakhiri seluruh program.

Selenium Contoh WebDriver Code

Di bawah ini adalah kode WebDriver sebenarnya untuk logika yang disajikan oleh skenario di atas

package newproject;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
//comment the above line and uncomment below line to use Chrome
//import org.openqa.selenium.chrome.ChromeDriver;
public class PG1 {


    public static void main(String[] args) {
        // declaration and instantiation of objects/variables
    	System.setProperty("webdriver.gecko.">driver","C:\\geckodriver.exe");
		WebDriver driver = new FirefoxDriver();
		//comment the above 2 lines and uncomment below 2 lines to use Chrome
		//System.setProperty("webdriver.chrome.">driver","G:\\chromedriver.exe");
		//WebDriver driver = new ChromeDriver();
    	
        String baseUrl = "https://demo.guru99.com/test/newtours/";
        String expectedTitle = "Welcome: Mercury Tours";
        String actualTitle = "";

        // launch Fire fox and direct it to the Base URL
        driver.get(baseUrl);

        // get the actual value of the title
        actualTitle = driver.getTitle();

        /*
         * compare the actual title of the page with the expected one and print
         * the result as "Passed" or "Failed"
         */
        if (actualTitle.contentEquals(expectedTitle)){
            System.out.println("Test Passed!");
        } else {
            System.out.println("Test Failed");
        }
       
        //close Fire fox
        driver.close();
    }

}

Catatan: Mulai Firefox 35, Anda perlu menggunakan driver tokek yang dibuat oleh Mozilla untuk menggunakan Driver Web. Selenium 3.0, gecko dan firefox memiliki masalah kompatibilitas dan pengaturannya yang benar bisa menjadi tugas yang berat. Jika kode tidak berfungsi, turunkan ke Firefox versi 47 atau lebih rendah. Alternatifnya, Anda dapat menjalankan skrip Anda di Chrome. Selenium berfungsi langsung di Chrome. Anda hanya perlu mengubah 3 baris kode untuk membuat skrip Anda berfungsi dengan Chrome atau Firefox

Menjelaskan kode

Mengimpor Paket

Untuk memulai, Anda perlu mengimpor dua paket berikut:

  1. org.openqa.selenium.*โ€“ berisi kelas WebDriver yang diperlukan untuk membuat instance browser baru yang dimuat dengan driver tertentu
  2. org.openqa.selenium.firefox.Firefoxsopir โ€“ berisi FirefoxKelas driver diperlukan untuk membuat instance a Firefox-driver khusus ke browser yang dipakai oleh kelas WebDriver

Jika pengujian Anda memerlukan tindakan yang lebih rumit seperti mengakses kelas lain, mengambil tangkapan layar browser, atau memanipulasi file eksternal, Anda pasti perlu mengimpor lebih banyak paket.

Membuat instance objek dan variabel

Biasanya, ini adalah bagaimana objek driver dipakai.

WebDriver driver = new FirefoxDriver();

A FirefoxKelas driver tanpa parameter berarti default Firefox profil akan diluncurkan oleh kami Java program. Standarnya Firefox profil mirip dengan peluncuran Firefox dalam mode aman (tidak ada ekstensi yang dimuat).

Demi kemudahan, kami menyimpan Basisnya. URL dan judul yang diharapkan sebagai variabel.

Meluncurkan Sesi Browser

WebDriver Dapatkan() Metode ini digunakan untuk meluncurkan sesi browser baru dan mengarahkannya ke URL yang Anda tentukan sebagai parameternya.

driver.get(baseUrl);

Dapatkan Judul Halaman Sebenarnya

Kelas WebDriver memiliki getTitle () metode yang selalu digunakan untuk mendapatkan judul halaman dari halaman yang sedang dimuat.

actualTitle = driver.getTitle();

Bandingkan Nilai yang Diharapkan dan Nilai Aktual

Bagian kode ini hanya menggunakan kode dasar Java struktur if-else untuk membandingkan judul sebenarnya dengan judul yang diharapkan.

if (actualTitle.contentEquals(expectedTitle)){
            System.out.println("Test Passed!");
        } else {
            System.out.println("Test Failed");
        }

Mengakhiri Sesi Browser

The "Menutup()Metode โ€ digunakan untuk menutup jendela browser.

driver.close();

Mengakhiri Seluruh Program

Jika Anda menggunakan perintah ini tanpa menutup semua jendela browser terlebih dahulu, seluruh Java program akan berakhir sambil membiarkan jendela browser terbuka.

System.exit(0);

Menjalankan Tes

Ada dua cara untuk mengeksekusi kode Eclipse ide.

  1. On Eclipsebilah menu, klik Jalankan> Jalankan.
  2. Media Ctrl + F11 untuk menjalankan seluruh kode.

Menjalankan Tes

Jika Anda melakukan semuanya dengan benar, Eclipse akan menampilkan โ€œTes Lulus!โ€

Menjalankan Tes

Menemukan Elemen GUI

Menemukan elemen di WebDriver dilakukan dengan menggunakan โ€œtemukanElemen(Oleh.locator())" metode. Bagian โ€œpencari lokasiโ€ dari kode ini sama dengan pencari lokasi mana pun yang telah dibahas sebelumnya di Selenium IDE bab dari tutorial ini. Faktanya, Anda disarankan untuk mencari elemen GUI menggunakan IDE dan setelah berhasil diidentifikasi, ekspor kode ke WebDriver.

Berikut ini adalah Selenium Contoh kode yang menemukan elemen berdasarkan ID-nya. Facebook digunakan sebagai basis. URL.

package newproject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class PG2 {
    public static void main(String[] args) {
    	System.setProperty("webdriver.gecko.">driver","C:\\geckodriver.exe");
    	WebDriver driver = new FirefoxDriver();
        String baseUrl = "http://www.facebook.com";
        String tagName = "";
        
        driver.get(baseUrl);
        tagName = driver.findElement(By.id("email")).getTagName();
        System.out.println(tagName);
        driver.close();
        System.exit(0);
}
}

Kami menggunakan dapatkanTagName() metode untuk extracKode ini akan mengidentifikasi nama tag dari elemen tertentu yang id-nya adalah โ€œemailโ€. Saat dijalankan, kode ini seharusnya dapat mengidentifikasi nama tag โ€œinputโ€ dengan benar dan akan mencetaknya. Eclipsejendela Konsol.

Menemukan Elemen GUI

Ringkasan untuk menemukan elemen

Variasi Deskripsi Pengiriman
Oleh.namakelas menemukan elemen berdasarkan nilai atribut "kelas". findElement(Oleh.className("someClassName"))
Oleh.cssSelector menemukan elemen berdasarkan mesin Pemilih CSS yang mendasari driver temukanElemen(Oleh.cssSelector(โ€œinput#emailโ€))
Oleh.id menempatkan elemen berdasarkan nilai atribut โ€œidโ€-nya findElement(Oleh.id("someId"))
 
Oleh.linkText menemukan elemen tautan dengan teks persis yang ditampilkannya findElement(Oleh.linkText(โ€œPENDAFTARANโ€))
 
Dengan nama menempatkan elemen berdasarkan nilai atribut "nama". findElement(By.name("someName"))
 
Oleh.partialLinkText menemukan elemen yang berisi teks tautan yang diberikan findElement(Oleh.partialLinkText(โ€œREGโ€))
 
Oleh.tagName menempatkan elemen berdasarkan nama tagnya findElement(Oleh.tagName(โ€œdivโ€))
 
Oleh.xpath menemukan elemen melalui XPath findElement(By.xpath(โ€œ//html/body/div/table/tbody/tr/td[2]/table/
tbody/tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td[3]/ form/table/tbody/tr[5]โ€))

Catatan tentang Menggunakan findElement(By.cssSelector())

By.cssSelector() tidak mendukung fitur "berisi". Pertimbangkan Selenium Kode IDE di bawah ini โ€“

Catatan tentang Menggunakan findElement(By.cssSelector())

In Selenium IDE di atas, seluruh tes lulus. Namun di Selenium Skrip WebDriver di bawah ini, pengujian yang sama menghasilkan kesalahan karena WebDriver tidak mendukung kata kunci โ€œberisiโ€ saat digunakan dalam metode By.cssSelector().

Catatan tentang Menggunakan findElement(By.cssSelector())

Perintah Umum

Membuat Instansiasi Elemen Web

Daripada menggunakan sintaks โ€œdriver.findElement(By.locator())โ€ yang panjang setiap kali Anda mengakses elemen tertentu, kita dapat membuat instance objek WebElement untuk elemen tersebut. Kelas WebElement terdapat dalam paket โ€œorg.openqa.selenium.*โ€.

Membuat Instansiasi Elemen Web

Mengklik sebuah Elemen

Mengklik mungkin merupakan cara paling umum untuk berinteraksi dengan elemen web. Itu click() metode ini digunakan untuk mensimulasikan klik pada elemen apa pun. Berikut ini Selenium Java contoh menunjukkan caranya click() digunakan untuk mengklik Mercury Tombol โ€œMasukโ€ Tur.

Mengklik sebuah Elemen

Hal-hal berikut harus diperhatikan saat menggunakan metode click().

  • Tidak diperlukan parameter/argumen apa pun.
  • Metode ini secara otomatis menunggu halaman baru dimuat jika memungkinkan.
  • Elemen yang akan diklik harus terlihat (tinggi dan lebar tidak boleh sama dengan nol).

Dapatkan Perintah

Dapatkan perintah untuk mengambil berbagai informasi penting tentang halaman/elemen. Berikut adalah beberapa perintah โ€œdapatkanโ€ penting yang harus Anda pahami.

Perintah penggunaan
Dapatkan()

Contoh penggunaan:

  • Secara otomatis membuka jendela browser baru dan mengambil halaman yang Anda tentukan di dalam tanda kurung.
  • Ini adalah mitra dari Selenium Perintah "buka" IDE.
  • Parameternya harus a String obyek.
getTitle ()

Contoh penggunaan:

  • Tidak memerlukan parameter
  • Mengambil judul halaman saat ini
  • Spasi putih di depan dan di belakang dipangkas
  • Mengembalikan string nol jika halaman tidak memiliki judul
dapatkanPageSource()

Contoh penggunaan:

  • Tidak memerlukan parameter
  • Mengembalikan kode sumber halaman sebagai nilai String
dapatkanUrl Saat Ini()

Contoh penggunaan:

  • Tidak memerlukan parameter
  • Mengambil string yang mewakili saat ini URL yang sedang dilihat oleh browser
getText ()

Contoh penggunaan:

  • Mengambil teks bagian dalam elemen yang Anda tentukan

Navigasi perintah

Perintah ini memungkinkan Anda untuk menyegarkan, masuk, dan beralih antar halaman web yang berbeda.

navigasi ke()

Contoh penggunaan:

  • Secara otomatis membuka jendela browser baru dan mengambil halaman yang Anda tentukan di dalam tanda kurung.
  • Ia melakukan hal yang persis sama dengan get() Metode.
navigasi().segarkan()

Contoh penggunaan:

  • Tidak memerlukan parameter.
  • Ini menyegarkan halaman saat ini.
navigasi().kembali()

Contoh penggunaan:

  • Tidak memerlukan parameter
  • Membawa Anda kembali satu halaman pada riwayat browser.
navigasi().maju()

Contoh penggunaan:

  • Tidak memerlukan parameter
  • Membawa Anda maju satu halaman pada riwayat browser.

Menutup dan Keluar dari Browser Windows

Menutup()

Contoh penggunaan:

  • Tidak memerlukan parameter
  • Ini hanya menutup jendela browser yang saat ini dikontrol oleh WebDriver.
berhenti()

Contoh penggunaan:

  • Tidak memerlukan parameter
  • Menutup semua jendela yang dibuka WebDriver.

Menutup dan Keluar dari Browser Windows

Untuk menggambarkan dengan jelas perbedaan antara close() ke quit(), coba jalankan kode di bawah ini. Ia menggunakan halaman web yang secara otomatis memunculkan jendela saat halaman dimuat dan membuka jendela lain setelah keluar.

Menutup dan Keluar dari Browser Windows

Perhatikan bahwa hanya jendela browser induk yang ditutup, bukan dua jendela pop-up.

Menutup dan Keluar dari Browser Windows

Namun, jika Anda menggunakan quit(), semua jendela akan ditutup โ€“ bukan hanya jendela induknya. Coba jalankan kode di bawah ini dan Anda akan melihat bahwa dua jendela pop-up di atas juga akan ditutup secara otomatis.

package newproject;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class PG3 {
    public static void main(String[] args) {
    	System.setProperty("webdriver.gecko.">driver","C:\\geckodriver.exe");
    	WebDriver driver = new FirefoxDriver();
        driver.get("http://www.popuptest.com/popuptest2.html");
        driver.quit();  // using QUIT all windows will close
    }
}

Beralih Antar Bingkai

Untuk mengakses elemen GUI dalam sebuah Frame, pertama-tama kita harus mengarahkan WebDriver untuk fokus pada frame atau jendela pop-up terlebih dahulu sebelum kita dapat mengakses elemen di dalamnya. Mari kita ambil contoh, halaman web https://demo.guru99.com/selenium/deprecated.html

Beralih Antar Bingkai

Halaman ini memiliki 3 bingkai yang atribut โ€œnamanyaโ€ ditunjukkan di atas. Kami ingin mengakses tautan โ€œTidak berlaku lagiโ€ yang dilingkari di atas dengan warna kuning. Untuk melakukan itu, pertama-tama kita harus menginstruksikan WebDriver untuk beralih ke frame โ€œclassFrameโ€ menggunakan โ€œberalih Ke().bingkai()โ€ metode. Kita akan menggunakan atribut nama frame sebagai parameter untuk bagian โ€œframe()โ€.

package newproject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class PG4 {
	  public static void main(String[] args) {
		  	System.setProperty("webdriver.gecko.">driver","C:\\geckodriver.exe");  
		  	WebDriver driver = new FirefoxDriver();
	        driver.get("https://demo.guru99.com/selenium/deprecated.html");
	        driver.switchTo().frame("classFrame");
	        driver.findElement(By.linkText("Deprecated")).click();
	        driver.close(); 
	    }
}

Setelah mengeksekusi kode ini, Anda akan melihat bahwa frame โ€œclassFrameโ€ dibawa ke halaman โ€œDeprecated APIโ€, artinya kode kita berhasil mengakses link โ€œDeprecatedโ€.

Beralih Antar Pop-up Windows

WebDriver memungkinkan jendela pop-up seperti peringatan untuk ditampilkan, tidak seperti di Selenium IDE. Untuk mengakses elemen dalam peringatan (seperti pesan yang dikandungnya), kita harus menggunakan "switchTo().alert()" metode. Dalam kode di bawah ini, kita akan menggunakan metode ini untuk mengakses kotak peringatan dan kemudian mengambil pesannya menggunakan "getText()" metode, dan kemudian secara otomatis menutup kotak peringatan menggunakan "switchTo().alert().accept()" Metode.

Pertama, pergilah ke https://output.jsbin.com/usidix/1 dan secara manual klik tombol "Mulai!" tombol di sana dan lihat sendiri teks pesannya.

Beralih Antar Pop-up Windows

Mari kita lihat Selenium contoh kode untuk melakukan ini-

package mypackage;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class myclass {

    public static void main(String[] args) {
    	System.setProperty("webdriver.gecko.">driver","C:\\geckodriver.exe");
        WebDriver driver = new FirefoxDriver();
        String alertMessage = "";

        driver.get("http://jsbin.com/usidix/1");
        driver.findElement(By.cssSelector("input[value=\"Go!\"]")).click();
        alertMessage = driver.switchTo().alert().getText();
        driver.switchTo().alert().accept();
       
        System.out.println(alertMessage);
        driver.quit();
       
    }
}

pada Eclipse konsol, perhatikan bahwa pesan peringatan yang dicetak adalah:

Beralih Antar Pop-up Windows

Menunggu

Ada dua macam menunggu.

  1. Tunggu implisit โ€“ digunakan untuk mengatur waktu tunggu default di seluruh program
  2. Tunggu eksplisit โ€“ digunakan untuk mengatur waktu tunggu untuk instance tertentu saja

Penantian Tersirat

  • Lebih mudah untuk membuat kode daripada Penantian Eksplisit.
  • Biasanya dideklarasikan di bagian instantiasi kode.
  • Anda hanya memerlukan satu paket tambahan untuk diimpor.

Untuk mulai menggunakan penantian implisit, Anda harus mengimpor paket ini ke dalam kode Anda.

Penantian Tersirat

Kemudian pada bagian instantiasi kode Anda, tambahkan ini.

Penantian Tersirat

Penantian Eksplisit

Penantian eksplisit dilakukan menggunakan kelas WebDriverWait dan ExpectedCondition. Untuk yang berikut ini Selenium Contoh WebDriver, kita harus menunggu hingga 10 detik hingga elemen yang idnya adalah "nama pengguna" terlihat sebelum melanjutkan ke perintah berikutnya. Berikut langkah-langkahnya.

Langkah 1:

Impor dua paket ini:

Penantian Eksplisit

Langkah 2:

Deklarasikan variabel WebDriverWait. Dalam contoh ini, kita akan menggunakan โ€œmyWaitVarโ€ sebagai nama variabel.

Penantian Eksplisit

Langkah 3:

Gunakan myWaitVar dengan ExpectedConditions pada bagian di mana Anda perlu menunggu secara eksplisit. Dalam hal ini, kami akan menggunakan menunggu eksplisit pada โ€œnama penggunaโ€ (Mercury Tours HomePage) sebelum kita mengetikkan teks โ€œtutorialโ€ ke dalamnya.

Penantian Eksplisit

Kondisi

Metode berikut digunakan dalam kondisi dan pencarianping operasi โ€”

  • diaktifkan() digunakan ketika Anda ingin memverifikasi apakah elemen tertentu diaktifkan atau tidak sebelum menjalankan perintah.

Kondisi Diaktifkan()

  • Ditampilkan() digunakan ketika Anda ingin memverifikasi apakah elemen tertentu ditampilkan atau tidak sebelum menjalankan perintah.

Kondisi Ditampilkan()

  • dipilih() digunakan ketika Anda ingin memverifikasi apakah suatu hal tertentu kotak centang, tombol radio, atau opsi dalam kotak drop-down dipilih. Itu tidak berfungsi pada elemen lain.

Ketentuan dipilih()

Menggunakan Kondisi yang Diharapkan

Kelas ExpectedConditions menawarkan serangkaian kondisi yang lebih luas yang dapat Anda gunakan bersama dengan metode Until() WebDriverWait.

Di bawah ini adalah beberapa metode ExpectedConditions yang paling umum.

  • peringatanIsPresent() โ€“ menunggu hingga kotak peringatan ditampilkan.

Menggunakan ExpectedConditions alertIsPresent()

  • elemenToBeClickable() โ€“ Menunggu hingga elemen terlihat dan, pada saat yang sama, diaktifkan. Contoh Selenium Code Kode di bawah ini akan menunggu hingga elemen dengan id=โ€usernameโ€ menjadi terlihat dan diaktifkan terlebih dahulu sebelum menetapkan elemen tersebut sebagai variabel WebElement bernama โ€œtxtUserNameโ€.

Menggunakan Kondisi yang Diharapkan

  • frameToBeAvailableAndSwitchToIt() โ€“ Menunggu hingga frame tertentu sudah tersedia, lalu secara otomatis beralih ke frame tersebut.

Menggunakan elemen ExpectConditionsToBeClickable()

Menangkap Pengecualian

Saat menggunakan isEnabled(), isDisplayed(), dan isSelected(), WebDriver menganggap bahwa elemen tersebut sudah ada di halaman. Jika tidak, ia akan menampilkan Tidak Ada Pengecualian Elemen Seperti Itu. Untuk menghindari hal ini, sebaiknya kita menggunakan blok try-catch agar program tidak terganggu.

WebElement txtbox_username = driver.findElement(By.id("username"));
try{
        if(txtbox_username.isEnabled()){
            txtbox_username.sendKeys("tutorial");
        }
    }

catch(NoSuchElementException nsee){
            System.out.println(nsee.toString());
 }

Jika Anda menggunakan menunggu eksplisit, jenis pengecualian yang harus Anda tangkap adalah โ€œTimeoutExceptionโ€.

Menangkap Pengecualian

Pertanyaan Umum Demo Slot

Instal JDK, sebuah IDE seperti Eclipse atau IntelliJ, itu Selenium Java pustaka, dan driver browser yang sesuai. Alat otomatisasi pembangunan seperti Maven atau Gradle menyederhanakan manajemen ketergantungan.

AI secara otomatis memperbaiki locator, menghasilkan kasus uji dari user story, dan mengidentifikasi pengujian yang tidak stabil. Platform seperti TestimMabl dan Applitools menyematkan AI untuk pembuatan, eksekusi, dan validasi visual yang lebih cerdas.

Ya. GitHub Copilot, Cursor, dan JetBrains AI menghasilkan Java Selenium Skrip-skrip ini berasal dari langkah-langkah berbahasa sederhana, termasuk penantian, pernyataan, dan objek halaman. Hal ini sangat mengurangi kode berulang (boilerplate) untuk skenario pengujian baru.

findElement mengembalikan WebElement pertama yang cocok atau melempar NoSuchElementException. findElements mengembalikan daftar semua kecocokan dan mengembalikan daftar kosong jika tidak ada yang ditemukan, tanpa pernah melempar pengecualian.

Thread.sleep menghentikan eksekusi untuk durasi tetap tanpa memperhatikan status halaman, memperlambat eksekusi cepat dan menyebabkan kegagalan pada eksekusi lambat. Gunakan WebDriverWait dengan ExpectedConditions untuk menunggu hanya selama yang dibutuhkan.

Selenium mendukung ChromeDriver, GeckoDriver untuk Firefox, EdgeDriver, SafariDriver, dan IEDriverServer. Selenium Pada versi 4, Manager mengunduh driver yang tepat secara otomatis.

Konfigurasi ChromeOptions atau FirefoxObjek Options dengan setAcceptInsecureCerts(true). Ini memberi tahu browser untuk mengabaikan sertifikat yang tidak valid sehingga sesi WebDriver dapat berlanjut.

WebDriverManager secara otomatis mengunduh dan mengkonfigurasi biner driver browser yang tepat untuk versi browser yang terpasang, menghilangkan pemeliharaan driver manual dan mengurangi waktu penyiapan bagi kontributor baru.

Ringkaslah postingan ini dengan: