【问题标题】:Get line-number/tracebacks from Selenium/ChromeDriver execute_script() failures从 Selenium/ChromeDriver execute_script() 失败中获取行号/回溯
【发布时间】:2021-01-09 21:30:08
【问题描述】:

当使用driver.execute_script() 执行的 Javascript 代码失败时,您将收到一条错误消息,但似乎没有上下文,例如行号,或者可能是堆栈跟踪/回溯。它不在消息中,也不存储在异常的任何属性中。看来这应该是某处

示例消息:

selenium.common.exceptions.JavascriptException: Message: javascript error: Unexpected token ')'
  (Session info: headless chrome=87.0.4280.47)

有人有什么想法吗?

我正在从 Python 调用 webdriver。

【问题讨论】:

  • 请向我们展示您尝试执行的代码。
  • 我在询问如何获取有关异常上下文的更多信息。代码不相关。
  • 上下文有帮助。
  • @DMart OP 试图执行的 JS 代码在他的问题的上下文中并不重要,因为该帖子是关于从 Selenium 执行的 JS 的堆栈跟踪。

标签: selenium selenium-webdriver chromium


【解决方案1】:

Selenium 执行 JavaScript 的方式是在匿名函数的主体中运行它。

我发现能够检索堆栈跟踪的唯一解决方法是将您的 JS 代码放在 function 声明中,然后使用 try..catch 语句检索堆栈跟踪,以防出现故障。

下面以简单的function为例:

function myFunction() {
    console.log(testVar.a + testVar.b);
}
myFunction();

在浏览器控制台中运行它,我们将理所当然地得到以下错误:

Uncaught ReferenceError: testVar is not defined
    at myFunction (<anonymous>:2:21)
    at <anonymous>:4:5

但是,正如您已经提到的,将它与来自 Selenium 的 execute_script 一起使用,我们只会得到:

javascript error: testVar is not defined
  (Session info: chrome=87.0.4280.141)

要获取错误消息和堆栈跟踪,请在 try 语句中调用 myFunction() 函数并在 catch 子句中返回堆栈跟踪,如下所示:

    js_stack_trace = driver.execute_script('''
    function myFunction() {
        console.log(testVar.a + testVar.b);
    }
    try { 
        myFunction(); 
    } 
    catch (err) { 
        return err.stack;
    }
    ''') 

js_stack_trace 变量的值将是:

ReferenceError: testVar is not defined
    at myFunction (eval at executeScript (:480:16), <anonymous>:5:25)
    at eval (eval at executeScript (:480:16), <anonymous>:8:13)
    at executeScript (<anonymous>:482:30)
    at <anonymous>:487:24
    at callFunction (<anonymous>:450:22)
    at <anonymous>:464:23
    at <anonymous>:465:3

这种方法的缺点是堆栈跟踪并不完全正确,因为正如我一开始所说的,JS 将在匿名函数中执行,因此返回的堆栈跟踪也会考虑到这一点。

但是,如果您正在执行的 JS 的格式非常好(例如,整个 JS 不仅在单行上),则更容易确定错误的来源。
否则你最好的选择是玩一下它,看看列号和行号的偏移量是多少(考虑到匿名函数)。

【讨论】:

  • 我也试过了,但似乎仍然找不到我在其他地方建议的“lineNumber”成员。如果 Selenium,这并不是说这也与上下文中的 JS 有关。如果异常导致从 Selenium 看到的错误中出现行号,那将是理想的。
  • @DustinOprea 如果您在 Chrome 开发工具中运行 JS,您是否获得了正确的堆栈跟踪?
  • 当然,就像您在上面所做的那样。我认为目前不会有解决方案。感谢您认真考虑。
【解决方案2】:

Unexpected Token 错误是 SyntaxErrors 的子集,因此只会在尝试执行语法中包含多余或缺失字符的代码时出现,这与 JavaScript 所期望的不同。

换句话说,JavaScript 异常 unexpected token 发生在预期特定语言构造时,但提供了其他可能是简单的错字的东西。

【讨论】:

  • 问题是关于如何从异常中提取行号或回溯。这与理解错误无关。
猜你喜欢
  • 2022-09-23
  • 2020-08-30
  • 1970-01-01
  • 2017-08-22
  • 2020-05-30
  • 1970-01-01
  • 2017-01-20
  • 2011-05-16
  • 1970-01-01
相关资源
最近更新 更多