Struct ClientBuilder

Source
pub struct ClientBuilder<C, Caps>
where C: Connect + Send + Sync + Clone + Unpin, Caps: AppiumCapability,
{ /* 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,

Source

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
Hide additional 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>
where C: Connect + Send + Sync + Clone + Unpin + 'static, Caps: AppiumCapability,

Source

pub fn new( builder: ClientBuilder<C>, capabilities: Caps, ) -> ClientBuilder<C, Caps>

Source

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
Hide additional 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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,