参数列表后的Selenium EventFiringWebDriver JavaScript:SyntaxError:missing)

时间:2018-09-20 18:55:52

标签: javascript selenium

尝试使用内置的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引发异常:SyntaxError:missing

如果我使用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选择器均在页面上产生一个对象。我希望使用更具动态性的选择器。

1 个答案:

答案 0 :(得分:4)

这是您要运行的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以转义单引号。字符转义的两个级别可能会让人难以理解,因此最好避免这种情况。