# emulator
package này hỗ trợ điều khiển các phần mềm giả lập (Hiện tại chỉ hỗ trợ phần mềm LDPlayer)
## Installation
```bash
pip install emulator-thw
```
---
## Usage
### Example started
LDPlayer
```python
import emulator
ld = emulator.LDPlayer(ldplayer_dir="C:/LDPlayer/LDPlayer4.0")
print(ld.emulators)
```
có hai cách để lấy ldplayer trong `LDPlayer` là dùng `index` `ld.emulators[0]` hoặc dùng `name` `ld.emulator["LDPlayer"]`. Tôi khuyên bạn nên sử dụng index, vì name có thể trùng lặp dẫn tới điều khiển sai ldplayer.
tạo ldplayer mới
```python
em = ld.new("New-LDPlayer")
em.start()
```
xóa ldplayer
```python
em_remove = ld.emulators[0]
ld.remove(em_remove)
```
sao chép ldplayer
```python
em_copy = ld.emulators[0]
ld.copy(em_copy)
```
sắp xếp các cửa sổ ldplayer
```python
for em in ld.emulators:
em.start(wait=False)
ld.sort_window()
```
tạo các hành động
```python
em = ld.emulator[0]
em.start()
em.tap((100, 100)) # code từng dòng
em.wait(3).swipe((200, 100), (10, 100)).wait(3).quit() # code 1 chuỗi hành động
```
Bỏ qua `quit()` bằng cách sử dụng `with`
```python
with ld.emulators[0].start() as em:
em.tap((100, 100))
```
---
## List methods
Danh sách các phương thức có thể sử dụng
- [start](#start)
- [wait_to_started](#wait_to_started)
- [is_running](#is_running)
- [restart](#restart)
- [rename](#rename)
- [list_packages](#list_packages)
- [install_app](#install_app)
- [uninstall_app](#uninstall_app)
- [run_app](#run_app)
- [kill_app](#kill_app)
- [clear_app](#clear_app)
- [set_locate](#set_locate)
- [update_properties](#update_properties)
- [get_properties](#get_properties)
- [setting](#setting)
- [down_cpu](#down_cpu)
- [backup](#backup)
- [restore](#restore)
- [action](#action)
- [scan](#scan)
- [pull](#pull)
- [push](#push)
- [capture](#capture)
- [adb_connected](#adb_connected)
- [tap](#tap)
- [tap_to_img](#tap_to_img)
- [tap_to_imgs](#tap_to_imgs)
- [wait_img_existed](#wait_img_existed)
- [swipe](#swipe)
- [send_text](#send_text)
- [send_event](#send_event)
- [home](#home)
- [back](#back)
- [app_switcher](#app_switcher)
- [dump_xml](#dump_xml)
- [find_node](#find_node)
- [find_nodes](#find_nodes)
- [wait](#wait)
- [hide](#hide)
- [show](#show)
- [quit](#quit)
---
### start
Khởi chạy emulator. Nếu tham số `wait=True` sẽ gọi phương thức `wait_to_stared()`.
```python
em.start(wait=True)
```
### wait_to_started
Chờ cho quá trình khởi chạy hoàn tất (thực chất là chờ kết nối ADB).
```python
em.wait_to_started()
```
### is_running
Trả về `True` nếu emulator đang chạy ngược lại `False`
```python
em.is_running()
```
### restart
Khởi chạy lại emulator, tham số `wait` tương tự `start()`
```python
em.restart(wait=True)
```
### rename
Đổi tên emulator thành `new_name`
```python
em.rename(new_name="New-Name-LDPlayer")
```
### list_packages
trả về danh sách các package đã cài đặt trên thiết bị
```python
packages = em.list_packages()
print(packages)
```
### install_app
Cài đặt ứng dụng, `source` có thể là đường dẫn tới file `.apk` hoặc `package name`
```python
em.install_app(source="example_app.apk")
```
### uninstall_app
Gỡ cài đặt ứng dụng có package name tương ứng. Xem thêm về [list_packages](#listpackages)
```python
em.uninstall_app(package_name="com.example.app")
```
### run_app
Mở dứng dụng có package name tương ứng. Xem thêm về [list_packages](#listpackages)
```python
em.run_app(package_name="com.android.chrome")
```
### kill_app
Dừng dứng dụng có package name tương ứng. Xem thêm về [list_packages](#listpackages)
```python
em.kill_app(package_name="com.android.chrome")
```
### clear_app
Xóa data của ứng dụng có package name tương ứng. Xem thêm về [list_packages](#listpackages)
```python
em.clear_app(package_name="com.android.chrome")
```
### set_locate
Cài đặt locate
```python
em.set_locate(locate="locate")
```
### update_properties
Cập nhật thông tin thiết bị, tham số prop là 1 `dict` với key là tên property và value là giá trị tương ứng
```python
em.update_properties(prop)
```
### get_properties
Trả về 1 `dict` với key là tên property và value là giá trị property
```python
prop = em.get_properties()
print(prop)
```
### setting
cài đặt thông số emlator, tham số là 1 EmulatorOptions
```python
import emulator
from emulator.option import EmulatorOptions
ld = emulator.LDPlayer("path/to/ldplayer/")
options = EmulatorOptions()
options.set_resolution(width=128, height=240, dpi=120)
em = ld.emulators[0]
em.setting(options)
em.start()
```
### down_cpu
```python
em.down_cpu(rate=50)
```
### backup
Tạo file backup emulator
```python
em.backup(file_path="C:/backup.ldbk")
```
### restore
```python
em.restore(file_path="C:/backup.ldbk")
```
### action
```python
actions = {"action": "value"}
em.action(actions=actions)
```
### scan
```python
em.scan(file_path="C:/scan.png")
```
### pull
Đưa file `remote` từ emulator về PC thành `local`
```python
em.pull(remote="sdcard/remote.txt", local="C:/local.txt")
```
### push
Đưa file `local` từ PC lên emulator thành `remote`
```python
em.push(local="C:/local.txt", remote="sdcard/remote.txt")
```
### capture
Chụp ảnh màn hình và lưu thành `as_file`
```python
em.capture(as_file="path/to/save_as.png")
```
### adb_connected
Trả về `True` nếu ADB đã kết nối với emulator ngược lại `False`. Bạn sẽ cần bật **ADB debugging** để kết nối ADB
```python
em.adb_connected()
```
### tap
Nhấn vào vị trí pos là 1 tuple hoặc dict có dạng `(x, y)`. Có thể truyền vào nhiều pos để tap nhiều lần vào nhiều vị trí khác nhau.
```python
em.tap((200, 200))
em.tap((150, 200), (250, 250))
```
### tap_to_img
Nhấp vào hình ảnh khớp với hình ảnh được cho. `timeout` là thời gian chờ hình xuất hiện nếu nhỏ hơn 0 sẽ chờ vô hạn mặc định `timeout=0`, `threshold` là độ chính xác khi tìm kiếm, nằm trong khoảng từ 0 tới 1 mặc định `threshold=0.8`.
```python
em.tap_to_img(img_path="path/to/img", timeout=0, threshold=0.8)
```
### tap_to_imgs
Nhấn vào tất cả hình ảnh khớp với hình ảnh được cho. `timeout` là thời gian chờ hình xuất hiện nếu nhỏ hơn 0 sẽ chờ vô hạn mặc định `timeout=0`, `threshold` là độ chính xác khi tìm kiếm, nằm trong khoảng từ 0 tới 1 mặc định `threshold=0.8`.
```python
em.tap_to_imgs(img_path="path/to/img", timeout=0, threshold=0.8)
```
### wait_img_existed
Chờ cho tới khi hình ảnh xuất hiện trên màn hình, chờ tối đa `timeout` giây, nếu `timeout=0` sẽ chờ vô hạn cho tới khi có hình ảnh. `threshold` là độ chính xác khi tìm kiếm nằm trong khoảng 0 tới 1 mặc định `threshold=0.8`.
```python
em.wait_img_existed(img_path="path/to/img", timeout=0, threshold=0.8)
```
### swipe
Vuốt từ vị trí `_from` tới vị trí `to` trong khoảng thời gian `duration` millisecond.
```python
em.swipe(_from=(100, 200), to=(500, 200), duration=100)
```
### send_text
Gửi đoạn văn bản `text`.
```python
em.send_text(text)
```
### send_event
Gửi event tới emulator
```python
import emulator
from emulator import keys
ld = emulator.LDPlayer("path/to/ldplayer dir")
em = ld.emulators[0].start()
em.wait(5).send_event(keys.KEYCODE_CALL)
```
### home
Nhấn vào nút home
```python
em.home()
```
### back
Nhấn vào nút back
```python
em.back()
```
### app_switcher
Nhấn vào nút app switcher
```python
em.app_switcher()
```
### dump_xml
Lưu window_dump thành file
```python
em.dump_xml(as_file="path/local.xml")
```
### find_node
Trả về `Node` đầu tiên trong window_dump có giá trị khớp với giá trị đã cho, nếu tìm được trả về `None`
```python
import emulator
from emulator.node import By
ld = emulator.LDPlayer("path/to/ldplayer")
em = ld.emulator[0].start().wait(10)
em.find_node(By.TEXT, "node text")
```
### find_nodes
Trả về một `list` là tất cả các node trong window_dump có giá trị khới với gía trị đã cho
```python
import emulator
from emulator.node import By
ld = emulator.LDPlayer("path/to/ldplayer")
em = ld.emulators[0].start().wait(10)
nodes = em.find_nodes(By.TEXT, "text node")
```
### wait
Dừng chương trình trong second giây
```python
em.wait(second)
```
### hide
Ẩn emulator
```python
em.hide()
```
### show
Hiển thị emulator
```python
em.show()
```
### quit
Tắt emulator
```python
em.quit()
```