1#![allow(clippy::all, missing_docs, unused_imports)]
5
6use serde::{Deserialize, Serialize};
7
8use super::*;
9use crate::playwright::connection::{
10 Binary, Channel, ChannelType, ObjectRef, ProtocolError, ProtocolEvent, Ref,
11};
12
13#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
15pub struct AndroidDeviceInitializer {
16 #[serde(rename = "model")]
17 pub model: String,
18 #[serde(rename = "serial")]
19 pub serial: String,
20}
21
22#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
23pub enum AndroidDeviceWaitParamsState {
24 #[default]
25 #[serde(rename = "gone")]
26 Gone,
27}
28
29#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
31pub struct AndroidDeviceWaitParams {
32 #[serde(rename = "androidSelector")]
33 pub android_selector: AndroidSelector,
34 #[serde(rename = "state", default, skip_serializing_if = "Option::is_none")]
35 pub state: Option<AndroidDeviceWaitParamsState>,
36}
37
38#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
40pub struct AndroidDeviceFillParams {
41 #[serde(rename = "androidSelector")]
42 pub android_selector: AndroidSelector,
43 #[serde(rename = "text")]
44 pub text: String,
45}
46
47#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
49pub struct AndroidDeviceTapParams {
50 #[serde(rename = "androidSelector")]
51 pub android_selector: AndroidSelector,
52 #[serde(rename = "duration", default, skip_serializing_if = "Option::is_none")]
53 pub duration: Option<f64>,
54}
55
56#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
58pub struct AndroidDeviceDragParams {
59 #[serde(rename = "androidSelector")]
60 pub android_selector: AndroidSelector,
61 #[serde(rename = "dest")]
62 pub dest: Point,
63 #[serde(rename = "speed", default, skip_serializing_if = "Option::is_none")]
64 pub speed: Option<f64>,
65}
66
67#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
68pub enum AndroidDeviceFlingParamsDirection {
69 #[default]
70 #[serde(rename = "up")]
71 Up,
72 #[serde(rename = "down")]
73 Down,
74 #[serde(rename = "left")]
75 Left,
76 #[serde(rename = "right")]
77 Right,
78}
79
80#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
82pub struct AndroidDeviceFlingParams {
83 #[serde(rename = "androidSelector")]
84 pub android_selector: AndroidSelector,
85 #[serde(rename = "direction")]
86 pub direction: AndroidDeviceFlingParamsDirection,
87 #[serde(rename = "speed", default, skip_serializing_if = "Option::is_none")]
88 pub speed: Option<f64>,
89}
90
91#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
93pub struct AndroidDeviceLongTapParams {
94 #[serde(rename = "androidSelector")]
95 pub android_selector: AndroidSelector,
96}
97
98#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
100pub struct AndroidDevicePinchCloseParams {
101 #[serde(rename = "androidSelector")]
102 pub android_selector: AndroidSelector,
103 #[serde(rename = "percent")]
104 pub percent: f64,
105 #[serde(rename = "speed", default, skip_serializing_if = "Option::is_none")]
106 pub speed: Option<f64>,
107}
108
109#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
111pub struct AndroidDevicePinchOpenParams {
112 #[serde(rename = "androidSelector")]
113 pub android_selector: AndroidSelector,
114 #[serde(rename = "percent")]
115 pub percent: f64,
116 #[serde(rename = "speed", default, skip_serializing_if = "Option::is_none")]
117 pub speed: Option<f64>,
118}
119
120#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
121pub enum AndroidDeviceScrollParamsDirection {
122 #[default]
123 #[serde(rename = "up")]
124 Up,
125 #[serde(rename = "down")]
126 Down,
127 #[serde(rename = "left")]
128 Left,
129 #[serde(rename = "right")]
130 Right,
131}
132
133#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
135pub struct AndroidDeviceScrollParams {
136 #[serde(rename = "androidSelector")]
137 pub android_selector: AndroidSelector,
138 #[serde(rename = "direction")]
139 pub direction: AndroidDeviceScrollParamsDirection,
140 #[serde(rename = "percent")]
141 pub percent: f64,
142 #[serde(rename = "speed", default, skip_serializing_if = "Option::is_none")]
143 pub speed: Option<f64>,
144}
145
146#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
147pub enum AndroidDeviceSwipeParamsDirection {
148 #[default]
149 #[serde(rename = "up")]
150 Up,
151 #[serde(rename = "down")]
152 Down,
153 #[serde(rename = "left")]
154 Left,
155 #[serde(rename = "right")]
156 Right,
157}
158
159#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
161pub struct AndroidDeviceSwipeParams {
162 #[serde(rename = "androidSelector")]
163 pub android_selector: AndroidSelector,
164 #[serde(rename = "direction")]
165 pub direction: AndroidDeviceSwipeParamsDirection,
166 #[serde(rename = "percent")]
167 pub percent: f64,
168 #[serde(rename = "speed", default, skip_serializing_if = "Option::is_none")]
169 pub speed: Option<f64>,
170}
171
172#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
174pub struct AndroidDeviceInfoParams {
175 #[serde(rename = "androidSelector")]
176 pub android_selector: AndroidSelector,
177}
178
179#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
181pub struct AndroidDeviceInfoResult {
182 #[serde(rename = "info")]
183 pub info: AndroidElementInfo,
184}
185
186#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
188pub struct AndroidDeviceScreenshotResult {
189 #[serde(rename = "binary")]
190 pub binary: Binary,
191}
192
193#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
195pub struct AndroidDeviceInputTypeParams {
196 #[serde(rename = "text")]
197 pub text: String,
198}
199
200#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
202pub struct AndroidDeviceInputPressParams {
203 #[serde(rename = "key")]
204 pub key: String,
205}
206
207#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
209pub struct AndroidDeviceInputTapParams {
210 #[serde(rename = "point")]
211 pub point: Point,
212}
213
214#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
216pub struct AndroidDeviceInputSwipeParams {
217 #[serde(rename = "segments")]
218 pub segments: Vec<Point>,
219 #[serde(rename = "steps")]
220 pub steps: i64,
221}
222
223#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
225pub struct AndroidDeviceInputDragParams {
226 #[serde(rename = "from")]
227 pub from: Point,
228 #[serde(rename = "to")]
229 pub to: Point,
230 #[serde(rename = "steps")]
231 pub steps: i64,
232}
233
234#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
235pub struct AndroidDeviceLaunchBrowserParamsProxy {
236 #[serde(rename = "server")]
237 pub server: String,
238 #[serde(rename = "bypass", default, skip_serializing_if = "Option::is_none")]
239 pub bypass: Option<String>,
240 #[serde(rename = "username", default, skip_serializing_if = "Option::is_none")]
241 pub username: Option<String>,
242 #[serde(rename = "password", default, skip_serializing_if = "Option::is_none")]
243 pub password: Option<String>,
244}
245
246#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
248pub struct AndroidDeviceLaunchBrowserParams {
249 #[serde(flatten)]
251 pub context_options: ContextOptions,
252 #[serde(rename = "pkg", default, skip_serializing_if = "Option::is_none")]
253 pub pkg: Option<String>,
254 #[serde(rename = "args", default, skip_serializing_if = "Option::is_none")]
255 pub args: Option<Vec<String>>,
256 #[serde(rename = "proxy", default, skip_serializing_if = "Option::is_none")]
257 pub proxy: Option<AndroidDeviceLaunchBrowserParamsProxy>,
258}
259
260#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
262pub struct AndroidDeviceLaunchBrowserResult {
263 #[serde(rename = "context")]
264 pub context: Ref<BrowserContext>,
265}
266
267#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
269pub struct AndroidDeviceOpenParams {
270 #[serde(rename = "command")]
271 pub command: String,
272}
273
274#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
276pub struct AndroidDeviceOpenResult {
277 #[serde(rename = "socket")]
278 pub socket: Ref<AndroidSocket>,
279}
280
281#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
283pub struct AndroidDeviceShellParams {
284 #[serde(rename = "command")]
285 pub command: String,
286}
287
288#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
290pub struct AndroidDeviceShellResult {
291 #[serde(rename = "result")]
292 pub result: Binary,
293}
294
295#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
297pub struct AndroidDeviceInstallApkParams {
298 #[serde(rename = "file")]
299 pub file: Binary,
300 #[serde(rename = "args", default, skip_serializing_if = "Option::is_none")]
301 pub args: Option<Vec<String>>,
302}
303
304#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
306pub struct AndroidDevicePushParams {
307 #[serde(rename = "file")]
308 pub file: Binary,
309 #[serde(rename = "path")]
310 pub path: String,
311 #[serde(rename = "mode", default, skip_serializing_if = "Option::is_none")]
312 pub mode: Option<i64>,
313}
314
315#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
317pub struct AndroidDeviceConnectToWebViewParams {
318 #[serde(rename = "socketName")]
319 pub socket_name: String,
320}
321
322#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
324pub struct AndroidDeviceConnectToWebViewResult {
325 #[serde(rename = "context")]
326 pub context: Ref<BrowserContext>,
327}
328
329#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
331pub struct AndroidDeviceWebViewAddedEventParams {
332 #[serde(rename = "webView")]
333 pub web_view: AndroidWebView,
334}
335
336#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
338pub struct AndroidDeviceWebViewRemovedEventParams {
339 #[serde(rename = "socketName")]
340 pub socket_name: String,
341}
342
343#[derive(Debug, Clone, PartialEq)]
345pub enum AndroidDeviceEvent {
346 Close,
348 WebViewAdded(AndroidDeviceWebViewAddedEventParams),
350 WebViewRemoved(AndroidDeviceWebViewRemovedEventParams),
352 Unknown {
354 method: String,
356 params: serde_json::Value,
358 },
359}
360
361impl ProtocolEvent for AndroidDeviceEvent {
362 fn parse(method: &str, params: serde_json::Value) -> Result<Self, serde_json::Error> {
363 match method {
364 "close" => Ok(Self::Close),
365 "webViewAdded" => Ok(Self::WebViewAdded(serde_json::from_value(params)?)),
366 "webViewRemoved" => Ok(Self::WebViewRemoved(serde_json::from_value(params)?)),
367 _ => Ok(Self::Unknown { method: method.to_string(), params }),
368 }
369 }
370}
371
372#[derive(Debug, Clone)]
374pub struct AndroidDevice {
375 channel: Channel,
376}
377
378impl ChannelType for AndroidDevice {
379 const INTERFACE: &'static str = "AndroidDevice";
380 type Initializer = AndroidDeviceInitializer;
381 type Event = AndroidDeviceEvent;
382
383 fn accepts(interface: &str) -> bool {
384 matches!(interface, "AndroidDevice")
385 }
386
387 fn from_channel(channel: Channel) -> Self {
388 Self { channel }
389 }
390
391 fn channel(&self) -> &Channel {
392 &self.channel
393 }
394}
395
396impl AndroidDevice {
397 pub async fn wait(&self, params: AndroidDeviceWaitParams) -> Result<(), ProtocolError> {
399 self.channel.send_no_result("wait", ¶ms).await
400 }
401
402 pub async fn fill(&self, params: AndroidDeviceFillParams) -> Result<(), ProtocolError> {
404 self.channel.send_no_result("fill", ¶ms).await
405 }
406
407 pub async fn tap(&self, params: AndroidDeviceTapParams) -> Result<(), ProtocolError> {
409 self.channel.send_no_result("tap", ¶ms).await
410 }
411
412 pub async fn drag(&self, params: AndroidDeviceDragParams) -> Result<(), ProtocolError> {
414 self.channel.send_no_result("drag", ¶ms).await
415 }
416
417 pub async fn fling(&self, params: AndroidDeviceFlingParams) -> Result<(), ProtocolError> {
419 self.channel.send_no_result("fling", ¶ms).await
420 }
421
422 pub async fn long_tap(&self, params: AndroidDeviceLongTapParams) -> Result<(), ProtocolError> {
424 self.channel.send_no_result("longTap", ¶ms).await
425 }
426
427 pub async fn pinch_close(&self, params: AndroidDevicePinchCloseParams) -> Result<(), ProtocolError> {
429 self.channel.send_no_result("pinchClose", ¶ms).await
430 }
431
432 pub async fn pinch_open(&self, params: AndroidDevicePinchOpenParams) -> Result<(), ProtocolError> {
434 self.channel.send_no_result("pinchOpen", ¶ms).await
435 }
436
437 pub async fn scroll(&self, params: AndroidDeviceScrollParams) -> Result<(), ProtocolError> {
439 self.channel.send_no_result("scroll", ¶ms).await
440 }
441
442 pub async fn swipe(&self, params: AndroidDeviceSwipeParams) -> Result<(), ProtocolError> {
444 self.channel.send_no_result("swipe", ¶ms).await
445 }
446
447 pub async fn info(&self, params: AndroidDeviceInfoParams) -> Result<AndroidDeviceInfoResult, ProtocolError> {
449 self.channel.send("info", ¶ms).await
450 }
451
452 pub async fn screenshot(&self) -> Result<AndroidDeviceScreenshotResult, ProtocolError> {
454 self.channel.send("screenshot", &serde_json::json!({})).await
455 }
456
457 pub async fn input_type(&self, params: AndroidDeviceInputTypeParams) -> Result<(), ProtocolError> {
459 self.channel.send_no_result("inputType", ¶ms).await
460 }
461
462 pub async fn input_press(&self, params: AndroidDeviceInputPressParams) -> Result<(), ProtocolError> {
464 self.channel.send_no_result("inputPress", ¶ms).await
465 }
466
467 pub async fn input_tap(&self, params: AndroidDeviceInputTapParams) -> Result<(), ProtocolError> {
469 self.channel.send_no_result("inputTap", ¶ms).await
470 }
471
472 pub async fn input_swipe(&self, params: AndroidDeviceInputSwipeParams) -> Result<(), ProtocolError> {
474 self.channel.send_no_result("inputSwipe", ¶ms).await
475 }
476
477 pub async fn input_drag(&self, params: AndroidDeviceInputDragParams) -> Result<(), ProtocolError> {
479 self.channel.send_no_result("inputDrag", ¶ms).await
480 }
481
482 pub async fn launch_browser(&self, params: AndroidDeviceLaunchBrowserParams) -> Result<AndroidDeviceLaunchBrowserResult, ProtocolError> {
484 self.channel.send("launchBrowser", ¶ms).await
485 }
486
487 pub async fn open(&self, params: AndroidDeviceOpenParams) -> Result<AndroidDeviceOpenResult, ProtocolError> {
489 self.channel.send("open", ¶ms).await
490 }
491
492 pub async fn shell(&self, params: AndroidDeviceShellParams) -> Result<AndroidDeviceShellResult, ProtocolError> {
494 self.channel.send("shell", ¶ms).await
495 }
496
497 pub async fn install_apk(&self, params: AndroidDeviceInstallApkParams) -> Result<(), ProtocolError> {
499 self.channel.send_no_result("installApk", ¶ms).await
500 }
501
502 pub async fn push(&self, params: AndroidDevicePushParams) -> Result<(), ProtocolError> {
504 self.channel.send_no_result("push", ¶ms).await
505 }
506
507 pub async fn connect_to_web_view(&self, params: AndroidDeviceConnectToWebViewParams) -> Result<AndroidDeviceConnectToWebViewResult, ProtocolError> {
509 self.channel.send("connectToWebView", ¶ms).await
510 }
511
512 pub async fn close(&self) -> Result<(), ProtocolError> {
514 self.channel.send_no_result("close", &serde_json::json!({})).await
515 }
516}