# Selenium BrowserKit
[](https://python.org)
[](LICENSE)
[](pyproject.toml)
**Selenium BrowserKit** là một bộ công cụ tự động hóa mạnh mẽ với Selenium, được thiết kế để quản lý nhiều profile trình duyệt, chạy song song, và tích hợp các tính năng AI và Telegram. Phù hợp cho việc xây dựng bot, tool automation, hoặc quản lý nhiều tài khoản cùng lúc.
## ✨ Tính năng chính
- 🚀 **Quản lý đa profile**: Hỗ trợ chạy nhiều profile trình duyệt độc lập
- ⚡ **Chạy song song**: BrowserManager cho phép chạy nhiều profile đồng thời
- 🔒 **Hệ thống lock**: Tránh xung đột khi chạy nhiều tiến trình
- 🌐 **Quản lý proxy**: Hỗ trợ proxy với nhiều định dạng khác nhau
- 📱 **Tích hợp Telegram**: Gửi log, screenshot qua Telegram bot
- 🤖 **AI Helper**: Tích hợp Gemini AI để phân tích văn bản và hình ảnh
- 🔧 **Tùy biến linh hoạt**: Hỗ trợ cả class và function cho Auto/Setup Handler
- 📦 **Extension support**: Tự động load các extension Chrome (.crx)
## 📦 Cài đặt
### Yêu cầu hệ thống
- Python 3.8+
- Chrome/Chromium & ChromeDriver
- Windows/Linux/macOS
### Cài đặt từ PyPI
```bash
pip install selenium-browserkit==0.3.0
```
### Cài đặt từ source
```bash
git clone https://github.com/tranledienlam/selenium-browserkit.git
cd selenium-browserkit
pip install -e .
```
## 🚀 Quick Start
### Cách 1: Sử dụng Class
```python
from selenium_browserkit import BrowserManager, Node, By
class Auto:
def __init__(self, node: Node, profile: dict):
self.node = node
self.profile = profile
self.run()
def run(self):
# Logic tự động chính
self.node.go_to("https://www.selenium.dev")
self.node.find_and_click(By.XPATH, '//span[contains(text(),"Download")]')
self.node.log("Đã click vào Download")
class Setup:
def __init__(self, node: Node, profile: dict):
self.node = node
self.profile = profile
self.run()
def run(self):
# Logic thiết lập ban đầu
self.node.go_to("https://www.selenium.dev")
self.node.log("Đã mở https://www.selenium.dev")
# Khởi tạo và chạy
manager = BrowserManager(auto_handler=Auto, setup_handler=Setup)
manager.run_menu(profiles=[{'profile_name': 'test'}])
```
### Cách 2: Sử dụng Function
```python
from selenium_browserkit import BrowserManager, Node, By
def auto(node: Node, profile: dict):
node.go_to("https://www.selenium.dev")
node.find_and_click(By.XPATH, '//span[contains(text(),"Download")]')
node.log("Đã click vào Download")
def setup(node: Node, profile: dict):
node.go_to("https://www.selenium.dev")
node.log("Đã mở https://www.selenium.dev")
# Khởi tạo và chạy
manager = BrowserManager(auto_handler=auto, setup_handler=setup)
manager.run_menu(profiles=[{'profile_name': 'test'}])
```
## ⚙️ Cấu hình BrowserManager
### Cấu hình cơ bản
```python
manager = BrowserManager(auto_handler=Auto, setup_handler=Setup)
# Cấu hình các tùy chọn
manager.update_config(
headless=False, # Ẩn trình duyệt
disable_gpu=False, # Tắt GPU
sys_chrome=False, # Sử dụng Chrome hệ thống
use_tele=False, # Bật Telegram helper
use_ai=False # Bật AI helper
)
```
### Thêm Extension
```python
# Thêm extension từ thư mục extensions/
manager.add_extensions('Meta-Wallet-*.crx', 'OKX-Wallet-*.crx')
```
### Profile với Proxy
```python
profiles = [
{
'profile_name': 'profile1',
'proxy_info': 'ip:port@username:password' # Proxy với auth
},
{
'profile_name': 'profile2',
'proxy_info': 'ip:port' # Proxy không auth
},
{
'profile_name': 'profile3',
'proxy_info': 'username:password@ip:port' # Proxy auth khác
}
]
# Thêm proxy dự phòng (fallback)
# Nếu profile không có proxy hoặc proxy trong profile bị lỗi
manager.add_proxies(
"38.153.152.244:9594",
"38.153.152.244:9594@user:pass",
"user:pass@38.153.152.244:9594"
)
manager.run_menu(profiles=profiles)
```
## 🔧 API Reference
### BrowserManager Class
```python
BrowserManager(auto_handler=None, setup_handler=None)
```
| Method | Mô tả |
|--------|-------|
| `update_config(**kwargs)` | Cập nhật cấu hình |
| `add_extensions(*args)` | Thêm extension Chrome |
| `add_proxies(*args)` | Thêm proxy |
| `run_menu(profiles)` | Chạy với giao diện menu |
### Node Class
| Method | Mô tả |
|--------|-------|
| `get_driver()` | Trả về đối tượng Selenium WebDriver gốc |
| `go_to(url, method, wait, timeout)` | Điều hướng đến URL |
| `find(by, value, parent_element, wait, timeout)` | Tìm element |
| `find_all(by, value, parent_element, wait, timeout)` | Tìm tất cả elements |
| `find_and_click(by, value, parent_element, wait, timeout)` | Tìm và click element |
| `find_and_input(by, value, text, parent_element, delay, wait, timeout)` | Tìm và nhập text |
| `click(element, wait)` | Click element |
| `press_key(key, parent_element, wait, timeout)` | Nhấn phím |
| `get_text(by, value, parent_element, wait, timeout)` | Lấy text từ element |
| `find_in_shadow(selectors, wait, timeout)` | Tìm element trong shadow DOM |
| `see_by_text(text, by, parent_element, wait, timeout)` | Tìm element theo text |
| `take_screenshot()` | Chụp màn hình (trả về bytes) |
| `snapshot(message, stop)` | Chụp và lưu ảnh hoặc gửi đến Tele (nếu có). Nếu `stop=True` thì sẽ dừng luồng code sau khi chụp|
| `log(message, show_log)` | Ghi log |
| `new_tab(url, method, wait, timeout)` | Mở tab mới |
| `switch_tab(value, type, wait, timeout)` | Chuyển tab |
| `close_tab(value, type, wait, timeout)` | Đóng tab |
| `reload_tab(wait)` | Reload tab hiện tại |
| `get_url(wait)` | Lấy URL hiện tại |
| `scroll_to_element(element, wait)` | Cuộn đến element |
| `scroll_to_position(position, wait)` | Cuộn đến vị trí "top", "middle", "end" của trang|
| `wait_for_disappear(by, value, parent_element, wait, timeout)` | Chờ element biến mất |
| `ask_ai(prompt, is_image, wait)` | Hỏi AI (Gemini) |
| `execute_chain(actions, message_error)` | Thực hiện chuỗi hành động |
#### Ví dụ sử dụng Node
```python
def auto(node: Node, profile: dict):
# Điều hướng
node.go_to("https://www.saucedemo.com")
# Nhập text
node.find_and_input(By.ID, "user-name", "standard_user")
node.find_and_input(By.ID, "password", "secret_sauce")
node.find_and_click(By.ID, "login-button")
# Chụp màn hình và lưu lại
node.snapshot()
# Ghi log
node.log("Đã đăng nhập thành công")
```
### Utility Class
| Method | Mô tả |
|--------|-------|
| `wait_time(second, fix)` | Chờ thời gian (có random) |
| `fake_data(numbers)` | Tạo dữ liệu fake cho test |
| `read_data(*field_names)` | Đọc dữ liệu từ file data.txt |
| `read_config(keyname)` | Đọc dữ liệu từ file config.txt |
| `timeout(second)` | Tạo hàm kiểm tra timeout |
#### Ví dụ sử dụng Utility
```python
from selenium_browserkit import Utility
# Tạo dữ liệu fake
profiles = Utility.fake_data(5)
# Đọc dữ liệu từ file data.txt
profiles = Utility.read_data('profile_name', 'email', 'password')
# Đọc dữ liệu từ file config.txt
proxies = Utility.read_data('PROXY')
# Chờ thời gian (có random ±40%)
Utility.wait_time(5, fix=False) # Random 3-7 giây
Utility.wait_time(5, fix=True) # Chính xác 5 giây
# Set timeout cho vòng lặp
check_timeout = Utility.timeout(30)
while check_timeout():
# Thực hiện logic
pass
```
## 📁 Cấu trúc dự án
### Khi cài đặt từ PyPI
```
site-packages/selenium_browserkit/
├── __init__.py
├── browser.py # BrowserManager
├── node.py # Node class
└── utils/
├── __init__.py
├── core.py # Utility functions
└── browser_helper.py # TeleHelper, AIHelper
```
### Khi sử dụng (trong project của bạn)
```
your_project/
├── snapshot/ # Nơi hình ảnh được lưu (tool tạo)
├── user_data/ # Browser profiles data (tool tạo)
├── extensions/ # Chrome extensions (.crx) (tự tạo)
├── config.txt # Configuration file (tự tạo)
├── data.txt # Profiles data (tự tạo)
└── main.py # File chính
```
## 📝 File cấu hình
### config.txt (tự tạo trong project)
```
MAX_PROFILES=5
PYTHON_PATH=E:\venv\Scripts\python.exe
USER_DATA_DIR=E:\profiles\discord
TELE_BOT=<USER_ID>|<BOT_TOKEN>|<ENDPOINT_URL (nếu có)>
AI_BOT=<AI_BOT_TOKEN>
```
### data.txt (tự tạo trong project)
```
profile_name|email|password|proxy_info (nếu có)
test1|user1@example.com|pass1|ip:port@username:password
test2|user2@example.com|pass2
```
## 🤖 Tích hợp AI và Telegram
### Telegram Helper
- Tự động gửi screenshot lên Telegram
- Gửi log và thông báo trạng thái
### AI Helper (Gemini)
- Phân tích hình ảnh và văn bản
- Sử dụng `node.ask_ai()` để tương tác
### Cấu hình
```python
# Trong config.txt
TELE_BOT=123456789|bot_token_here|https://api.telegram.org
AI_BOT=your_gemini_api_key
# Sử dụng
manager.update_config(use_ai=True, use_tele=True)
```
### Ví dụ sử dụng AI và Tele
```python
def auto(node: Node, profile: dict):
# Chụp ảnh gửi Tele
node.snapshot("Chụp ảnh trang web")
# Gửi ảnh và hỏi AI
response = node.ask_ai("Phân tích nội dung trang web này", is_image=True)
node.log(f"AI response: {response}")
```
## 🐛 Troubleshooting
### Lỗi thường gặp
1. **ChromeDriver không tìm thấy**
```bash
# Cài đặt ChromeDriver
pip install webdriver-manager
```
2. **Profile bị lock**
```bash
# Xóa file lock
rm user_data/*.pid
# Hoặc trên Windows
del user_data\*.pid
```
3. **Extension không load**
- Đảm bảo file .crx nằm trong thư mục `extensions/`
- Kiểm tra tên file extension
- Kiểm tra quyền đọc file
4. **AI/Telegram không hoạt động**
- Kiểm tra API key trong config.txt
- Kiểm tra format cấu hình TELE_BOT và AI_BOT
## 🆕 Update v0.3.0
Phiên bản **0.3.0** bổ sung và cải thiện các tính năng:
- `scroll_to(element)` – **Removed** (thay bằng `scroll_to_element(element)`)
- `scroll_to_element(element)` – Cuộn đến phần tử cụ thể
- `scroll_to_position(position)` – Cuộn nhanh đến `"top"`, `"middle"`, `"end"` của trang
- `get_driver()` – Lấy WebDriver gốc để tùy chỉnh nâng cao
- `add_proxies(*args)` – Thêm danh sách proxy để BrowserManager tự động quản lý
## 📄 License
MIT License - xem file [LICENSE](LICENSE) để biết thêm chi tiết.
## 🤝 Contributing
Mọi đóng góp đều được chào đón! Vui lòng:
1. Fork repository
2. Tạo feature branch
3. Commit changes
4. Push to branch
5. Tạo Pull Request
## 📞 Support
- 📧 Email: lam.tranledien@gmail.com
- 🐛 Issues: [GitHub Issues](https://github.com/tranledienlam/selenium-browserkit/issues)
- 📖 Documentation: [Wiki](https://github.com/tranledienlam/selenium-browserkit/wiki) (Chưa cập nhật)
---
## 🔗 Thông tin liên hệ
📢 **Telegram Channel:** [Airdrop Automation](https://t.me/+8o9ebAT9ZSFlZGNl)
💰 **Ủng hộ tác giả:**
- **EVM:** `0x3b3784f7b0fed3a8ecdd46c80097a781a6afdb09`
- **SOL:** `4z3JQNeTnMSHYeg9FjRmXYrQrPHBnPg3zNKisAJjobSP`
- **TON:** `UQDKgC6TesJJU9TilGYoZfj5YYtIzePhdzSDJTctJ-Z27lkR`
- **SUI:** `0x5fb56584bf561a4a0889e35a96ef3e6595c7ebd13294be436ad61eaf04be4b09`
- **APT (APTOS):** `0x557ea46189398da1ddf817a634fa91cfb54a32cfc22cadd98bb0327c880bac19`
🙏 Khi ủng hộ, nếu không thấy phiền, Bạn có thể gửi token chính của mạng. Cám ơn Bạn đã hỗ trợ!
---
**Made with ❤️ by Tran Lam**
Raw data
{
"_id": null,
"home_page": null,
"name": "selenium-browserkit",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "selenium, automation, browser, profile, toolkit",
"author": null,
"author_email": "Tran Lam <lam.tranledien@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/41/71/5794afda31003a8bf42c41c4b22de2805f9fb3ae5972d5341ea257bf85e2/selenium_browserkit-0.3.0.tar.gz",
"platform": null,
"description": "# Selenium BrowserKit\r\n\r\n[](https://python.org)\r\n[](LICENSE)\r\n[](pyproject.toml)\r\n\r\n**Selenium BrowserKit** l\u00e0 m\u1ed9t b\u1ed9 c\u00f4ng c\u1ee5 t\u1ef1 \u0111\u1ed9ng h\u00f3a m\u1ea1nh m\u1ebd v\u1edbi Selenium, \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf \u0111\u1ec3 qu\u1ea3n l\u00fd nhi\u1ec1u profile tr\u00ecnh duy\u1ec7t, ch\u1ea1y song song, v\u00e0 t\u00edch h\u1ee3p c\u00e1c t\u00ednh n\u0103ng AI v\u00e0 Telegram. Ph\u00f9 h\u1ee3p cho vi\u1ec7c x\u00e2y d\u1ef1ng bot, tool automation, ho\u1eb7c qu\u1ea3n l\u00fd nhi\u1ec1u t\u00e0i kho\u1ea3n c\u00f9ng l\u00fac.\r\n\r\n## \u2728 T\u00ednh n\u0103ng ch\u00ednh\r\n\r\n- \ud83d\ude80 **Qu\u1ea3n l\u00fd \u0111a profile**: H\u1ed7 tr\u1ee3 ch\u1ea1y nhi\u1ec1u profile tr\u00ecnh duy\u1ec7t \u0111\u1ed9c l\u1eadp\r\n- \u26a1 **Ch\u1ea1y song song**: BrowserManager cho ph\u00e9p ch\u1ea1y nhi\u1ec1u profile \u0111\u1ed3ng th\u1eddi\r\n- \ud83d\udd12 **H\u1ec7 th\u1ed1ng lock**: Tr\u00e1nh xung \u0111\u1ed9t khi ch\u1ea1y nhi\u1ec1u ti\u1ebfn tr\u00ecnh\r\n- \ud83c\udf10 **Qu\u1ea3n l\u00fd proxy**: H\u1ed7 tr\u1ee3 proxy v\u1edbi nhi\u1ec1u \u0111\u1ecbnh d\u1ea1ng kh\u00e1c nhau\r\n- \ud83d\udcf1 **T\u00edch h\u1ee3p Telegram**: G\u1eedi log, screenshot qua Telegram bot\r\n- \ud83e\udd16 **AI Helper**: T\u00edch h\u1ee3p Gemini AI \u0111\u1ec3 ph\u00e2n t\u00edch v\u0103n b\u1ea3n v\u00e0 h\u00ecnh \u1ea3nh\r\n- \ud83d\udd27 **T\u00f9y bi\u1ebfn linh ho\u1ea1t**: H\u1ed7 tr\u1ee3 c\u1ea3 class v\u00e0 function cho Auto/Setup Handler\r\n- \ud83d\udce6 **Extension support**: T\u1ef1 \u0111\u1ed9ng load c\u00e1c extension Chrome (.crx)\r\n\r\n## \ud83d\udce6 C\u00e0i \u0111\u1eb7t\r\n\r\n### Y\u00eau c\u1ea7u h\u1ec7 th\u1ed1ng\r\n- Python 3.8+\r\n- Chrome/Chromium & ChromeDriver\r\n- Windows/Linux/macOS\r\n\r\n### C\u00e0i \u0111\u1eb7t t\u1eeb PyPI\r\n```bash\r\npip install selenium-browserkit==0.3.0\r\n```\r\n\r\n### C\u00e0i \u0111\u1eb7t t\u1eeb source\r\n```bash\r\ngit clone https://github.com/tranledienlam/selenium-browserkit.git\r\ncd selenium-browserkit\r\npip install -e .\r\n```\r\n\r\n## \ud83d\ude80 Quick Start\r\n\r\n### C\u00e1ch 1: S\u1eed d\u1ee5ng Class\r\n\r\n```python\r\nfrom selenium_browserkit import BrowserManager, Node, By\r\n\r\nclass Auto:\r\n def __init__(self, node: Node, profile: dict):\r\n self.node = node\r\n self.profile = profile\r\n\r\n self.run()\r\n\r\n def run(self):\r\n # Logic t\u1ef1 \u0111\u1ed9ng ch\u00ednh\r\n self.node.go_to(\"https://www.selenium.dev\")\r\n self.node.find_and_click(By.XPATH, '//span[contains(text(),\"Download\")]')\r\n self.node.log(\"\u0110\u00e3 click v\u00e0o Download\")\r\n\r\nclass Setup:\r\n def __init__(self, node: Node, profile: dict):\r\n self.node = node\r\n self.profile = profile\r\n\r\n self.run()\r\n\r\n def run(self):\r\n # Logic thi\u1ebft l\u1eadp ban \u0111\u1ea7u\r\n self.node.go_to(\"https://www.selenium.dev\")\r\n self.node.log(\"\u0110\u00e3 m\u1edf https://www.selenium.dev\")\r\n\r\n# Kh\u1edfi t\u1ea1o v\u00e0 ch\u1ea1y\r\nmanager = BrowserManager(auto_handler=Auto, setup_handler=Setup)\r\nmanager.run_menu(profiles=[{'profile_name': 'test'}])\r\n```\r\n\r\n### C\u00e1ch 2: S\u1eed d\u1ee5ng Function\r\n\r\n```python\r\nfrom selenium_browserkit import BrowserManager, Node, By\r\n\r\ndef auto(node: Node, profile: dict):\r\n node.go_to(\"https://www.selenium.dev\")\r\n node.find_and_click(By.XPATH, '//span[contains(text(),\"Download\")]')\r\n node.log(\"\u0110\u00e3 click v\u00e0o Download\")\r\n\r\ndef setup(node: Node, profile: dict):\r\n node.go_to(\"https://www.selenium.dev\")\r\n node.log(\"\u0110\u00e3 m\u1edf https://www.selenium.dev\")\r\n\r\n# Kh\u1edfi t\u1ea1o v\u00e0 ch\u1ea1y\r\nmanager = BrowserManager(auto_handler=auto, setup_handler=setup)\r\nmanager.run_menu(profiles=[{'profile_name': 'test'}])\r\n```\r\n\r\n## \u2699\ufe0f C\u1ea5u h\u00ecnh BrowserManager\r\n\r\n### C\u1ea5u h\u00ecnh c\u01a1 b\u1ea3n\r\n\r\n```python\r\nmanager = BrowserManager(auto_handler=Auto, setup_handler=Setup)\r\n\r\n# C\u1ea5u h\u00ecnh c\u00e1c t\u00f9y ch\u1ecdn\r\nmanager.update_config(\r\n headless=False, # \u1ea8n tr\u00ecnh duy\u1ec7t\r\n disable_gpu=False, # T\u1eaft GPU\r\n sys_chrome=False, # S\u1eed d\u1ee5ng Chrome h\u1ec7 th\u1ed1ng\r\n use_tele=False, # B\u1eadt Telegram helper\r\n use_ai=False # B\u1eadt AI helper\r\n)\r\n```\r\n\r\n### Th\u00eam Extension\r\n\r\n```python\r\n# Th\u00eam extension t\u1eeb th\u01b0 m\u1ee5c extensions/\r\nmanager.add_extensions('Meta-Wallet-*.crx', 'OKX-Wallet-*.crx')\r\n```\r\n\r\n### Profile v\u1edbi Proxy\r\n\r\n```python\r\nprofiles = [\r\n {\r\n 'profile_name': 'profile1',\r\n 'proxy_info': 'ip:port@username:password' # Proxy v\u1edbi auth\r\n },\r\n {\r\n 'profile_name': 'profile2', \r\n 'proxy_info': 'ip:port' # Proxy kh\u00f4ng auth\r\n },\r\n {\r\n 'profile_name': 'profile3',\r\n 'proxy_info': 'username:password@ip:port' # Proxy auth kh\u00e1c\r\n }\r\n]\r\n\r\n# Th\u00eam proxy d\u1ef1 ph\u00f2ng (fallback)\r\n# N\u1ebfu profile kh\u00f4ng c\u00f3 proxy ho\u1eb7c proxy trong profile b\u1ecb l\u1ed7i\r\nmanager.add_proxies(\r\n \"38.153.152.244:9594\",\r\n \"38.153.152.244:9594@user:pass\",\r\n \"user:pass@38.153.152.244:9594\"\r\n)\r\n\r\nmanager.run_menu(profiles=profiles)\r\n```\r\n\r\n## \ud83d\udd27 API Reference\r\n\r\n### BrowserManager Class\r\n\r\n```python\r\nBrowserManager(auto_handler=None, setup_handler=None)\r\n```\r\n\r\n| Method | M\u00f4 t\u1ea3 |\r\n|--------|-------|\r\n| `update_config(**kwargs)` | C\u1eadp nh\u1eadt c\u1ea5u h\u00ecnh |\r\n| `add_extensions(*args)` | Th\u00eam extension Chrome |\r\n| `add_proxies(*args)` | Th\u00eam proxy |\r\n| `run_menu(profiles)` | Ch\u1ea1y v\u1edbi giao di\u1ec7n menu |\r\n\r\n### Node Class\r\n\r\n| Method | M\u00f4 t\u1ea3 |\r\n|--------|-------|\r\n| `get_driver()` | Tr\u1ea3 v\u1ec1 \u0111\u1ed1i t\u01b0\u1ee3ng Selenium WebDriver g\u1ed1c |\r\n| `go_to(url, method, wait, timeout)` | \u0110i\u1ec1u h\u01b0\u1edbng \u0111\u1ebfn URL |\r\n| `find(by, value, parent_element, wait, timeout)` | T\u00ecm element |\r\n| `find_all(by, value, parent_element, wait, timeout)` | T\u00ecm t\u1ea5t c\u1ea3 elements |\r\n| `find_and_click(by, value, parent_element, wait, timeout)` | T\u00ecm v\u00e0 click element |\r\n| `find_and_input(by, value, text, parent_element, delay, wait, timeout)` | T\u00ecm v\u00e0 nh\u1eadp text |\r\n| `click(element, wait)` | Click element |\r\n| `press_key(key, parent_element, wait, timeout)` | Nh\u1ea5n ph\u00edm |\r\n| `get_text(by, value, parent_element, wait, timeout)` | L\u1ea5y text t\u1eeb element |\r\n| `find_in_shadow(selectors, wait, timeout)` | T\u00ecm element trong shadow DOM |\r\n| `see_by_text(text, by, parent_element, wait, timeout)` | T\u00ecm element theo text |\r\n| `take_screenshot()` | Ch\u1ee5p m\u00e0n h\u00ecnh (tr\u1ea3 v\u1ec1 bytes) |\r\n| `snapshot(message, stop)` | Ch\u1ee5p v\u00e0 l\u01b0u \u1ea3nh ho\u1eb7c g\u1eedi \u0111\u1ebfn Tele (n\u1ebfu c\u00f3). N\u1ebfu `stop=True` th\u00ec s\u1ebd d\u1eebng lu\u1ed3ng code sau khi ch\u1ee5p|\r\n| `log(message, show_log)` | Ghi log |\r\n| `new_tab(url, method, wait, timeout)` | M\u1edf tab m\u1edbi |\r\n| `switch_tab(value, type, wait, timeout)` | Chuy\u1ec3n tab |\r\n| `close_tab(value, type, wait, timeout)` | \u0110\u00f3ng tab |\r\n| `reload_tab(wait)` | Reload tab hi\u1ec7n t\u1ea1i |\r\n| `get_url(wait)` | L\u1ea5y URL hi\u1ec7n t\u1ea1i |\r\n| `scroll_to_element(element, wait)` | Cu\u1ed9n \u0111\u1ebfn element |\r\n| `scroll_to_position(position, wait)` | Cu\u1ed9n \u0111\u1ebfn v\u1ecb tr\u00ed \"top\", \"middle\", \"end\" c\u1ee7a trang|\r\n| `wait_for_disappear(by, value, parent_element, wait, timeout)` | Ch\u1edd element bi\u1ebfn m\u1ea5t |\r\n| `ask_ai(prompt, is_image, wait)` | H\u1ecfi AI (Gemini) |\r\n| `execute_chain(actions, message_error)` | Th\u1ef1c hi\u1ec7n chu\u1ed7i h\u00e0nh \u0111\u1ed9ng |\r\n\r\n#### V\u00ed d\u1ee5 s\u1eed d\u1ee5ng Node\r\n\r\n```python\r\ndef auto(node: Node, profile: dict):\r\n # \u0110i\u1ec1u h\u01b0\u1edbng\r\n node.go_to(\"https://www.saucedemo.com\")\r\n \r\n # Nh\u1eadp text\r\n node.find_and_input(By.ID, \"user-name\", \"standard_user\")\r\n node.find_and_input(By.ID, \"password\", \"secret_sauce\")\r\n node.find_and_click(By.ID, \"login-button\")\r\n \r\n # Ch\u1ee5p m\u00e0n h\u00ecnh v\u00e0 l\u01b0u l\u1ea1i\r\n node.snapshot()\r\n \r\n # Ghi log\r\n node.log(\"\u0110\u00e3 \u0111\u0103ng nh\u1eadp th\u00e0nh c\u00f4ng\")\r\n```\r\n\r\n### Utility Class\r\n\r\n| Method | M\u00f4 t\u1ea3 |\r\n|--------|-------|\r\n| `wait_time(second, fix)` | Ch\u1edd th\u1eddi gian (c\u00f3 random) |\r\n| `fake_data(numbers)` | T\u1ea1o d\u1eef li\u1ec7u fake cho test |\r\n| `read_data(*field_names)` | \u0110\u1ecdc d\u1eef li\u1ec7u t\u1eeb file data.txt |\r\n| `read_config(keyname)` | \u0110\u1ecdc d\u1eef li\u1ec7u t\u1eeb file config.txt |\r\n| `timeout(second)` | T\u1ea1o h\u00e0m ki\u1ec3m tra timeout |\r\n\r\n#### V\u00ed d\u1ee5 s\u1eed d\u1ee5ng Utility\r\n\r\n```python\r\nfrom selenium_browserkit import Utility\r\n\r\n# T\u1ea1o d\u1eef li\u1ec7u fake\r\nprofiles = Utility.fake_data(5)\r\n\r\n# \u0110\u1ecdc d\u1eef li\u1ec7u t\u1eeb file data.txt\r\nprofiles = Utility.read_data('profile_name', 'email', 'password')\r\n\r\n# \u0110\u1ecdc d\u1eef li\u1ec7u t\u1eeb file config.txt\r\nproxies = Utility.read_data('PROXY')\r\n\r\n# Ch\u1edd th\u1eddi gian (c\u00f3 random \u00b140%)\r\nUtility.wait_time(5, fix=False) # Random 3-7 gi\u00e2y\r\nUtility.wait_time(5, fix=True) # Ch\u00ednh x\u00e1c 5 gi\u00e2y\r\n\r\n# Set timeout cho v\u00f2ng l\u1eb7p\r\ncheck_timeout = Utility.timeout(30)\r\nwhile check_timeout():\r\n # Th\u1ef1c hi\u1ec7n logic\r\n pass\r\n```\r\n\r\n## \ud83d\udcc1 C\u1ea5u tr\u00fac d\u1ef1 \u00e1n\r\n\r\n### Khi c\u00e0i \u0111\u1eb7t t\u1eeb PyPI\r\n```\r\nsite-packages/selenium_browserkit/\r\n\u251c\u2500\u2500 __init__.py\r\n\u251c\u2500\u2500 browser.py # BrowserManager\r\n\u251c\u2500\u2500 node.py # Node class\r\n\u2514\u2500\u2500 utils/\r\n \u251c\u2500\u2500 __init__.py\r\n \u251c\u2500\u2500 core.py # Utility functions\r\n \u2514\u2500\u2500 browser_helper.py # TeleHelper, AIHelper\r\n```\r\n\r\n### Khi s\u1eed d\u1ee5ng (trong project c\u1ee7a b\u1ea1n)\r\n```\r\nyour_project/\r\n\u251c\u2500\u2500 snapshot/ # N\u01a1i h\u00ecnh \u1ea3nh \u0111\u01b0\u1ee3c l\u01b0u (tool t\u1ea1o)\r\n\u251c\u2500\u2500 user_data/ # Browser profiles data (tool t\u1ea1o)\r\n\u251c\u2500\u2500 extensions/ # Chrome extensions (.crx) (t\u1ef1 t\u1ea1o)\r\n\u251c\u2500\u2500 config.txt # Configuration file (t\u1ef1 t\u1ea1o)\r\n\u251c\u2500\u2500 data.txt # Profiles data (t\u1ef1 t\u1ea1o)\r\n\u2514\u2500\u2500 main.py # File ch\u00ednh\r\n```\r\n\r\n## \ud83d\udcdd File c\u1ea5u h\u00ecnh\r\n\r\n### config.txt (t\u1ef1 t\u1ea1o trong project)\r\n```\r\nMAX_PROFILES=5\r\nPYTHON_PATH=E:\\venv\\Scripts\\python.exe\r\nUSER_DATA_DIR=E:\\profiles\\discord\r\nTELE_BOT=<USER_ID>|<BOT_TOKEN>|<ENDPOINT_URL (n\u1ebfu c\u00f3)>\r\nAI_BOT=<AI_BOT_TOKEN>\r\n```\r\n\r\n### data.txt (t\u1ef1 t\u1ea1o trong project)\r\n```\r\nprofile_name|email|password|proxy_info (n\u1ebfu c\u00f3)\r\ntest1|user1@example.com|pass1|ip:port@username:password\r\ntest2|user2@example.com|pass2\r\n```\r\n\r\n## \ud83e\udd16 T\u00edch h\u1ee3p AI v\u00e0 Telegram\r\n\r\n### Telegram Helper\r\n- T\u1ef1 \u0111\u1ed9ng g\u1eedi screenshot l\u00ean Telegram\r\n- G\u1eedi log v\u00e0 th\u00f4ng b\u00e1o tr\u1ea1ng th\u00e1i\r\n\r\n### AI Helper (Gemini)\r\n- Ph\u00e2n t\u00edch h\u00ecnh \u1ea3nh v\u00e0 v\u0103n b\u1ea3n\r\n- S\u1eed d\u1ee5ng `node.ask_ai()` \u0111\u1ec3 t\u01b0\u01a1ng t\u00e1c\r\n\r\n### C\u1ea5u h\u00ecnh\r\n```python\r\n# Trong config.txt\r\nTELE_BOT=123456789|bot_token_here|https://api.telegram.org\r\nAI_BOT=your_gemini_api_key\r\n\r\n# S\u1eed d\u1ee5ng\r\nmanager.update_config(use_ai=True, use_tele=True)\r\n```\r\n\r\n### V\u00ed d\u1ee5 s\u1eed d\u1ee5ng AI v\u00e0 Tele\r\n```python\r\ndef auto(node: Node, profile: dict):\r\n # Ch\u1ee5p \u1ea3nh g\u1eedi Tele\r\n node.snapshot(\"Ch\u1ee5p \u1ea3nh trang web\")\r\n # G\u1eedi \u1ea3nh v\u00e0 h\u1ecfi AI\r\n response = node.ask_ai(\"Ph\u00e2n t\u00edch n\u1ed9i dung trang web n\u00e0y\", is_image=True)\r\n node.log(f\"AI response: {response}\")\r\n```\r\n\r\n## \ud83d\udc1b Troubleshooting\r\n\r\n### L\u1ed7i th\u01b0\u1eddng g\u1eb7p\r\n\r\n1. **ChromeDriver kh\u00f4ng t\u00ecm th\u1ea5y**\r\n ```bash\r\n # C\u00e0i \u0111\u1eb7t ChromeDriver\r\n pip install webdriver-manager\r\n ```\r\n\r\n2. **Profile b\u1ecb lock**\r\n ```bash\r\n # X\u00f3a file lock\r\n rm user_data/*.pid\r\n # Ho\u1eb7c tr\u00ean Windows\r\n del user_data\\*.pid\r\n ```\r\n\r\n3. **Extension kh\u00f4ng load**\r\n - \u0110\u1ea3m b\u1ea3o file .crx n\u1eb1m trong th\u01b0 m\u1ee5c `extensions/`\r\n - Ki\u1ec3m tra t\u00ean file extension\r\n - Ki\u1ec3m tra quy\u1ec1n \u0111\u1ecdc file\r\n\r\n4. **AI/Telegram kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng**\r\n - Ki\u1ec3m tra API key trong config.txt\r\n - Ki\u1ec3m tra format c\u1ea5u h\u00ecnh TELE_BOT v\u00e0 AI_BOT\r\n\r\n## \ud83c\udd95 Update v0.3.0\r\n\r\nPhi\u00ean b\u1ea3n **0.3.0** b\u1ed5 sung v\u00e0 c\u1ea3i thi\u1ec7n c\u00e1c t\u00ednh n\u0103ng:\r\n- `scroll_to(element)` \u2013 **Removed** (thay b\u1eb1ng `scroll_to_element(element)`)\r\n- `scroll_to_element(element)` \u2013 Cu\u1ed9n \u0111\u1ebfn ph\u1ea7n t\u1eed c\u1ee5 th\u1ec3\r\n- `scroll_to_position(position)` \u2013 Cu\u1ed9n nhanh \u0111\u1ebfn `\"top\"`, `\"middle\"`, `\"end\"` c\u1ee7a trang\r\n- `get_driver()` \u2013 L\u1ea5y WebDriver g\u1ed1c \u0111\u1ec3 t\u00f9y ch\u1ec9nh n\u00e2ng cao\r\n- `add_proxies(*args)` \u2013 Th\u00eam danh s\u00e1ch proxy \u0111\u1ec3 BrowserManager t\u1ef1 \u0111\u1ed9ng qu\u1ea3n l\u00fd\r\n\r\n## \ud83d\udcc4 License\r\n\r\nMIT License - xem file [LICENSE](LICENSE) \u0111\u1ec3 bi\u1ebft th\u00eam chi ti\u1ebft.\r\n\r\n## \ud83e\udd1d Contributing\r\n\r\nM\u1ecdi \u0111\u00f3ng g\u00f3p \u0111\u1ec1u \u0111\u01b0\u1ee3c ch\u00e0o \u0111\u00f3n! Vui l\u00f2ng:\r\n\r\n1. Fork repository\r\n2. T\u1ea1o feature branch\r\n3. Commit changes\r\n4. Push to branch\r\n5. T\u1ea1o Pull Request\r\n\r\n## \ud83d\udcde Support\r\n\r\n- \ud83d\udce7 Email: lam.tranledien@gmail.com\r\n- \ud83d\udc1b Issues: [GitHub Issues](https://github.com/tranledienlam/selenium-browserkit/issues)\r\n- \ud83d\udcd6 Documentation: [Wiki](https://github.com/tranledienlam/selenium-browserkit/wiki) (Ch\u01b0a c\u1eadp nh\u1eadt)\r\n\r\n---\r\n\r\n## \ud83d\udd17 Th\u00f4ng tin li\u00ean h\u1ec7\r\n\r\n\ud83d\udce2 **Telegram Channel:** [Airdrop Automation](https://t.me/+8o9ebAT9ZSFlZGNl)\r\n\r\n\ud83d\udcb0 **\u1ee6ng h\u1ed9 t\u00e1c gi\u1ea3:**\r\n\r\n- **EVM:** `0x3b3784f7b0fed3a8ecdd46c80097a781a6afdb09`\r\n- **SOL:** `4z3JQNeTnMSHYeg9FjRmXYrQrPHBnPg3zNKisAJjobSP`\r\n- **TON:** `UQDKgC6TesJJU9TilGYoZfj5YYtIzePhdzSDJTctJ-Z27lkR`\r\n- **SUI:** `0x5fb56584bf561a4a0889e35a96ef3e6595c7ebd13294be436ad61eaf04be4b09`\r\n- **APT (APTOS):** `0x557ea46189398da1ddf817a634fa91cfb54a32cfc22cadd98bb0327c880bac19`\r\n\r\n\ud83d\ude4f Khi \u1ee7ng h\u1ed9, n\u1ebfu kh\u00f4ng th\u1ea5y phi\u1ec1n, B\u1ea1n c\u00f3 th\u1ec3 g\u1eedi token ch\u00ednh c\u1ee7a m\u1ea1ng. C\u00e1m \u01a1n B\u1ea1n \u0111\u00e3 h\u1ed7 tr\u1ee3!\r\n\r\n---\r\n**Made with \u2764\ufe0f by Tran Lam**\r\n",
"bugtrack_url": null,
"license": null,
"summary": "A toolkit for Selenium automation with multi-profile support",
"version": "0.3.0",
"project_urls": {
"Homepage": "https://github.com/tranledienlam/selenium-browserkit",
"Issues": "https://github.com/tranledienlam/selenium-browserkit/issues"
},
"split_keywords": [
"selenium",
" automation",
" browser",
" profile",
" toolkit"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "8e086f2d6321d61a15e0e2ed97116808869008cae97673425c070ced777e0f4b",
"md5": "225b6da82a0d61c88e1163325f7df2ef",
"sha256": "6750fb7660b662ea48f53d4ee8fb3b835ad28e20abbab778f65226ac8f0b5e0a"
},
"downloads": -1,
"filename": "selenium_browserkit-0.3.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "225b6da82a0d61c88e1163325f7df2ef",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 39363,
"upload_time": "2025-09-20T06:22:14",
"upload_time_iso_8601": "2025-09-20T06:22:14.074360Z",
"url": "https://files.pythonhosted.org/packages/8e/08/6f2d6321d61a15e0e2ed97116808869008cae97673425c070ced777e0f4b/selenium_browserkit-0.3.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "41715794afda31003a8bf42c41c4b22de2805f9fb3ae5972d5341ea257bf85e2",
"md5": "cad4b39976fb5a2dbea03867033ddd21",
"sha256": "6177cc6ae4234cd70fb330fc415ed2ba26cabc9ee3b7b2b613dab30fff38a772"
},
"downloads": -1,
"filename": "selenium_browserkit-0.3.0.tar.gz",
"has_sig": false,
"md5_digest": "cad4b39976fb5a2dbea03867033ddd21",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 41503,
"upload_time": "2025-09-20T06:22:15",
"upload_time_iso_8601": "2025-09-20T06:22:15.424993Z",
"url": "https://files.pythonhosted.org/packages/41/71/5794afda31003a8bf42c41c4b22de2805f9fb3ae5972d5341ea257bf85e2/selenium_browserkit-0.3.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-20 06:22:15",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "tranledienlam",
"github_project": "selenium-browserkit",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "selenium",
"specs": [
[
"==",
"4.36.0"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.32.5"
]
]
},
{
"name": "screeninfo",
"specs": [
[
"==",
"0.8.1"
]
]
},
{
"name": "pillow",
"specs": [
[
"==",
"11.3.0"
]
]
},
{
"name": "google-genai",
"specs": [
[
"==",
"1.36.0"
]
]
},
{
"name": "blinker",
"specs": [
[
"==",
"1.9.0"
]
]
},
{
"name": "psutil",
"specs": [
[
"==",
"7.0.0"
]
]
}
],
"lcname": "selenium-browserkit"
}