# ตัวเฝ้าดูอินเทอร์เฟซ (Interface Monitor)

Monitor ใช้สำหรับเฝ้าดูการเปลี่ยนแปลงของอินเทอร์เฟซแบบเรียลไทม์ และเมื่อตรงตามเงื่อนไขที่กำหนดไว้ล่วงหน้า จะดำเนินการที่กำหนดไว้ เช่น การคลิกองค์ประกอบ, การกดปุ่ม, หรือการบันทึกจำนวนครั้งที่เกิดขึ้น คุณสามารถเข้าใจได้ว่ามันคือการทำงานพื้นฐานของฟังก์ชันเช่น **Li Tiaotiao** หรือแอปที่คล้ายกันซึ่งใช้ในการข้ามโฆษณาโดยอัตโนมัติ เนื่องจากฟังก์ชันนี้จะทำการคลิกหรือกดปุ่มโดยอัตโนมัติ อาจทำให้เกิดการกระทำที่ไม่คาดคิดเมื่อต้องการให้ผู้ใช้เข้ามาควบคุมเอง ดังนั้นโปรดใช้งานด้วยความระมัดระวัง

```{tip}
โดยปกติแล้ว การลงทะเบียน monitor และ event ควรทำที่จุดเริ่มต้นของสคริปต์ และโดยทั่วไปจะไม่ทำอีกในระหว่างการทำงาน
```

## การเปิดใช้งานตัวเฝ้าดู

อินเทอร์เฟซต่อไปนี้จะเปิดใช้งานตัวเฝ้าดูอินเทอร์เฟซ โดยค่าเริ่มต้นตัวเฝ้าดูจะอยู่ในสถานะปิดใช้งาน

```{attention}
การดำเนินการใดๆ ที่ตรงกับ event ที่เกิดขึ้นบนอินเทอร์เฟซก่อนที่จะเปิดใช้งานตัวเฝ้าดูหรือเปิดใช้งาน event จะไม่ถูกประมวลผล!
```

```python
d.set_watcher_loop_enabled(True)
```

## การตรวจสอบสถานะการเปิดใช้งานของตัวเฝ้าดู

คุณสามารถใช้อินเทอร์เฟซต่อไปนี้เพื่อตรวจสอบว่าตัวเฝ้าดูอินเทอร์เฟซปัจจุบันเปิดใช้งานอยู่หรือไม่

```python
d.get_watcher_loop_enabled()
```

## การปิดใช้งานตัวเฝ้าดู

ปิดลูปของตัวเฝ้าดู จะไม่มีการประมวลผล event ที่ลงทะเบียนไว้โดยอัตโนมัติอีกต่อไป เช่น การคลิก

```python
d.set_watcher_loop_enabled(False)
```

```{attention}
การลงทะเบียน event เฝ้าดูมากเกินไปอาจส่งผลกระทบต่อประสิทธิภาพของระบบหรือความเร็วในการตอบสนองของการทำงาน
```

## การลบตัวเฝ้าดูทั้งหมด

ลบ event เฝ้าดูทั้งหมดที่ได้นำไปใช้แล้ว เพื่อล้างกฎที่ใช้โดยสคริปต์ก่อนหน้าหรือที่ถูกขัดจังหวะอย่างผิดปกติ ขอแนะนำให้รันคำสั่งนี้ทุกครั้งก่อนเริ่มสคริปต์เพื่อป้องกันไม่ให้ event ที่ลงทะเบียนโดยงานก่อนหน้าส่งผลกระทบต่อกระบวนการทำงานปัจจุบัน

```python
d.remove_all_watchers()
```

## การลงทะเบียน Click Event

Click event จะทำการคลิกโดยอัตโนมัติเมื่อมี selector ที่ตรงกันปรากฏขึ้นบนอินเทอร์เฟซ ตัวอย่างเช่น การข้ามหน้าต่างป๊อปอัปของซอฟต์แวร์โดยอัตโนมัติ เช่น ข้อตกลงการใช้งาน, การแจ้งเตือนการอัปเดต หรือการคลิกอัตโนมัติบนอินเทอร์เฟซที่เฉพาะเจาะจง

```{attention}
การดำเนินการใดๆ ที่ตรงกับ event ที่เกิดขึ้นบนอินเทอร์เฟซก่อนที่จะเปิดใช้งานตัวเฝ้าดูหรือเปิดใช้งาน event จะไม่ถูกประมวลผล!
```

```python
d.register_click_target_selector_watcher("ClickAcceptWhenShowAggrement", [Selector(textContains="用户协议")], Selector(textContains="同意", clickable=True))
```

```{hint}
พารามิเตอร์ที่สองรองรับ Selector หลายตัว หมายความว่า event จะถูกประมวลผลก็ต่อเมื่อเงื่อนไขของ Selector ทั้งหมดตรงกัน
```

เมื่อลงทะเบียน event ดังกล่าว เมื่ออินเทอร์เฟซที่มีข้อความ "用户协议" (ข้อตกลงผู้ใช้) ปรากฏขึ้น จะทำการคลิกปุ่ม "同意" (ยอมรับ) โดยอัตโนมัติ

## การลงทะเบียน Key Press Event

Key press event จะทำการกดปุ่มโดยอัตโนมัติเมื่อมี selector ที่ตรงกันปรากฏขึ้นบนอินเทอร์เฟซ เช่น การกดปุ่มย้อนกลับอัตโนมัติ ซึ่งสามารถหลีกเลี่ยงการเข้าสู่บางหน้าจอได้โดยอัตโนมัติ แน่นอนว่าการใช้ click event ก็สามารถบรรลุผลลัพธ์เดียวกันได้

```{attention}
การดำเนินการใดๆ ที่ตรงกับ event ที่เกิดขึ้นบนอินเทอร์เฟซก่อนที่จะเปิดใช้งานตัวเฝ้าดูหรือเปิดใช้งาน event จะไม่ถูกประมวลผล!
```

```python
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(textContains="个人中心")], Keys.KEY_HOME)
```

```{hint}
พารามิเตอร์ที่สองรองรับ Selector หลายตัว หมายความว่า event จะถูกประมวลผลก็ต่อเมื่อเงื่อนไขของ Selector ทั้งหมดตรงกัน
```

เมื่อลงทะเบียน event ดังกล่าว เมื่ออินเทอร์เฟซที่มีข้อความ "个人中心" (ศูนย์ส่วนตัว) ปรากฏขึ้น จะทำการกดปุ่ม HOME ของโทรศัพท์โดยอัตโนมัติ

## การลงทะเบียน Count Event

Count event คือการเพิ่มตัวนับขึ้น 1 เมื่อมีการดำเนินการที่ตรงกับ selector บางอย่างปรากฏขึ้นบนอินเทอร์เฟซ เมื่อมีข้อมูลสำคัญที่ปรากฏขึ้นและหายไปอย่างรวดเร็วบนหน้าจอ คุณสามารถใช้ฟังก์ชันนี้เพื่อนับว่าอินเทอร์เฟซบางอย่างเคยปรากฏขึ้นหรือไม่ หรือปรากฏขึ้นกี่ครั้ง

```{attention}
การดำเนินการใดๆ ที่ตรงกับ event ที่เกิดขึ้นบนอินเทอร์เฟซก่อนที่จะเปิดใช้งานตัวเฝ้าดูหรือเปิดใช้งาน event จะไม่ถูกประมวลผล!
```

```python
d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="好的")])
```

```{hint}
พารามิเตอร์ที่สองรองรับ Selector หลายตัว หมายความว่า event จะถูกประมวลผลก็ต่อเมื่อเงื่อนไขของ Selector ทั้งหมดตรงกัน
```

event ข้างต้นจะบันทึกจำนวนครั้งที่อินเทอร์เฟซที่มีข้อความ "好的" (ตกลง) ปรากฏขึ้น ใช้ินเทอร์เฟซต่อไปนี้เพื่อรับจำนวนครั้งที่ count event ถูกทริกเกอร์

```python
d.get_watcher_triggered_count("RecordElementAppearTimes")
```

## การเปิดใช้งาน Event

หลังจากลงทะเบียน event แล้ว จะต้องเปิดใช้งานเพื่อให้ event นั้นถูกลงทะเบียนในลูปของตัวเฝ้าดูอินเทอร์เฟซ มิฉะนั้นจะไม่มีผล

```{attention}
การดำเนินการใดๆ ที่ตรงกับ event ที่เกิดขึ้นบนอินเทอร์เฟซก่อนที่จะเปิดใช้งานตัวเฝ้าดูหรือเปิดใช้งาน event จะไม่ถูกประมวลผล!
```

```python
d.set_watcher_enabled("RecordElementAppearTimes", True)
```


## การปิดใช้งาน Event

คุณสามารถเรียกใช้อินเทอร์เฟซต่อไปนี้เพื่อให้ตัวเฝ้าดูอินเทอร์เฟซยกเลิกการเฝ้าดู event ที่ระบุ

```{attention}
การดำเนินการใดๆ ที่ตรงกับ event ที่เกิดขึ้นบนอินเทอร์เฟซก่อนที่จะเปิดใช้งานตัวเฝ้าดูหรือเปิดใช้งาน event จะไม่ถูกประมวลผล!
```

```python
d.set_watcher_enabled("RecordElementAppearTimes", False)
```

## การลบ Event

ลบ event ออกจากตัวเฝ้าดูโดยสมบูรณ์ และจะถูกลบออกจากรายการ event ที่ลงทะเบียนไว้ด้วย

```python
d.remove_watcher(name)
```

## การตรวจสอบสถานะการเปิดใช้งานของ Event

เรียกใช้อินเทอร์เฟซต่อไปนี้เพื่อตรวจสอบว่า event ถูกเปิดใช้งานอย่างถูกต้องหรือไม่ เพื่อป้องกันกรณีที่ลงทะเบียนแล้วแต่ไม่ได้เปิดใช้งาน

```python
d.get_watcher_enabled(name)
```

## Advanced Selector

นอกจากการรองรับ selector แบบง่ายแล้ว คุณยังสามารถใช้ selector ที่ซับซ้อนมากขึ้นเพื่อจับคู่องค์ประกอบได้อีกด้วย ตัวอย่างต่อไปนี้แสดงวิธีการเขียน selector ที่ซับซ้อน

```python
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(resourceId="com.android.market:id/v_app_item").child(index=3).sibling(index=2).child(index=2).child()], Keys.KEY_HOME)
```

## โค้ดตัวอย่างฉบับสมบูรณ์

ด้านล่างนี้คือบล็อกโค้ดตัวอย่าง ซึ่งเปิดใช้งานลูปของตัวเฝ้าดูและลงทะเบียน event เฝ้าดูสามประเภท เมื่ออินเทอร์เฟซที่มีข้อความ "用户协议" (ข้อตกลงผู้ใช้) ปรากฏขึ้น จะทำการคลิก "ยอมรับ" โดยอัตโนมัติ, เมื่ออินเทอร์เฟซที่มีข้อความ "个人中心" (ศูนย์ส่วนตัว) ปรากฏขึ้น จะกลับไปที่หน้าจอหลักทันที, และเมื่ออินเทอร์เฟซที่มีข้อความ "好的" (ตกลง) ปรากฏขึ้น จะบันทึกจำนวนครั้งที่อินเทอร์เฟซนี้ปรากฏ

```{attention}
การดำเนินการใดๆ ที่ตรงกับ event ที่เกิดขึ้นบนอินเทอร์เฟซก่อนที่จะเปิดใช้งานตัวเฝ้าดูหรือเปิดใช้งาน event จะไม่ถูกประมวลผล!
```

```python
d.remove_all_watchers()
d.set_watcher_loop_enabled(True)

d.register_click_target_selector_watcher("ClickAcceptWhenShowAggrement", [Selector(textContains="用户协议")],
                                         Selector(textContains="同意", clickable=True))
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(textContains="个人中心")], Keys.KEY_HOME)
d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="好的")])

d.set_watcher_enabled("ClickAcceptWhenShowAggrement", True)
d.set_watcher_enabled("PressBackWhenHomePageShows", True)
d.set_watcher_enabled("RecordElementAppearTimes", True)
```