使用Safari 12时,会话未创建Selenium / webdriver

时间:2018-09-20 20:13:55

标签: javascript selenium-webdriver npm safari webdriver

自从升级到Safari 12之后,我的自动化脚本现在出现此错误:

SessionNotCreatedError: Request body does not contain required parameter 'capabilities'.

(其他浏览器不会发生该错误)。

我正在使用javascript webdriver绑定,并且在构建webdriver时,我使用了withCapability键值对:

var capabs = {
       'browserName' : 'Safari',
       'version' : '12.0'
    }
    browserUnderTest = new webdriver.Builder().
    withCapabilities(capabs)    
    .forBrowser('safari')
    .build();

我认为问题出在safari.js文件本身,但是我对它如何精确定位任何东西还不了解。这是错误的全文:

SessionNotCreatedError: Request body does not contain required parameter 'capabilities'.
    at Object.throwDecodedError (/Users/qualit/Documents/autotests/node_modules/selenium-webdriver/lib/error.js:514:15)
    at parseHttpResponse (/Users/qualit/Documents/autotests/node_modules/selenium-webdriver/lib/http.js:519:13)
    at doSend.then.response (/Users/qualit/Documents/autotests/node_modules/selenium-webdriver/lib/http.js:441:30)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
From: Task: WebDriver.createSession()
    at Function.createSession (/Users/qualit/Documents/autotests/node_modules/selenium-webdriver/lib/webdriver.js:769:24)
    at Function.createSession (/Users/qualit/Documents/autotests/node_modules/selenium-webdriver/safari.js:253:41)
    at createDriver (/Users/qualit/Documents/autotests/node_modules/selenium-webdriver/index.js:170:33)
    at Builder.build (/Users/qualit/Documents/autotests/node_modules/selenium-webdriver/index.js:660:16)
    at Object.<anonymous> (/Users/qualit/Documents/autotests/K8_autotest.js:354:6)
    at Module._compile (module.js:643:30)
    at Object.Module._extensions..js (module.js:654:10)
    at Module.load (module.js:556:32)
    at tryModuleLoad (module.js:499:12)
    at Function.Module._load (module.js:491:3)

有人对这个原因或解决方法有任何想法吗?

2 个答案:

答案 0 :(得分:2)

发生此问题是因为Safari 12使用了新的W3C webdriver协议(source),该协议似乎与最新的稳定的selenium-webdriver软件包(v3.6)不兼容

可以向

safaridriver传递--legacy标志以使用旧协议。直接在命令行上可以完成以下操作:/usr/bin/safaridriver --legacy

可以在节点程序中的驱动程序上设置此标志,如下所示:

const webdriver = require('selenium-webdriver');
const safari = require('selenium-webdriver/safari');

new webdriver.Builder()
    .usingServer(await new safari.ServiceBuilder().addArguments('--legacy').build().start())
    .forBrowser('safari')
    .build();

这里是ServiceBuilder API的文档-https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/safari_exports_ServiceBuilder.html

一些GitHub票也涵盖了这一点:

答案 1 :(得分:1)

如果在尝试上述@mjdease解决方案时遇到“等待”错误,这也将起作用。

new webdriver.Builder()
    .usingServer(new safari.ServiceBuilder().addArguments('--legacy').build().start())
    .forBrowser('safari')
    .build();