Run a JavaScript expression and return the result.
(self, expression)
| 3462 | self.open("file://" + file_path) |
| 3463 | |
| 3464 | def evaluate(self, expression): |
| 3465 | """Run a JavaScript expression and return the result.""" |
| 3466 | self.__check_scope() |
| 3467 | if self.__is_cdp_swap_needed(): |
| 3468 | return self.cdp.evaluate(expression) |
| 3469 | self._check_browser() |
| 3470 | original_expression = expression |
| 3471 | expression = expression.strip() |
| 3472 | exp_list = expression.split("\n") |
| 3473 | if exp_list and exp_list[-1].strip().startswith("return "): |
| 3474 | expression = ( |
| 3475 | "\n".join(exp_list[0:-1]) + "\n" |
| 3476 | + exp_list[-1].strip()[len("return "):] |
| 3477 | ).strip() |
| 3478 | evaluation = self.driver.execute_cdp_cmd( |
| 3479 | "Runtime.evaluate", |
| 3480 | { |
| 3481 | "expression": expression |
| 3482 | }, |
| 3483 | ) |
| 3484 | if "value" in evaluation["result"]: |
| 3485 | return evaluation["result"]["value"] |
| 3486 | elif evaluation["result"]["type"] == "undefined": |
| 3487 | return None |
| 3488 | elif "exceptionDetails" in evaluation: |
| 3489 | raise Exception(evaluation["result"]["description"], expression) |
| 3490 | elif evaluation["result"]["type"] == "object": |
| 3491 | if "return " not in original_expression: |
| 3492 | expression = "return " + original_expression.strip() |
| 3493 | # Need to use execute_script() to return a WebDriver object. |
| 3494 | # If this causes duplicate evaluation, don't use evaluate(). |
| 3495 | return self.execute_script(expression) |
| 3496 | elif evaluation["result"]["type"] == "function": |
| 3497 | return {} # This is what sb.cdp.evaluate returns |
| 3498 | elif "description" in evaluation["result"]: |
| 3499 | # At this point, the description is the exception |
| 3500 | raise Exception(evaluation["result"]["description"], expression) |
| 3501 | else: # Possibly an unhandled case if reached |
| 3502 | return None |
| 3503 | |
| 3504 | def execute_script(self, script, *args, **kwargs): |
| 3505 | self.__check_scope() |
no test coverage detected