【问题标题】:Forked driver instance never quits分叉的驱动程序实例永远不会退出
【发布时间】:2015-05-28 22:37:32
【问题描述】:

我在 Protractor 中运行多个浏览器窗口时遇到问题。 测试的示例代码写在下面:我分叉浏览器以获得一个新窗口并进行一些测试。当我将输入写入原始浏览器时,分叉的浏览器不应该有该输入。 一切正常,除了之后分叉的浏览器永远不会关闭并且某种错误消息被写入输出。

我的测试套件:

'use strict';

describe('testing', function () {
    it('should work', function () {
        browser.get('http://angularjs.org');
        var browser2 = browser.forkNewDriverInstance(true);
        element(by.name('as_q')).sendKeys('search');
        expect(browser2.element(by.name('as_q')).getText()).toBe('');
    });
});

这是我的配置:

exports.config = {
    framework: 'jasmine2',
    capabilities: {
        'browserName': 'chrome'
    },
    baseUrl: 'http://localhost:4000',
    specs: 'test.spec.js',
    jasmineNodeOpts: {
        showColors: true,
        defaultTimeoutInterval: 30000
    }
};

这是在终端中运行量角器时写入标准输出的内容:

Starting selenium standalone server...
[launcher] Running 1 instances of WebDriver
Selenium standalone server started at http://<my-ip-adress>:54721/wd/hub
Started
.


1 spec, 0 failures
Finished in 8.755 seconds
Shutting down selenium standalone server.

/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/http/index.js:145
      callback(new Error(message));
               ^
Error: ECONNREFUSED connect ECONNREFUSED
    at ClientRequest.<anonymous> (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/http/index.js:145:16)
    at ClientRequest.emit (events.js:95:17)
    at Socket.socketErrorListener (http.js:1552:9)
    at Socket.emit (events.js:95:17)
    at net.js:441:14
    at process._tickCallback (node.js:442:13)
From: Task: WebDriver.quit()
    at [object Object].webdriver.WebDriver.schedule (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/webdriver.js:360:15)
    at [object Object].webdriver.WebDriver.quit (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/webdriver.js:443:21)
    at /usr/local/lib/node_modules/protractor/lib/driverProviders/driverProvider.js:59:14
    at [object Object].promise.ControlFlow.runInFrame_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1877:20)
    at [object Object].promise.Callback_.goog.defineClass.notify (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:2464:25)
    at [object Object].promise.Promise.notify_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:563:12)
    at Array.forEach (native)
    at Object.goog.array.forEach (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/array/array.js:203:43)
    at [object Object].promise.Promise.notifyAll_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:552:16)
    at [object Object].goog.async.run.processWorkQueue [as _onTimeout] (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/async/run.js:125:21)
[launcher] Process exited with error code 1

使用量角器 2.0.0。

为什么分叉驱动实例没有像普通浏览器那样退出。是否必须在 selenium 服务器终止之前手动关闭它?

【问题讨论】:

    标签: javascript selenium webdriver protractor


    【解决方案1】:

    您应该明确退出第二个会话,量角器只负责关闭主要会话。

    所以,只需添加:

    broswer2.quit();

    【讨论】:

      【解决方案2】:

      错误的原因是您仍在尝试退出原始驱动程序,而不是分叉的驱动程序。

      除了分叉,你能不能做类似的事情

      browser = new Browser();
      

      希望您的“新”浏览器应该退出。

      另一种解决方案是使用 WebDriver 的 driver.switchTo().frame() 方法

      您可以选择使用;

      1. 一个数字。 (基于 0 的索引)
      2. 名称或 ID。
      3. 以前找到的 WebElement。 (也许对你来说最简单)

      一旦你切换了,你应该可以退出了。

      【讨论】:

      • 不是在回答这个问题,他是在用forkNewDriverInstance问如何回答这个问题
      • 它失败的原因正如我所说的那样,他正在退出原始浏览器而不是分叉的浏览器。尽管他可以明确退出 forkNewDriverInstance,但这实际上并不是他想要实现的目标以及他为什么分叉它的最佳解决方案(来自评论)。更好的解决方案是使用单个驱动程序实例并切换帧(以避免调用冲突)并退出他不再需要的帧。
      • 当您在同一个网站中检查交互时,切换框架不是解决方案,而是在不同的会话中(帐户 irl)。
      • “我 fork 浏览器以获得一个新窗口并进行一些测试。”在我看来他确实想要一个不同的会议......无论如何,希望你找到解决方案 Olov 的 cmets
      • 我想获得一个带有新会话的新窗口。这可以通过分叉来实现——我已经测试过了。但也许您的解决方案也有效,Adurbe。我将不得不对其进行测试。
      【解决方案3】:

      我遇到了同样的问题。因为我只是在做一个业余项目I've just forked protractor and commented out the piece of code that stops the server prematurely.

      //self.server_.stop().then(function() {
             deferred.resolve();
      //});
      

      不漂亮,但对于我的简单项目来说,它已经完成了。

      很抱歉,我的第一个 SO 评论是如此糟糕的 hack :-) 也许这将为比我有更多量角器知识的人提供线索。

      【讨论】:

      • 你能编辑你的答案并添加你所做的修改吗?
      • 我的回答中有一个github链接
      • 是的,我知道,但您的答案符合所谓的“仅链接答案”的条件,这在 SO 上很少受到欢迎。无论链接网站的内容是什么,您都应该始终添加代码/一些解释/描述。
      • 我提供这个作为一个不完整的答案。我在 Protractor 代码库中花了一个小时左右,很幸运,分享了我所知道的一些东西,并邀请了其他有更多 Protractor 经验的人来提供帮助。我在这里读到的其他答案完全走错了方向。
      猜你喜欢
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 2020-05-04
      • 2015-05-21
      • 2019-09-23
      • 2014-08-04
      • 2012-09-14
      • 1970-01-01
      相关资源
      最近更新 更多