diff --git a/src/browser/tab/element.rs b/src/browser/tab/element.rs index 049c49ed..374b202c 100644 --- a/src/browser/tab/element.rs +++ b/src/browser/tab/element.rs @@ -270,6 +270,7 @@ impl<'a> Element<'a> { pub fn call_js_fn( &self, function_declaration: &str, + await_promise: bool, ) -> Result { let result = self .parent @@ -279,6 +280,7 @@ impl<'a> Element<'a> { return_by_value: false, generate_preview: true, silent: false, + await_promise, })? .result; @@ -376,7 +378,8 @@ impl<'a> Element<'a> { } pub fn get_js_midpoint(&self) -> Result { - let result = self.call_js_fn("function(){ return this.getBoundingClientRect(); }")?; + let result = + self.call_js_fn("function(){ return this.getBoundingClientRect(); }", false)?; let properties = result .preview diff --git a/src/protocol/runtime.rs b/src/protocol/runtime.rs index 577e5bdf..38b2fc3c 100644 --- a/src/protocol/runtime.rs +++ b/src/protocol/runtime.rs @@ -45,6 +45,7 @@ pub mod methods { pub return_by_value: bool, pub generate_preview: bool, pub silent: bool, + pub await_promise: bool, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] diff --git a/tests/simple.rs b/tests/simple.rs index 5b7d0552..e647dec0 100644 --- a/tests/simple.rs +++ b/tests/simple.rs @@ -269,6 +269,44 @@ fn find_elements() -> Result<(), failure::Error> { Ok(()) } +#[test] +fn call_js_fn_sync() -> Result<(), failure::Error> { + logging::enable_logging(); + let (server, browser, tab) = dumb_server(include_str!("simple.html")); + let element = tab.wait_for_element("#foobar")?; + let result = element.call_js_fn("function() { return 42 }", false)?; + assert_eq!(result.object_type, "number"); + assert_eq!(result.description, Some("42".to_owned())); + assert_eq!(result.value, Some((42).into())); + Ok(()) +} + +#[test] +fn call_js_fn_async_unresolved() -> Result<(), failure::Error> { + logging::enable_logging(); + let (server, browser, tab) = dumb_server(include_str!("simple.html")); + let element = tab.wait_for_element("#foobar")?; + let result = element.call_js_fn("async function() { return 42 }", false)?; + assert_eq!(result.object_type, "object"); + assert_eq!(result.subtype, Some("promise".to_owned())); + assert_eq!(result.description, Some("Promise".to_owned())); + assert_eq!(result.value, None); + Ok(()) +} + +#[test] +fn call_js_fn_async_resolved() -> Result<(), failure::Error> { + logging::enable_logging(); + let (server, browser, tab) = dumb_server(include_str!("simple.html")); + let element = tab.wait_for_element("#foobar")?; + let result = element.call_js_fn("async function() { return 42 }", true)?; + assert_eq!(result.object_type, "number"); + assert_eq!(result.subtype, None); + assert_eq!(result.description, Some("42".to_owned())); + assert_eq!(result.value, Some((42).into())); + Ok(()) +} + #[test] fn set_request_interception() -> Result<(), failure::Error> { logging::enable_logging();