Struct Wait

Source
pub struct Wait<'c> { /* private fields */ }
Expand description

Wait parameters

Implementations§

Source§

impl Wait<'_>

Source

pub fn at_most(self, timeout: Duration) -> Self

Set the timeout for maximum wait.

Checks are performed in a loop, with an interval. To prevent infinite wait, the loop will exit after this timeout and the wait will result in an error indicating timeout.

It is not guaranteed that the loop exits at the exact duration, as the check interval may hold it off. It works like this:

  1. is the timeout exceeded?
  2. try to locate
  3. wait for interval
  4. repeat
Examples found in repository?
examples/find_by.rs (line 63)
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

pub fn check_every(self, interval: Duration) -> Self

Sets the period to delay checks.

Checks are performed in a loop, with an interval defined by this method. For example, if you set it to 250 ms, then the loop will check if element is present, wait 250 ms and repeat.

Examples found in repository?
examples/find_by.rs (line 64)
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

pub async fn for_element(self, search: By) -> Result<Element, CmdError>

Waits for element using Appium locator.

Tries to locate element in loop, with interval defined by “check delay”. If the timeout is exceeded, then it returns an error.

Examples found in repository?
examples/find_by.rs (line 39)
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

pub async fn for_elements(self, search: By) -> Result<Vec<Element>, CmdError>

Waits for a list of elements using Appium locator.

Tries to locate list of elements in loop, with interval defined by “check delay”. If the timeout is exceeded, then it returns an error.

Trait Implementations§

Source§

impl<'c> Debug for Wait<'c>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'c> Freeze for Wait<'c>

§

impl<'c> RefUnwindSafe for Wait<'c>

§

impl<'c> Send for Wait<'c>

§

impl<'c> Sync for Wait<'c>

§

impl<'c> Unpin for Wait<'c>

§

impl<'c> UnwindSafe for Wait<'c>

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,