@@ -3446,6 +3446,46 @@ def open_html_file(self, html_file):
34463446 file_path = os.path.join(abs_path, html_file)
34473447 self.open("file://" + file_path)
34483448
3449+ def evaluate(self, expression):
3450+ """Run a JavaScript expression and return the result."""
3451+ self.__check_scope()
3452+ if self.__is_cdp_swap_needed():
3453+ return self.cdp.evaluate(expression)
3454+ self._check_browser()
3455+ original_expression = expression
3456+ expression = expression.strip()
3457+ exp_list = expression.split("\n")
3458+ if exp_list and exp_list[-1].strip().startswith("return "):
3459+ expression = (
3460+ "\n".join(exp_list[0:-1]) + "\n"
3461+ + exp_list[-1].strip()[len("return "):]
3462+ ).strip()
3463+ evaluation = self.driver.execute_cdp_cmd(
3464+ "Runtime.evaluate",
3465+ {
3466+ "expression": expression
3467+ },
3468+ )
3469+ if "value" in evaluation["result"]:
3470+ return evaluation["result"]["value"]
3471+ elif evaluation["result"]["type"] == "undefined":
3472+ return None
3473+ elif "exceptionDetails" in evaluation:
3474+ raise Exception(evaluation["result"]["description"], expression)
3475+ elif evaluation["result"]["type"] == "object":
3476+ if "return " not in original_expression:
3477+ expression = "return " + original_expression.strip()
3478+ # Need to use execute_script() to return a WebDriver object.
3479+ # If this causes duplicate evaluation, don't use evaluate().
3480+ return self.execute_script(expression)
3481+ elif evaluation["result"]["type"] == "function":
3482+ return {} # This is what sb.cdp.evaluate returns
3483+ elif "description" in evaluation["result"]:
3484+ # At this point, the description is the exception
3485+ raise Exception(evaluation["result"]["description"], expression)
3486+ else: # Possibly an unhandled case if reached
3487+ return None
3488+
34493489 def execute_script(self, script, *args, **kwargs):
34503490 self.__check_scope()
34513491 if self.__is_cdp_swap_needed():
0 commit comments