【问题标题】:Protractor UI Tests fail with Jenkins, successful on WinServer on cmd run量角器 UI 测试在 Jenkins 上失败,在 WinServer 上运行 cmd 成功
【发布时间】:2016-01-27 09:51:43
【问题描述】:

我在 Windows Server 上配置了一个 Jenkins,用于夜间构建、编译等。以及 UI 测试(E2E 测试)自动化,但我遇到了一些问题。 我们有一个在 Chrome 上运行的 Web 应用程序,需要 Jenkins 使用量角器(使用 Selenium)运行这些测试。

从 Windows cmd 控制台手动运行,测试成功完成。

-------这里是控制台输出;

***C:\Jenkins\jobs\UI Automation\workspace> protractor e2e-tests/protractor.conf.js

Using ChromeDriver directly...

[launcher] Running 1 instances of WebDriver

WARNING - more than one element found for locator by.repeater("attachment in pos
t_item.attachments") - the first result will be used

.
Finished in 68.394 seconds

1 test, 8 assertions, 0 failures

[launcher] 0 instance(s) of WebDriver still running

[launcher] chrome #1 passed***

-----这是 Jenkins 运行的输出;

C:\Jenkins\jobs\UI Automation\workspace>protractor e2e-tests/protractor.conf.js  
Using ChromeDriver directly...
[launcher] Running 1 instances of WebDriver
WARNING - more than one element found for locator by.repeater("attachment in post_item.attachments") - the first result will be used
[31mF[0m
Failures:
  1) new_message_with_attachment should send new message with attachment
   Message:
     [31mElementNotVisibleError: element not visible
  (Session info: chrome=47.0.2526.111)
  (Driver info: chromedriver=2.13.307647 (5a7d0541ebc58e69994a6fb2ed930f45261f3c29),platform=Windows NT 6.0 SP2 x86_64)[0m
   Stacktrace:
     ElementNotVisibleError: element not visible
  (Session info: chrome=47.0.2526.111)
  (Driver info: chromedriver=2.13.307647 (5a7d0541ebc58e69994a6fb2ed930f45261f3c29),platform=Windows NT 6.0 SP2 x86_64)
    at new bot.Error (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\atoms\error.js:113:18)
    at Object.bot.response.checkResponse (C:\Users\x\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\atoms\response.js:106:9)
    at C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\webdriver.js:362:20
    at C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\goog\base.js:1582:15
    at [object Object].webdriver.promise.ControlFlow.runInNewFrame_ (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:1654:20)
    at notify (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:465:12)
    at notifyAll (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:442:7)
    at resolve (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:420:7)
    at [object Object].fulfill (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:535:5)
    at C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:1520:10
==== async task ====
WebElement.click()
    at [object Object].webdriver.WebDriver.schedule (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\webdriver.js:345:15)
    at [object Object].webdriver.WebElement.schedule_ (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\webdriver.js:1727:23)
    at [object Object].webdriver.WebElement.click (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\webdriver.js:1832:15)
    at actionFn (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\lib\element.js:75:32)
    at C:\Users\X\AppData\Roaming\npm\node_modules\protractor\lib\element.js:393:17
    at Array.forEach (native)
    at actionResults.getWebElements.then.then.e.stack (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\lib\element.js:392:9)
    at C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\goog\base.js:1582:15
    at [object Object].webdriver.promise.ControlFlow.runInNewFrame_ (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:1654:20)
==== async task ====
Asynchronous test function: it()
    at [object Object].<anonymous> (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd\index.js:93:33)
    at [object Object].<anonymous> (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\minijasminenode\lib\async-callback.js:45:37)
    at [object Object].jasmine.Block.execute (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:1174:17)
    at [object Object].jasmine.Queue.next_ (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:2209:31)
    at [object Object]._onTimeout (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:2199:18)
Error
    at [object Object].ElementArrayFinder.applyAction_ (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\lib\element.js:389:21)
    at [object Object].self.(anonymous function) [as click] (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\lib\element.js:77:19)
    at [object Object].self.(anonymous function) [as click] (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\lib\element.js:697:11)
    at [object Object].<anonymous> (C:\Jenkins\jobs\UI Automation\workspace\e2e-tests\new_message_with_attachment.js:223:62)
    at C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\jasminewd\index.js:94:14
    at [object Object].webdriver.promise.ControlFlow.runInNewFrame_ (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:1654:20)
    at [object Object].webdriver.promise.ControlFlow.runEventLoop_ (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:1518:8)
Error
    at [object Object].<anonymous> (C:\Jenkins\jobs\UI Automation\workspace\e2e-tests\new_message_with_attachment.js:76:3)
    at [object Object].jasmine.Env.describe_ (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:913:21)
    at [object Object].jasmine.Env.describe (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:898:15)
    at describe (C:\Users\X\AppData\Roaming\npm\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:658:27)
    at Object.<anonymous> (C:\Jenkins\jobs\UI Automation\workspace\e2e-tests\new_message_with_attachment.js:75:1)
Finished in 59.756 seconds
[31m1 test, 8 assertions, 2 failures
[0m
[launcher] 0 instance(s) of WebDriver still running
Build step 'Execute Windows batch command' marked build as failure
Discard old builds...
Sending e-mails to: me@home.com
Finished: FAILURE*

-------这里是protractor.conf.js;

*exports.config = {
  allScriptsTimeout: 20000,
  specs: [
    'new_message_with_attachment.js',
  ],

  capabilities: {
    'browserName': 'chrome',
    'chromeOptions': {
    prefs: {'profile.managed_default_content_settings.notifications': 1}},
  shardTestFiles: true,
    maxSessions: 1

  },

  directConnect: true,
  jasmineNodeOpts: {
    defaultTimeoutInterval: 1000000
  }
};*

有没有cmets?

【问题讨论】:

  • 您的 Jenkins 是否有某种显示输出,或者您是否使用 xvfb 进行虚拟显示?
  • 我找不到任何显示输出,它可以用来跟踪找不到哪个元素。此外,日志中的错误会不时更改,例如我收到一些错误,例如“未知错误:元素不可点击”或“使用定位器找不到元素:By.cssSelector(”[class=\"btn btn-info btn-newpost\"]")" 或“索引超出范围。尝试访问索引处的元素:0,但只有 0 个元素”。我认为量角器运行的背景存在一些问题,可能是在硒方面..
  • @eozen 我曾经将量角器与 Jenkins 集成。不记得失败的所有细节,但它非常不稳定。我会建议你尝试使用 xvfb。如果 Jenkins 是一个虚拟机,那么机器的资源也会产生巨大的影响。确保它有 2-4GB RAM 和至少 2-4 个处理器,每个处理器至少应该有 2.0Ghz,图形 VRAM 至少应该是 128MB(可用 VRAM 不是配置 VRAM)。
  • @LinhPham 感谢您的反馈。正如你所说,它现在不稳定,每次运行我都会遇到不同的错误。我使用的是 Windows Server,所以我不能使用 xvfb,或者?我认为 Windows 服务器配置还可以,我有 8GB ram 2.4Ghz 处理器,应该足够了。但是测试运行速度非常快,出现“未找到元素”之类的错误很可能是因为未完成网页安装..有时甚至可以输入登录用户名而缺少一些字符。
  • @eozen,在您的最新评论中获得了一些有用的信息,我会尽快尝试回答:) ---- P.S.顺便问一下,你那里有多少个处理器?只有一个?

标签: jenkins protractor


【解决方案1】:

在将 Protractor 与 Jenkins CI 集成时,我曾经发生过一次。因此,根据您的问题,我将提出一些有助于提高您的 e2e 测试稳定性的建议。

看来您在这里遇到的不仅仅是一个问题。我相信这会解决您的一些问题,但可能无法解决所有问题。


有些错误如“未找到元素”很可能是因为未完成网页安装..

...每次运行都会遇到不同的错误

这是量角器最常见的问题,发生这种情况的原因有很多。但幸运的是,通过结合Page Object 的非常简单的方法可以避免这种情况。

这是页面对象:

var MyPage = function () {

    // SET ng-view or ui-view
    this.view = $('.view');

    // SET interactable components
    this.button = element(by.css('button'));

};

MyPage.prototype.get = function () {
    browser.setLocation('myRoute/something');
};

MyPage.prototype.waitForPresent = function() {
    var EC = protractor.ExpectedConditions;
    browser.wait(EC.presenceOf(this.button), 10000);
};

在您的测试套件/规范中:

it("should test something", function() {
    var page = new MyPage();
    page.get();

    browser.waitForAngular();
    page.waitForPresent();

    page.button.click();
});

这里的技巧是使用预期条件并为您的页面对象 waitForPresent 编写原型,等待组件呈现。选择一个您认为它将是最后一个在您的视图/页面上呈现的。 (注意:您不需要使用页面对象,但是当您的套件变得更大时,管理起来会很痛苦)


但测试运行速度非常快,出现“未找到元素”之类的错误很可能是由于网页安装未完成..有时它甚至可以输入登录用户名而缺少一些字符。

看来您那里确实有很好的资源(CPU 和 RAM),但您所说的有时登录时会丢失一些字符。这意味着您在其他地方仍然缺乏资源,并且怀疑是您的图形资源。几乎所有服务器都缺少图形资源,因为它并不总是需要渲染某些东西。为了解决这个问题,没有代码调整、技巧或变通方法可供使用。您必须至少尝试其中任何一个(或两者都尝试):

  • 找到运行无头测试。因为渲染浏览器很重。 (使用 Chrome 或 FireFox,因为 PhantomJS 不推荐用于量角器)
  • 尝试增加您的图形资源。

编辑:github Calling element.sendKeys() seems to not send all the keys 上存在一个问题,它首先怀疑是旧版本的 Webdriver。但最近使用最新版本 Webdriver 的人也得到了它。原因不明,但我非常怀疑这是由于缺乏某种资源。无论如何,这只是为了您的信息。希望对您有所帮助:)

【讨论】:

  • 非常感谢这些建议,我们会尝试应用这些建议(可能不会在短时间内),并且一定会让您知道结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
相关资源
最近更新 更多