Post

Pengantar Selenium WebDriver (dengan Contoh SauceDemo)

Pengantar Selenium WebDriver (dengan Contoh SauceDemo)

Apa itu Selenium WebDriver?

Selenium WebDriver adalah pustaka automasi browser lintas bahasa dan lintas browser untuk pengujian end-to-end.

Kapan Menggunakannya

  • Validasi alur pengguna kritikal di UI.
  • Uji kompatibilitas lintas browser.

Contoh: Login di SauceDemo

Target situs: https://www.saucedemo.com/.

JavaScript (Node.js) + selenium-webdriver (Chrome)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import { Builder, By, until } from 'selenium-webdriver';
import chrome from 'selenium-webdriver/chrome.js';

async function loginSauceDemo() {
  const options = new chrome.Options();
  options.addArguments('--headless=new');
  const driver = await new Builder().forBrowser('chrome').setChromeOptions(options).build();
  try {
    await driver.get('https://www.saucedemo.com/');
    await driver.findElement(By.id('user-name')).sendKeys('standard_user');
    await driver.findElement(By.id('password')).sendKeys('secret_sauce');
    await driver.findElement(By.id('login-button')).click();

    await driver.wait(until.elementLocated(By.css('.inventory_list')), 10000);
    const title = await driver.getTitle();
    console.log('Logged in, page title:', title);
  } finally {
    await driver.quit();
  }
}

loginSauceDemo();

Python + selenium (Chrome)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless=new')
driver = webdriver.Chrome(options=options)

try:
    driver.get('https://www.saucedemo.com/')
    driver.find_element(By.ID, 'user-name').send_keys('standard_user')
    driver.find_element(By.ID, 'password').send_keys('secret_sauce')
    driver.find_element(By.ID, 'login-button').click()

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.inventory_list')))
    print('Login sukses')
finally:
    driver.quit()

Tips Stabilitas

  • Gunakan explicit wait, locator yang stabil (id/data-test), dan jalankan headless di CI.

Sumber situs uji: SauceDemo.

Page Object Model (ringkas)

1
2
3
4
5
6
7
8
9
10
11
12
// pages/LoginPage.js
import { By, until } from 'selenium-webdriver';
export class LoginPage {
  constructor(driver) { this.driver = driver; }
  async open() { await this.driver.get('https://www.saucedemo.com/'); }
  async login(user, pass) {
    await this.driver.findElement(By.id('user-name')).sendKeys(user);
    await this.driver.findElement(By.id('password')).sendKeys(pass);
    await this.driver.findElement(By.id('login-button')).click();
    await this.driver.wait(until.elementLocated(By.css('.inventory_list')), 10000);
  }
}

Menjalankan di CI (GitHub Actions contoh)

1
2
3
4
5
6
7
8
9
10
11
name: e2e
on: [push]
jobs:
  selenium:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci
      - run: node e2e/login.test.js
This post is licensed under CC BY 4.0 by the author.