---
name: jobseeker-portal-jobstreet
description: Use when applying on JobStreet. Selectors and flow.
---

# JobStreet — alur lamaran spesifik portal

Load skill ini (skill_view) SEBELUM melamar di JobStreet. Data diri dari
`/opt/data/jobseeker/user-profile.json` (profile: name, email, phone, city,
keywords, salary_min/max, level, work_type) + data CV user (uploads dari BE).

## 1. Login & sesi (user login SENDIRI di viewer VNC)

- Cookie sesi JobStreet (Auth0): `is.authenticated=true` + `appSession` — dipantau
  `portal-check.py` (status `connected`/`expired`).
- Kalau status `expired`/belum login saat mau lamar → `ask_user`: "Login JobStreet
  dulu ya — halaman sudah dibuka" → tunggu user → verifikasi cookie → lanjut.
- Popup login Google/Apple yang muncul dari klik → proses lalu `Target.closeTarget`,
  teruskan di tab utama (aturan SATU TAB).

## 2. URL pencarian & navigasi (SATU TAB)

- Search: `https://id.jobstreet.com/jobs?keywords=<kw+%20>&location=<kota>`
  → **di-redirect ke URL canonical** `/Full-Stack-Developer-jobs` (param dibuang).
- Paginasi: pakai URL canonical + `?page=N` (mis. `/Full-Stack-Developer-jobs?page=2`).
  Jangan tambah `?page=` ke URL query asli — redirect membuangnya.

## 3. Struktur halaman (selector TERVERIFIKASI — live)

| Elemen | Selector |
|---|---|
| Kartu lowongan | `article[data-automation="normalJob"]` |
| Judul | `[data-automation="jobTitle"]` (fallback: `aria-label` kartu) |
| Perusahaan | `[data-automation="jobCompany"]` |
| Lokasi | `[data-automation="jobLocation"]` atau `jobCardLocation` |
| Gaji | `[data-automation="jobSalary"]` |
| Link lamaran | `a[href*="/job/"]` → `https://id.jobstreet.com/job/<id>` |
| Sumber antrian | job dari BE (pick) sudah berisi `job_url` — buka langsung |

## 4. Alur lamaran

1. Buka `job_url` (navigasi tab yang sama) → tunggu load.
2. Klik tombol "Lamar"/"Apply" (data-automation mengandung `apply`; verifikasi live).
3. Form aplikasi:
   - Nama/email/telepon → dari profile (user-profile.json).
   - CV → CV user (sudah di-upload di akun) — cek otomatis terpasang; kalau minta
     upload & file tersedia (uploads dari BE) → upload; kalau tidak → `failed`.
   - Lokasi/gaji harapan → `city` + `salary_min` dari profile.
4. **Pretest / screening questions** (JobStreet sering punya "Application questions"):
   - JAWAB DARI DATA CV user (pengalaman, skill, pendidikan, gaji) — jangan tanya user.
   - Data tidak tersedia → jawaban singkat & jujur berbasis CV; kalau wajib & kosong → `failed`.
5. Submit → tunggu konfirmasi → `report-application.py update --id <uuid> --status submitted`
   (atau by `--job-url`). Gagal teknis → retry maks 3× → `--status failed`.

## 5. Pitfalls

- Redirect canonical membuang query (termasuk `location` & `page`) — selalu baca
  `location.href` setelah navigasi untuk base URL paginasi.
- Popup Auth0/Google → tutup setelah dipakai.
- Halaman detail kadang lambat — tunggu elemen form muncul sebelum klik (poll 2–3×).
- Duplikat: cek riwayat `status=submitted` dulu (aturan skill base #5).

## 6. Kalibrasi

Selector §3 sudah diverifikasi live (scrape 100 loker). Selector tombol apply &
field form diverifikasi saat pertama kali lamar — kalau ragu, inspeksi DOM
(`document.querySelectorAll('[data-automation]')`) lalu catat pembaruan ke skill ini.
