Appium proxy: Kiểm thử ứng dụng di động qua proxy
Appium proxy là cách cho thiết bị di động hoặc giả lập đi Internet qua máy chủ proxy trong lúc chạy kiểm thử tự động bằng Appium. Đội kiểm thử cần cấu hình này khi muốn xem ứng dụng hiển thị gì với người dùng ở vùng khác, bắt và kiểm tra lưu lượng mạng của ứng dụng, hoặc làm việc trong mạng công ty bắt buộc qua proxy. Bài này ProxyVN giải thích hai lớp proxy khi dùng Appium, cách cài cho Android, iOS, giả lập, cách kết hợp công cụ bắt lưu lượng và cách sửa lỗi hay gặp. Xem thêm dịch vụ tại ProxyVN.
Tổng quan về Appium proxy
Appium là bộ công cụ mã nguồn mở để tự động hoá kiểm thử ứng dụng di động gốc, ứng dụng lai và trình duyệt trên Android, iOS. Mã kiểm thử viết bằng Java, Python, JavaScript hay ngôn ngữ khác, gửi lệnh theo giao thức WebDriver tới máy chủ Appium, máy chủ chuyển lệnh tới thiết bị qua driver như UiAutomator2 cho Android hoặc XCUITest cho iOS. Tài liệu chính thức có ở trang tài liệu Appium.
Khi nói tới proxy trong Appium, nhiều người nhầm giữa hai chuyện khác nhau: proxy cho thiết bị để ứng dụng đi Internet qua IP khác, và cơ chế máy chủ Appium "proxy" lệnh tới driver bên trong. Cái đầu là proxy mạng, cái sau là chuyển tiếp lệnh nội bộ. Bài này tập trung vào proxy mạng, nhưng có giải thích lỗi liên quan tới cơ chế chuyển tiếp lệnh vì thông báo lỗi có chữ proxy rất dễ gây hiểu lầm.
Khi nào cần Appium proxy
- Kiểm thử theo vùng: ứng dụng hiển thị giá, ngôn ngữ, khuyến mãi, nội dung khác nhau theo quốc gia hoặc tỉnh thành của IP.
- Bắt lưu lượng mạng: kiểm tra ứng dụng gọi API nào, gửi dữ liệu gì, có rò rỉ thông tin không.
- Giả lập mạng xấu: cho lưu lượng đi qua công cụ có thể làm chậm, cắt kết nối để xem ứng dụng xử lý ra sao.
- Mạng công ty bắt buộc proxy: thiết bị kiểm thử trong phòng lab chỉ ra Internet qua proxy.
- Kiểm tra quảng cáo và theo dõi: xem SDK quảng cáo, phân tích gửi sự kiện đúng hay không.
Những gì Appium không tự làm
Appium không có tuỳ chọn chung kiểu "đặt proxy cho thiết bị". Proxy của thiết bị được cài ở hệ điều hành thiết bị hoặc giả lập, Appium chỉ điều khiển giao diện. Một số khả năng (capability) cho phép truyền tham số tới trình duyệt trên thiết bị, nhưng không phải proxy toàn thiết bị. Hiểu điểm này giúp anh em không mất thời gian tìm tuỳ chọn không tồn tại.
Hai lớp cấu hình trong Appium proxy
Toàn bộ hệ thống kiểm thử có nhiều chặng mạng. Mỗi chặng có thể cần proxy riêng.

Hai lớp proxy khi dùng Appium
Lớp 1: mã kiểm thử tới máy chủ Appium
Mã kiểm thử gửi lệnh HTTP tới máy chủ Appium, thường ở localhost:4723 hoặc một máy chủ trong phòng lab. Nếu máy chạy mã có biến môi trường HTTP_PROXY, thư viện client có thể đẩy cả lệnh tới Appium qua proxy và thất bại. Cần thêm địa chỉ máy chủ Appium vào danh sách không dùng proxy. Đây là lỗi hay gặp khi chạy kiểm thử trên máy công ty.
Lớp 2: thiết bị tới Internet
Ứng dụng trên thiết bị gọi API, tải nội dung. Đây là lớp mà phần lớn anh em quan tâm khi nói Appium proxy. Proxy cài trên thiết bị hoặc giả lập quyết định ứng dụng nhìn thấy Internet từ IP nào.
Lớp phụ: máy chủ Appium tới thiết bị đám mây
Khi dùng dịch vụ thiết bị đám mây, máy chủ Appium nằm ở phía nhà cung cấp, mã kiểm thử gửi lệnh qua Internet. Một số nhà cung cấp có tuỳ chọn riêng để thiết bị đi qua proxy của khách hoặc qua đường hầm về mạng công ty. Phần này phụ thuộc từng dịch vụ, anh em đọc tài liệu của nhà cung cấp đang dùng. Khái niệm điện thoại chạy trên đám mây được giải thích trong bài cloud phone là gì.
Cài Appium proxy cho thiết bị Android
Android có nhiều cách đặt proxy. Với kiểm thử tự động, cách dùng adb là tiện nhất vì chạy được trong mã chuẩn bị trước mỗi lượt kiểm thử.

Cài proxy cho Android bằng adb
Đặt proxy toàn cục bằng adb
Lệnh sau đặt proxy HTTP cho thiết bị, áp dụng cho các ứng dụng tôn trọng proxy hệ thống:
adb shell settings put global http_proxy 103.x.x.x:8080
Kiểm tra lại bằng lệnh adb shell settings get global http_proxy. Thông tin về adb có trong tài liệu Android Debug Bridge. Cách này không hỗ trợ tài khoản mật khẩu, nên proxy cần xác thực bằng IP whitelist, hoặc đi qua một proxy trung gian chạy trên máy tính.
Gỡ proxy sau kiểm thử
adb shell settings put global http_proxy :0
Quên gỡ là lỗi phổ biến: thiết bị kiểm thử giữ proxy cũ, ngày hôm sau người khác dùng thiết bị thì không ra mạng. Đưa lệnh gỡ vào phần dọn dẹp sau mỗi lượt kiểm thử, kể cả khi kiểm thử thất bại.
Đặt proxy trong cài đặt Wi-Fi
Cách thủ công: vào Wi-Fi, sửa mạng đang kết nối, chọn proxy thủ công, điền host và port. Cách này hợp khi chuẩn bị thiết bị một lần cho cả đợt kiểm thử. Các bước chi tiết theo từng dòng máy có trong bài cài proxy cho Android.
Dùng adb reverse cho proxy chạy trên máy tính
Khi chạy công cụ bắt lưu lượng như mitmproxy trên máy tính ở cổng 8080, thiết bị nối dây USB có thể truy cập cổng đó qua lệnh adb reverse tcp:8080 tcp:8080. Sau đó đặt proxy thiết bị là 127.0.0.1:8080. Cách này không phụ thuộc thiết bị và máy tính có cùng mạng Wi-Fi hay không, rất tiện trong phòng lab nhiều mạng. Ý nghĩa của địa chỉ 127.0.0.1 trong cấu hình proxy được giải thích trong bài proxy 127.0.0.1.
Ứng dụng không tôn trọng proxy hệ thống
Một số ứng dụng, đặc biệt dùng thư viện mạng riêng hoặc Flutter, bỏ qua proxy hệ thống. Lưu lượng của chúng đi thẳng dù đã đặt proxy. Khi gặp trường hợp này, cần dùng ứng dụng VPN cục bộ chuyển mọi lưu lượng vào proxy, hoặc yêu cầu đội phát triển thêm tuỳ chọn proxy trong bản kiểm thử. Trường hợp Flutter được nói riêng trong bài Flutter proxy.
Cài Appium proxy cho giả lập Android
Giả lập Android trong Android Studio có cách đặt proxy riêng, linh hoạt hơn thiết bị thật.
Tham số -http-proxy khi khởi động
emulator -avd Pixel_7_API_34 -http-proxy http://user:matkhau@103.x.x.x:8080
Tham số này đặt proxy cho toàn bộ lưu lượng HTTP và HTTPS của giả lập, hỗ trợ cả tài khoản mật khẩu. Cách giả lập xử lý mạng được mô tả trong trang Set up Android Emulator networking. Với kiểm thử tự động, có thể truyền tham số này qua capability avdArgs của driver UiAutomator2 để Appium tự khởi động giả lập kèm proxy.
Địa chỉ đặc biệt 10.0.2.2
Từ bên trong giả lập, địa chỉ 10.0.2.2 trỏ tới máy tính chạy giả lập. Proxy chạy trên máy tính ở cổng 8080 thì trong giả lập đặt proxy là 10.0.2.2:8080. Đặt 127.0.0.1 sẽ trỏ vào chính giả lập và không kết nối được.
Giả lập khác
Genymotion, BlueStacks, LDPlayer có cách cài proxy riêng. Genymotion hay được dùng cho kiểm thử, hướng dẫn có trong bài cài proxy cho Genymotion. Với kiểm thử tự động bằng Appium, giả lập chính thức của Android Studio vẫn là lựa chọn ổn định nhất.
Cài Appium proxy cho iOS
iOS kiểm soát chặt hơn Android. Không có lệnh dòng lệnh tương đương adb để đặt proxy cho thiết bị thật.
Thiết bị iPhone thật
Đặt proxy trong Cài đặt, Wi-Fi, chọn mạng đang dùng, Cấu hình proxy, Thủ công, điền máy chủ, cổng, và có thể bật xác thực với tài khoản mật khẩu. Proxy này áp dụng cho mạng Wi-Fi đó, ứng dụng dùng mạng hệ thống sẽ đi qua. Các bước chi tiết có trong bài cách cài proxy trên iPhone.
Cấu hình bằng hồ sơ quản lý
Phòng lab nhiều iPhone có thể dùng hồ sơ cấu hình hoặc công cụ quản lý thiết bị để đẩy cấu hình proxy hàng loạt. Cách này đòi hỏi thiết bị được giám sát, phù hợp với đội kiểm thử lớn.
Trình giả lập iOS
Simulator trên macOS dùng mạng của máy Mac, nên đi theo proxy hệ thống của macOS. Muốn Simulator đi qua proxy, đặt proxy trong System Settings của Mac. Lưu ý thay đổi này ảnh hưởng tới cả máy Mac, nên nên dùng một vị trí mạng riêng cho kiểm thử. Cách cài proxy cho macOS có trong bài cách cài proxy trên macOS.
Trình duyệt Safari trong kiểm thử
Khi kiểm thử web trên Safari của iPhone qua Appium, Safari dùng proxy của thiết bị. Không có capability để đặt proxy riêng cho Safari. Mọi cấu hình đều nằm ở Wi-Fi của thiết bị.
Appium proxy cho trình duyệt Chrome trên Android
Khi kiểm thử web trên Chrome di động, có thêm lựa chọn đặt proxy riêng cho trình duyệt thay vì cả thiết bị.
Truyền tham số qua chromeOptions
Capability goog:chromeOptions cho phép truyền tham số khởi động Chrome, trong đó có --proxy-server=http://103.x.x.x:8080. Chỉ Chrome đi qua proxy, các ứng dụng khác trên thiết bị không bị ảnh hưởng. Danh sách capability được mô tả trong trang Capabilities của Appium.
Giới hạn
Tham số --proxy-server không hỗ trợ tài khoản mật khẩu trực tiếp. Với proxy cần xác thực, dùng IP whitelist hoặc proxy trung gian trên máy tính. Một số bản Chrome trên Android có thể bỏ qua tham số dòng lệnh nếu thiết bị không bật chế độ gỡ lỗi phù hợp, kiểm tra bằng cách mở trang trả về IP ngay đầu kiểm thử.
So sánh với Selenium trên máy tính
Cách đặt proxy cho Chrome qua chromeOptions giống với Selenium trên máy tính. Nếu anh em đã quen Selenium, bài cài đặt Selenium Python proxy có các mẫu cấu hình dùng lại được.
Bắt lưu lượng ứng dụng bằng Appium proxy
Một trong những lý do chính để đặt proxy trong kiểm thử di động là quan sát ứng dụng gửi và nhận gì.

Bắt lưu lượng ứng dụng
Dùng mitmproxy
Chạy mitmproxy trên máy tính, đặt proxy thiết bị trỏ về máy tính, cài chứng chỉ của mitmproxy lên thiết bị. Mọi yêu cầu HTTPS của ứng dụng sẽ hiện trong giao diện mitmproxy. mitmproxy còn có thể chạy kịch bản Python để kiểm tra tự động: ví dụ khẳng định ứng dụng gọi đúng API sau khi bấm nút. Hướng dẫn cài đặt có trong bài mitmproxy là gì.
Dùng Charles
Charles có giao diện đồ hoạ quen thuộc, phù hợp kiểm thử thủ công song song với tự động. Cách cài Charles cho Android có trong bài sử dụng Charles proxy theo dõi traffic trên Android.
Chứng chỉ trên Android 7 trở lên
Từ Android 7, ứng dụng mặc định không tin chứng chỉ do người dùng cài. Chứng chỉ của công cụ bắt lưu lượng chỉ có tác dụng với ứng dụng khai báo tin chứng chỉ người dùng trong cấu hình bảo mật mạng. Cách đúng là yêu cầu đội phát triển thêm cấu hình này cho bản debug, không áp dụng cho bản phát hành. Trên giả lập có quyền root, có thể cài chứng chỉ vào kho hệ thống, nhưng cách này chỉ dùng cho môi trường kiểm thử.
Ứng dụng ghim chứng chỉ
Ứng dụng có ghim chứng chỉ (certificate pinning) sẽ từ chối kết nối qua công cụ bắt lưu lượng. Đây là tính năng bảo mật đúng thiết kế. Với bản kiểm thử nội bộ, đội phát triển có thể tạo bản tắt ghim chứng chỉ. Không nên tìm cách vượt ghim chứng chỉ trên ứng dụng của bên khác.
Kết hợp bắt lưu lượng với proxy mua
Chạy mitmproxy ở chế độ upstream để nó chuyển tiếp lưu lượng qua proxy mua. Thiết bị đi qua mitmproxy, mitmproxy đi tiếp qua proxy có IP theo vùng. Anh em vừa thấy chi tiết từng yêu cầu, vừa có ứng dụng nhìn thấy IP đúng vùng cần kiểm thử. Đây cũng là cách đưa proxy có mật khẩu vào thiết bị Android vốn không hỗ trợ mật khẩu qua adb.
Kiểm thử theo vùng bằng Appium proxy
Ứng dụng phục vụ nhiều thị trường cần kiểm tra giao diện, giá, nội dung ở từng vùng. Proxy là cách đơn giản nhất để giả lập vị trí mạng của người dùng.

Kiểm thử theo vùng IP
Chuẩn bị proxy theo vùng
Mỗi vùng một proxy, ví dụ Việt Nam, Thái Lan, Mỹ. Với thị trường Việt Nam, có thể cần proxy theo nhà mạng hoặc theo tỉnh vì một số ứng dụng phân biệt nội dung ở mức này. Nếu cần IP Việt Nam theo nhà mạng Viettel, VNPT, FPT cho kiểm thử, anh em có thể mua proxy tại ProxyVN.
Đổi proxy giữa các lượt kiểm thử
Viết hàm chuẩn bị nhận tên vùng, đặt proxy tương ứng bằng adb hoặc khởi động giả lập với -http-proxy tương ứng. Chạy cùng bộ kiểm thử cho từng vùng và lưu ảnh chụp màn hình theo tên vùng để so sánh. Cách nhắm IP theo vùng được giải thích trong bài geo-targeting proxy là gì.
IP không phải yếu tố duy nhất
Ứng dụng còn xác định vùng qua ngôn ngữ thiết bị, múi giờ, vị trí GPS, quốc gia của SIM và tài khoản cửa hàng ứng dụng. Chỉ đổi IP mà giữ múi giờ Việt Nam thì ứng dụng có thể vẫn hiển thị nội dung Việt Nam. Appium có lệnh đặt vị trí GPS giả cho giả lập, còn ngôn ngữ và múi giờ đổi qua capability hoặc adb. Tầm quan trọng của việc đồng bộ múi giờ với IP có trong bài đồng bộ múi giờ với IP proxy.
Xác nhận IP ngay đầu kiểm thử
Bước đầu tiên của mỗi lượt kiểm thử theo vùng nên là mở trang trả về IP và vị trí, đọc kết quả bằng Appium, so với vùng mong muốn. Nếu sai, dừng lượt kiểm thử thay vì chạy tiếp với kết quả vô nghĩa.
Sửa lỗi thường gặp với Appium proxy
Lỗi trong kiểm thử di động qua proxy thường đến từ ba nguồn: proxy, chứng chỉ, và nhầm lẫn với cơ chế chuyển tiếp lệnh của Appium.
Lỗi could not proxy command to the remote server
Thông báo dạng "Could not proxy command to the remote server. Original error: socket hang up" hay "ECONNREFUSED" không liên quan tới proxy mạng. Máy chủ Appium chuyển lệnh tới máy chủ UiAutomator2 hoặc WebDriverAgent chạy trên thiết bị, lỗi nghĩa là máy chủ trên thiết bị đã dừng hoặc không trả lời. Nguyên nhân hay gặp: ứng dụng làm treo driver, thiết bị thiếu bộ nhớ, cổng bị chiếm, phiên bản driver không tương thích. Cách sửa là khởi động lại phiên, cập nhật driver, tăng thời gian chờ, kiểm tra log thiết bị. Đừng đi sửa cấu hình proxy mạng khi gặp lỗi này.
Bảng lỗi khác
Hiện tượng |
Nguyên nhân khả dĩ |
Cách sửa |
|---|---|---|
Ứng dụng báo không có mạng |
Proxy sai, proxy cần mật khẩu mà adb không hỗ trợ |
Kiểm tra proxy, dùng whitelist hoặc proxy trung gian |
Mã kiểm thử không kết nối được Appium |
Biến HTTP_PROXY đẩy lệnh qua proxy |
Thêm localhost vào NO_PROXY |
Thấy lưu lượng HTTP nhưng HTTPS lỗi |
Chưa tin chứng chỉ của công cụ bắt lưu lượng |
Cài chứng chỉ, cấu hình bảo mật mạng bản debug |
Một ứng dụng đi thẳng dù đặt proxy |
Ứng dụng bỏ qua proxy hệ thống |
Dùng VPN cục bộ hoặc tuỳ chọn trong bản kiểm thử |
Giả lập không ra mạng |
Đặt 127.0.0.1 thay vì 10.0.2.2 |
Đổi địa chỉ proxy |
Thiết bị hôm sau mất mạng |
Quên gỡ proxy |
Chạy lệnh gỡ trong bước dọn dẹp |
Ghi log mạng song song log Appium
Khi một kiểm thử thất bại, đặt log Appium cạnh log của công cụ bắt lưu lượng theo thời gian. Thường thấy ngay ứng dụng đã gọi API nào, nhận lỗi gì trước khi giao diện báo lỗi. Cách này giúp phân biệt lỗi do ứng dụng, do proxy hay do mã kiểm thử.
Bảo mật dữ liệu khi dùng Appium proxy
Proxy và công cụ bắt lưu lượng nhìn thấy nhiều dữ liệu của ứng dụng. Trong môi trường kiểm thử, dữ liệu này có thể gồm tài khoản thử nghiệm, mã truy cập API, thậm chí dữ liệu thật nếu kiểm thử trên môi trường gần với bản phát hành.
Dùng tài khoản và dữ liệu thử nghiệm
Không đăng nhập tài khoản thật của khách hàng hay nhân viên khi chạy kiểm thử qua proxy hoặc công cụ bắt lưu lượng. Tạo bộ tài khoản riêng cho kiểm thử, giới hạn quyền, có thể xoá bất cứ lúc nào.
Chọn proxy đáng tin
Lưu lượng HTTPS qua đường hầm vẫn được mã hoá, proxy chỉ thấy tên miền. Nhưng nếu ứng dụng còn gọi địa chỉ HTTP thường, proxy đọc được toàn bộ nội dung. Proxy miễn phí trôi nổi là lựa chọn rủi ro cho việc này. Rủi ro cụ thể được phân tích trong bài proxy miễn phí có an toàn không.
Gỡ chứng chỉ sau khi xong
Chứng chỉ của công cụ bắt lưu lượng cài trên thiết bị cho phép bất kỳ ai có khoá riêng của chứng chỉ đó đọc lưu lượng HTTPS. Thiết bị dùng chung trong phòng lab nên được gỡ chứng chỉ khi không còn kiểm thử bắt lưu lượng, hoặc dành riêng vài thiết bị cho việc này.
Appium proxy trong quy trình CI
Kiểm thử di động thường chạy trên máy chủ tích hợp liên tục. Proxy trong môi trường này cần được tự động hoá bằng mã, không dựa vào thao tác tay.
Đưa cấu hình proxy vào biến của pipeline
Lưu địa chỉ proxy theo vùng trong biến bí mật của hệ thống CI. Mã chuẩn bị đọc biến và đặt proxy cho thiết bị hoặc giả lập trước khi chạy. Không ghi mật khẩu proxy trong kho mã.
Khởi động giả lập kèm proxy
Trên máy chủ CI không có giao diện, giả lập chạy ở chế độ không cửa sổ với tham số -no-window cùng -http-proxy. Mỗi job một giả lập sạch giúp tránh proxy còn sót từ job trước.
Dọn dẹp bắt buộc
Dù job thành công hay thất bại, bước dọn dẹp luôn chạy để gỡ proxy trên thiết bị thật dùng chung. Với giả lập, xoá luôn sau job là cách gọn nhất.
So sánh Appium proxy với công cụ kiểm thử khác
Mỗi công cụ kiểm thử có cách đặt proxy khác nhau. Bảng dưới giúp đội kiểm thử chọn đúng cách.
Công cụ |
Đối tượng |
Cách đặt proxy |
|---|---|---|
Appium |
Ứng dụng di động, trình duyệt di động |
Trên thiết bị, giả lập hoặc chromeOptions |
Selenium |
Trình duyệt máy tính |
Tham số trình duyệt |
Cypress |
Ứng dụng web |
Biến môi trường HTTP_PROXY |
Katalon |
Web, di động, API |
Cài đặt proxy trong công cụ |
Chi tiết cho từng công cụ có trong các bài Cypress proxy và Katalon proxy.
Câu hỏi thường gặp về Appium proxy
Appium có capability đặt proxy cho cả thiết bị không
Không có capability chung cho mọi ứng dụng trên thiết bị. Proxy toàn thiết bị cài bằng adb, cài đặt Wi-Fi hoặc tham số giả lập. Capability chỉ giúp truyền tham số cho trình duyệt hoặc giả lập do Appium khởi động.
Đặt proxy có mật khẩu cho Android qua adb được không
Lệnh settings put global http_proxy không nhận tài khoản mật khẩu. Dùng proxy xác thực bằng IP whitelist, hoặc chạy proxy trung gian trên máy tính như mitmproxy chế độ upstream để nó tự gửi mật khẩu tới proxy mua.
Kiểm thử theo vùng có cần SIM nước ngoài không
Phần lớn trường hợp chỉ cần IP, ngôn ngữ, múi giờ và vị trí phù hợp. Một số ứng dụng kiểm tra quốc gia của SIM hoặc nhà mạng, khi đó cần thiết bị thật có SIM hoặc dịch vụ thiết bị đám mây ở vùng đó.
Proxy làm kiểm thử chậm đi bao nhiêu
Proxy thêm một chặng mạng, thường tăng vài chục tới vài trăm mili giây mỗi yêu cầu tuỳ khoảng cách. Chọn proxy gần máy chủ API của ứng dụng để giảm độ trễ, và tăng thời gian chờ trong mã kiểm thử cho phù hợp.
Tổng kết
Appium proxy cần tách rõ hai lớp: lệnh từ mã kiểm thử tới máy chủ Appium, và lưu lượng từ thiết bị ra Internet. Android đặt proxy bằng adb hoặc tham số -http-proxy của giả lập, iOS đặt trong Wi-Fi hoặc qua proxy của máy Mac, còn lỗi could not proxy command là lỗi driver chứ không phải lỗi proxy mạng. Cần IP Việt Nam ổn định để kiểm thử ứng dụng theo vùng, anh em liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam để được tư vấn.