pub struct ElementQuery {
pub text: Option<String>,
pub role: Option<String>,
pub exact: bool,
pub limit: usize,
}Expand description
Criteria for Computer::query and AppState::find.
Fields§
§text: Option<String>Text matched against title, description, value, placeholder, identifier, and help.
role: Option<String>Role matched against the display role or platform role (an AX prefix is optional).
exact: boolRequire an exact (case-insensitive) text match instead of a substring.
limit: usizeMaximum number of matches.
Implementations§
Source§impl ElementQuery
impl ElementQuery
Sourcepub fn text(text: impl Into<String>) -> Self
pub fn text(text: impl Into<String>) -> Self
Matches elements containing text.
Examples found in repository?
examples/textedit.rs (line 23)
11fn main() -> computer_use::Result<()> {
12 use std::time::Duration;
13
14 use computer_use::{
15 CaptureOptions, ClickMethod, ClickOptions, ClickTarget, Computer, ElementQuery, Error, TextSelection,
16 };
17
18 const APP: &str = "TextEdit";
19 let mut computer = Computer::new()?.settle_delay(Duration::from_millis(300));
20 let tree_only = CaptureOptions::default().include_screenshot(false);
21
22 let state = computer.get_app_state(APP, &tree_only)?;
23 let new_doc = state.find(&ElementQuery::text("New Document").with_role("button").exact(true)).next();
24 if let Some(button) = new_doc.map(|e| e.index) {
25 println!(
26 "click New Document: {:?}",
27 computer.click(APP, ClickTarget::Element(button), ClickOptions::default())?
28 );
29 }
30
31 let state = computer.get_app_state(APP, &tree_only)?;
32 let text_area = state
33 .find(&ElementQuery::role("AXTextArea"))
34 .next()
35 .map(|e| e.index)
36 .ok_or_else(|| Error::StateUnavailable("no text area".into()))?;
37 println!(
38 "click text area {text_area}: {:?}",
39 computer.click(APP, ClickTarget::Element(text_area), ClickOptions::default())?
40 );
41 computer.set_value(APP, text_area, "")?;
42 computer.type_text(APP, "Hello from computer-use-rs!\nSecond line.")?;
43
44 let state = computer.get_app_state(APP, &tree_only)?;
45 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
46 println!("text area now contains: {value:?}");
47
48 computer.select_text(APP, text_area, &TextSelection::new("computer-use-rs"))?;
49 let state = computer.get_app_state(APP, &tree_only)?;
50 println!("selected text: {:?}", state.selected_text);
51
52 computer.press_key(APP, "BackSpace")?;
53 let state = computer.get_app_state(APP, &tree_only)?;
54 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
55 println!("after BackSpace: {value:?}");
56
57 computer.press_key(APP, "super+a")?;
58 let state = computer.get_app_state(APP, &tree_only)?;
59 println!("after super+a, selected: {:?}", state.selected_text);
60
61 let focused = ClickOptions::default().method(ClickMethod::FocusedBackground);
62 println!("focused click: {:?}", computer.click(APP, ClickTarget::Element(text_area), focused)?);
63 computer.type_text(APP, " The end.")?;
64 let state = computer.get_app_state(APP, &tree_only)?;
65 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
66 println!("final text: {value:?}");
67
68 Ok(())
69}Sourcepub fn role(role: impl Into<String>) -> Self
pub fn role(role: impl Into<String>) -> Self
Matches elements with role.
Examples found in repository?
examples/textedit.rs (line 33)
11fn main() -> computer_use::Result<()> {
12 use std::time::Duration;
13
14 use computer_use::{
15 CaptureOptions, ClickMethod, ClickOptions, ClickTarget, Computer, ElementQuery, Error, TextSelection,
16 };
17
18 const APP: &str = "TextEdit";
19 let mut computer = Computer::new()?.settle_delay(Duration::from_millis(300));
20 let tree_only = CaptureOptions::default().include_screenshot(false);
21
22 let state = computer.get_app_state(APP, &tree_only)?;
23 let new_doc = state.find(&ElementQuery::text("New Document").with_role("button").exact(true)).next();
24 if let Some(button) = new_doc.map(|e| e.index) {
25 println!(
26 "click New Document: {:?}",
27 computer.click(APP, ClickTarget::Element(button), ClickOptions::default())?
28 );
29 }
30
31 let state = computer.get_app_state(APP, &tree_only)?;
32 let text_area = state
33 .find(&ElementQuery::role("AXTextArea"))
34 .next()
35 .map(|e| e.index)
36 .ok_or_else(|| Error::StateUnavailable("no text area".into()))?;
37 println!(
38 "click text area {text_area}: {:?}",
39 computer.click(APP, ClickTarget::Element(text_area), ClickOptions::default())?
40 );
41 computer.set_value(APP, text_area, "")?;
42 computer.type_text(APP, "Hello from computer-use-rs!\nSecond line.")?;
43
44 let state = computer.get_app_state(APP, &tree_only)?;
45 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
46 println!("text area now contains: {value:?}");
47
48 computer.select_text(APP, text_area, &TextSelection::new("computer-use-rs"))?;
49 let state = computer.get_app_state(APP, &tree_only)?;
50 println!("selected text: {:?}", state.selected_text);
51
52 computer.press_key(APP, "BackSpace")?;
53 let state = computer.get_app_state(APP, &tree_only)?;
54 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
55 println!("after BackSpace: {value:?}");
56
57 computer.press_key(APP, "super+a")?;
58 let state = computer.get_app_state(APP, &tree_only)?;
59 println!("after super+a, selected: {:?}", state.selected_text);
60
61 let focused = ClickOptions::default().method(ClickMethod::FocusedBackground);
62 println!("focused click: {:?}", computer.click(APP, ClickTarget::Element(text_area), focused)?);
63 computer.type_text(APP, " The end.")?;
64 let state = computer.get_app_state(APP, &tree_only)?;
65 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
66 println!("final text: {value:?}");
67
68 Ok(())
69}Sourcepub fn with_role(self, role: impl Into<String>) -> Self
pub fn with_role(self, role: impl Into<String>) -> Self
Adds a role constraint.
Examples found in repository?
examples/textedit.rs (line 23)
11fn main() -> computer_use::Result<()> {
12 use std::time::Duration;
13
14 use computer_use::{
15 CaptureOptions, ClickMethod, ClickOptions, ClickTarget, Computer, ElementQuery, Error, TextSelection,
16 };
17
18 const APP: &str = "TextEdit";
19 let mut computer = Computer::new()?.settle_delay(Duration::from_millis(300));
20 let tree_only = CaptureOptions::default().include_screenshot(false);
21
22 let state = computer.get_app_state(APP, &tree_only)?;
23 let new_doc = state.find(&ElementQuery::text("New Document").with_role("button").exact(true)).next();
24 if let Some(button) = new_doc.map(|e| e.index) {
25 println!(
26 "click New Document: {:?}",
27 computer.click(APP, ClickTarget::Element(button), ClickOptions::default())?
28 );
29 }
30
31 let state = computer.get_app_state(APP, &tree_only)?;
32 let text_area = state
33 .find(&ElementQuery::role("AXTextArea"))
34 .next()
35 .map(|e| e.index)
36 .ok_or_else(|| Error::StateUnavailable("no text area".into()))?;
37 println!(
38 "click text area {text_area}: {:?}",
39 computer.click(APP, ClickTarget::Element(text_area), ClickOptions::default())?
40 );
41 computer.set_value(APP, text_area, "")?;
42 computer.type_text(APP, "Hello from computer-use-rs!\nSecond line.")?;
43
44 let state = computer.get_app_state(APP, &tree_only)?;
45 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
46 println!("text area now contains: {value:?}");
47
48 computer.select_text(APP, text_area, &TextSelection::new("computer-use-rs"))?;
49 let state = computer.get_app_state(APP, &tree_only)?;
50 println!("selected text: {:?}", state.selected_text);
51
52 computer.press_key(APP, "BackSpace")?;
53 let state = computer.get_app_state(APP, &tree_only)?;
54 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
55 println!("after BackSpace: {value:?}");
56
57 computer.press_key(APP, "super+a")?;
58 let state = computer.get_app_state(APP, &tree_only)?;
59 println!("after super+a, selected: {:?}", state.selected_text);
60
61 let focused = ClickOptions::default().method(ClickMethod::FocusedBackground);
62 println!("focused click: {:?}", computer.click(APP, ClickTarget::Element(text_area), focused)?);
63 computer.type_text(APP, " The end.")?;
64 let state = computer.get_app_state(APP, &tree_only)?;
65 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
66 println!("final text: {value:?}");
67
68 Ok(())
69}Sourcepub const fn exact(self, exact: bool) -> Self
pub const fn exact(self, exact: bool) -> Self
Requires exact text matches.
Examples found in repository?
examples/textedit.rs (line 23)
11fn main() -> computer_use::Result<()> {
12 use std::time::Duration;
13
14 use computer_use::{
15 CaptureOptions, ClickMethod, ClickOptions, ClickTarget, Computer, ElementQuery, Error, TextSelection,
16 };
17
18 const APP: &str = "TextEdit";
19 let mut computer = Computer::new()?.settle_delay(Duration::from_millis(300));
20 let tree_only = CaptureOptions::default().include_screenshot(false);
21
22 let state = computer.get_app_state(APP, &tree_only)?;
23 let new_doc = state.find(&ElementQuery::text("New Document").with_role("button").exact(true)).next();
24 if let Some(button) = new_doc.map(|e| e.index) {
25 println!(
26 "click New Document: {:?}",
27 computer.click(APP, ClickTarget::Element(button), ClickOptions::default())?
28 );
29 }
30
31 let state = computer.get_app_state(APP, &tree_only)?;
32 let text_area = state
33 .find(&ElementQuery::role("AXTextArea"))
34 .next()
35 .map(|e| e.index)
36 .ok_or_else(|| Error::StateUnavailable("no text area".into()))?;
37 println!(
38 "click text area {text_area}: {:?}",
39 computer.click(APP, ClickTarget::Element(text_area), ClickOptions::default())?
40 );
41 computer.set_value(APP, text_area, "")?;
42 computer.type_text(APP, "Hello from computer-use-rs!\nSecond line.")?;
43
44 let state = computer.get_app_state(APP, &tree_only)?;
45 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
46 println!("text area now contains: {value:?}");
47
48 computer.select_text(APP, text_area, &TextSelection::new("computer-use-rs"))?;
49 let state = computer.get_app_state(APP, &tree_only)?;
50 println!("selected text: {:?}", state.selected_text);
51
52 computer.press_key(APP, "BackSpace")?;
53 let state = computer.get_app_state(APP, &tree_only)?;
54 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
55 println!("after BackSpace: {value:?}");
56
57 computer.press_key(APP, "super+a")?;
58 let state = computer.get_app_state(APP, &tree_only)?;
59 println!("after super+a, selected: {:?}", state.selected_text);
60
61 let focused = ClickOptions::default().method(ClickMethod::FocusedBackground);
62 println!("focused click: {:?}", computer.click(APP, ClickTarget::Element(text_area), focused)?);
63 computer.type_text(APP, " The end.")?;
64 let state = computer.get_app_state(APP, &tree_only)?;
65 let value = state.find(&ElementQuery::role("AXTextArea")).next().and_then(|e| e.value.clone());
66 println!("final text: {value:?}");
67
68 Ok(())
69}Trait Implementations§
Source§impl Clone for ElementQuery
impl Clone for ElementQuery
Source§impl Debug for ElementQuery
impl Debug for ElementQuery
Source§impl Default for ElementQuery
impl Default for ElementQuery
impl Eq for ElementQuery
Source§impl PartialEq for ElementQuery
impl PartialEq for ElementQuery
impl StructuralPartialEq for ElementQuery
Auto Trait Implementations§
impl Forget for ElementQuery
impl Freeze for ElementQuery
impl RefUnwindSafe for ElementQuery
impl Send for ElementQuery
impl Sync for ElementQuery
impl Unpin for ElementQuery
impl UnsafeUnpin for ElementQuery
impl UnwindSafe for ElementQuery
Blanket Implementations§
impl<T> AutoreleaseSafe for Twhere
T: ?Sized,
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