pub struct ClientBuilder<C, Caps>{ /* private fields */ }
Expand description
Client builder
Use this struct to build Appium client. This struct has methods that will guide you through all necessary things needed to construct a client.
Do not create an instance of Client yourself, use this builder.
Implementations§
Source§impl<Caps> ClientBuilder<HttpsConnector<HttpConnector>, Caps>where
Caps: AppiumCapability,
impl<Caps> ClientBuilder<HttpsConnector<HttpConnector>, Caps>where
Caps: AppiumCapability,
Sourcepub fn native(
capabilities: Caps,
) -> ClientBuilder<HttpsConnector<HttpConnector>, Caps>
pub fn native( capabilities: Caps, ) -> ClientBuilder<HttpsConnector<HttpConnector>, Caps>
Examples found in repository?
examples/scroll.rs (line 13)
9async fn main() -> Result<(), Box<dyn std::error::Error>> {
10 let mut capabilities = AndroidCapabilities::new_uiautomator();
11 capabilities.app("https://github.com/appium/android-apidemos/releases/download/v3.1.0/ApiDemos-debug.apk");
12
13 let client = ClientBuilder::native(capabilities)
14 .connect("http://localhost:4723/")
15 .await?;
16
17 // Go to a screen with a long list
18 client.find_by(By::accessibility_id("Views"))
19 .await?
20 .click()
21 .await?;
22
23 // Let's calculate some things first
24 let (width, height) = client.get_window_size().await?;
25
26 // This is the horizontal center, it will be our x for swipe.
27 let horizontal_center = (width / 2) as i64;
28
29 // The swipe will start at 80% of screen height, and end at 20% of screen height.
30 // So we will swipe UP through most of the screen.
31 let almost_top = (height as f64 * 0.2) as i64;
32 let almost_bottom = (height as f64 * 0.8) as i64;
33
34 let swipe_down = TouchActions::new("finger".to_string())
35 // position the finger first
36 .then(PointerAction::MoveTo {
37 duration: Some(Duration::from_millis(0)),
38 x: horizontal_center,
39 y: almost_bottom,
40 })
41 // THEN touch the screen
42 .then(PointerAction::Down {
43 button: MOUSE_BUTTON_LEFT // believe me, it is not a mouse, but a simple touch
44 })
45 // THEN move the finger through the screen
46 .then(PointerAction::MoveTo {
47 duration: Some(Duration::from_millis(500)),
48 x: horizontal_center,
49 y: almost_top,
50 });
51
52 client.perform_actions(swipe_down)
53 .await?;
54
55 Ok(())
56}
More examples
examples/find_by.rs (line 23)
10async fn main() -> Result<(), Box<dyn std::error::Error>> {
11 // Capabilities describe the automation environment,
12 // for example: what app are we testing
13 let mut capabilities = AndroidCapabilities::new();
14 capabilities.app("https://github.com/appium/android-apidemos/releases/download/v3.1.0/ApiDemos-debug.apk");
15
16 // To add custom capability that is not supported by this library just use "insert".
17 // Alternatively, there are helpful functions like "set_bool", "set_str".
18 // You can read more about capabilities on Appium website - https://appium.io/docs/en/2.1/guides/caps/.
19 capabilities.set_str("appium:automationName", "uiautomator2");
20 capabilities.set_bool("appium:fullReset", true);
21
22 // To start automation, you need to build a client.
23 let client = ClientBuilder::native(capabilities)
24 .connect("http://localhost:4723/")
25 .await?;
26
27 // The app should automatically start, let's print the DOM of current app screen.
28 let value = client.source().await?;
29 println!("{value}");
30
31 // Screen orientation is another Appium perk
32 let orientation = client.orientation().await?;
33 println!("Screen orientation: {orientation}");
34
35 // Now we try to locate a button using UiAutomator API.
36 // Notice that the program will wait until the button appears on screen (but maximum of 30 seconds).
37 let views_button = client
38 .appium_wait()
39 .for_element(By::uiautomator("new UiSelector().text(\"Views\");"))
40 .await?;
41
42 views_button.click().await?;
43
44 // Search for a vec of elements, because we know that there will be more than one result.
45 // Notice that this time we don't wait, just find everything that's on screen as is.
46 let menu_elements = client
47 .find_all_by(By::uiautomator("new UiSelector().className(\"android.widget.TextView\");"))
48 .await?;
49
50 menu_elements.get(1)
51 .unwrap()
52 .click()
53 .await?;
54
55 // To add a timeout for wait, use "at_most".
56 // "check_every" limits how often Appium has to perform the search during wait.
57 //
58 // Sometimes it's better to use one or both of those methods, because:
59 // 1) We know that something should appear sooner, and if it doesn't, we don't want to wait full 30 seconds.
60 // 2) We don't want to slow down Appium server by checking again too often.
61 let element = client
62 .appium_wait()
63 .at_most(Duration::from_secs(20))
64 .check_every(Duration::from_millis(500))
65 .for_element(By::class_name("android.widget.ListView"))
66 .await?;
67
68 // This is a simple search for one element, without waiting for it to appear. And then we click on it.
69 // Notice that we are searching for an element inside "element" (which is a ListView).
70 element
71 .find_by(By::accessibility_id("3D Transition"))
72 .await?
73 .click()
74 .await?;
75
76 Ok(())
77}
Source§impl<C, Caps> ClientBuilder<C, Caps>
impl<C, Caps> ClientBuilder<C, Caps>
pub fn new( builder: ClientBuilder<C>, capabilities: Caps, ) -> ClientBuilder<C, Caps>
Sourcepub async fn connect(
&self,
webdriver: &str,
) -> Result<Client<Caps>, NewSessionError>
pub async fn connect( &self, webdriver: &str, ) -> Result<Client<Caps>, NewSessionError>
Examples found in repository?
examples/scroll.rs (line 14)
9async fn main() -> Result<(), Box<dyn std::error::Error>> {
10 let mut capabilities = AndroidCapabilities::new_uiautomator();
11 capabilities.app("https://github.com/appium/android-apidemos/releases/download/v3.1.0/ApiDemos-debug.apk");
12
13 let client = ClientBuilder::native(capabilities)
14 .connect("http://localhost:4723/")
15 .await?;
16
17 // Go to a screen with a long list
18 client.find_by(By::accessibility_id("Views"))
19 .await?
20 .click()
21 .await?;
22
23 // Let's calculate some things first
24 let (width, height) = client.get_window_size().await?;
25
26 // This is the horizontal center, it will be our x for swipe.
27 let horizontal_center = (width / 2) as i64;
28
29 // The swipe will start at 80% of screen height, and end at 20% of screen height.
30 // So we will swipe UP through most of the screen.
31 let almost_top = (height as f64 * 0.2) as i64;
32 let almost_bottom = (height as f64 * 0.8) as i64;
33
34 let swipe_down = TouchActions::new("finger".to_string())
35 // position the finger first
36 .then(PointerAction::MoveTo {
37 duration: Some(Duration::from_millis(0)),
38 x: horizontal_center,
39 y: almost_bottom,
40 })
41 // THEN touch the screen
42 .then(PointerAction::Down {
43 button: MOUSE_BUTTON_LEFT // believe me, it is not a mouse, but a simple touch
44 })
45 // THEN move the finger through the screen
46 .then(PointerAction::MoveTo {
47 duration: Some(Duration::from_millis(500)),
48 x: horizontal_center,
49 y: almost_top,
50 });
51
52 client.perform_actions(swipe_down)
53 .await?;
54
55 Ok(())
56}
More examples
examples/find_by.rs (line 24)
10async fn main() -> Result<(), Box<dyn std::error::Error>> {
11 // Capabilities describe the automation environment,
12 // for example: what app are we testing
13 let mut capabilities = AndroidCapabilities::new();
14 capabilities.app("https://github.com/appium/android-apidemos/releases/download/v3.1.0/ApiDemos-debug.apk");
15
16 // To add custom capability that is not supported by this library just use "insert".
17 // Alternatively, there are helpful functions like "set_bool", "set_str".
18 // You can read more about capabilities on Appium website - https://appium.io/docs/en/2.1/guides/caps/.
19 capabilities.set_str("appium:automationName", "uiautomator2");
20 capabilities.set_bool("appium:fullReset", true);
21
22 // To start automation, you need to build a client.
23 let client = ClientBuilder::native(capabilities)
24 .connect("http://localhost:4723/")
25 .await?;
26
27 // The app should automatically start, let's print the DOM of current app screen.
28 let value = client.source().await?;
29 println!("{value}");
30
31 // Screen orientation is another Appium perk
32 let orientation = client.orientation().await?;
33 println!("Screen orientation: {orientation}");
34
35 // Now we try to locate a button using UiAutomator API.
36 // Notice that the program will wait until the button appears on screen (but maximum of 30 seconds).
37 let views_button = client
38 .appium_wait()
39 .for_element(By::uiautomator("new UiSelector().text(\"Views\");"))
40 .await?;
41
42 views_button.click().await?;
43
44 // Search for a vec of elements, because we know that there will be more than one result.
45 // Notice that this time we don't wait, just find everything that's on screen as is.
46 let menu_elements = client
47 .find_all_by(By::uiautomator("new UiSelector().className(\"android.widget.TextView\");"))
48 .await?;
49
50 menu_elements.get(1)
51 .unwrap()
52 .click()
53 .await?;
54
55 // To add a timeout for wait, use "at_most".
56 // "check_every" limits how often Appium has to perform the search during wait.
57 //
58 // Sometimes it's better to use one or both of those methods, because:
59 // 1) We know that something should appear sooner, and if it doesn't, we don't want to wait full 30 seconds.
60 // 2) We don't want to slow down Appium server by checking again too often.
61 let element = client
62 .appium_wait()
63 .at_most(Duration::from_secs(20))
64 .check_every(Duration::from_millis(500))
65 .for_element(By::class_name("android.widget.ListView"))
66 .await?;
67
68 // This is a simple search for one element, without waiting for it to appear. And then we click on it.
69 // Notice that we are searching for an element inside "element" (which is a ListView).
70 element
71 .find_by(By::accessibility_id("3D Transition"))
72 .await?
73 .click()
74 .await?;
75
76 Ok(())
77}
Auto Trait Implementations§
impl<C, Caps> Freeze for ClientBuilder<C, Caps>where
C: Freeze,
impl<C, Caps> RefUnwindSafe for ClientBuilder<C, Caps>where
C: RefUnwindSafe,
Caps: RefUnwindSafe,
impl<C, Caps> Send for ClientBuilder<C, Caps>where
Caps: Send,
impl<C, Caps> Sync for ClientBuilder<C, Caps>where
Caps: Sync,
impl<C, Caps> Unpin for ClientBuilder<C, Caps>where
Caps: Unpin,
impl<C, Caps> UnwindSafe for ClientBuilder<C, Caps>where
C: UnwindSafe,
Caps: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more