【问题标题】:Selenium EventFiringWebDriver JavaScript: SyntaxError: missing ) after argument listSelenium EventFiringWebDriver JavaScript: SyntaxError: missing ) 在参数列表之后
【发布时间】:2018-09-20 18:55:51
【问题描述】:

尝试使用内置的 Selenium EventFiringWebDriver 类执行 javaScript 命令。

EventFiringWebDriver eventFiringWebDriver = new EventFiringWebDriver(driver);
eventFiringWebDriver.executeScript("document.querySelector('[ng-reflect-title='Assessment']>div.cc-tile>div.cc-tile-body').scrollTop=370");

但这会产生错误:Runtime.evaluate throw exception: SyntaxError: missing ) after argument list

如果我使用 Chrome 为这个对象提供的长 ccs 选择器:

body > bb-root > best-app > div > div.cc-content > bb-best > bb-assess > best-tile > div > div

代替:

[ng-reflect-title='Assessment']>div.cc-tile>div.cc-tile-body

然后它完美地工作。

当通过 Chrome 开发工具运行时,上述两个 ccs 选择器都会在页面上生成一个对象。我更喜欢使用更动态的选择器。

【问题讨论】:

    标签: javascript selenium


    【解决方案1】:

    这是您尝试运行的 JavaScript。借助 Stack Overflow 的代码高亮,你能看出问题所在吗?

    document.querySelector('[ng-reflect-title='Assessment']>div.cc-tile>div.cc-tile-body').scrollTop=370
    

    注意单词Assessment的颜色。

    您尝试将字符串文字放入另一个字符串文字中,但您没有转义引号,因此 JavaScript 编译器认为字符串文字在 Assessment 之前结束。您需要为一对引号使用双引号而不是单引号,或者转义内部引号。

    更复杂的是,这个包含嵌套字符串文字的 JavaScript 片段本身就是一个 Java 字符串文字。

    也许最简单的做法是在 JavaScript 字符串中使用转义的双引号作为一组引号。我在这里选择了外集:

    eventFiringWebDriver.executeScript("document.querySelector(\"[ng-reflect-title='Assessment']>div.cc-tile>div.cc-tile-body\").scrollTop=370");
    

    另一种方法是转义 JavaScript 片段中的内引号,以便运行以下 JavaScript:

    document.querySelector('[ng-reflect-title=\'Assessment\']>div.cc-tile>div.cc-tile-body').scrollTop=370
    

    但是这种方法会变得混乱,因为您必须转义 Java 字符串中的反斜杠,以便将它们传递给 JavaScript 以转义单引号。两级字符转义可能会让人难以理解,因此最好避免这种情况。

    【讨论】:

    • 精彩的解释。
    • 你知道当你看东西太久而看不到它时怎么办吗?
    猜你喜欢
    • 2013-03-11
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多