【问题标题】:Protractor Fails on Build Server - ElementNotVisibleError量角器在构建服务器上失败 - ElementNotVisibleError
【发布时间】:2016-10-08 17:05:06
【问题描述】:

我所有使用带黄瓜的量角器进行的角度 e2e 测试在我的机器上运行平稳且良好。但是一旦我在构建服务器上运行测试,就会出现错误

ElementNotVisibleError: 元素不可见

会话信息:chrome=51.0.2704.84

驱动信息:chromedriver=2.21.371459

平台=Windows NT 6.1 SP1 x86_64

一开始,我认为这与时间有关,一些异步的事情正在发生,但经过数小时的调试,我终于可以在本地机器上重现该错误。

最小化窗口是不够的,但如果我快速拖动鼠标使窗口尽可能小,我会收到此错误。所以这只是“窗口大小”的问题。

因此错误信息还可以,但是量角器是什么意思 在构建服务器上运行?

为什么有些测试通过了? Protractor 似乎在构建服务器上“看到”了一些东西,因此

我试过了

browser.driver.manage().window().maximize();

我试过了

browser.manage().window().setSize(1920, 1200);

我尝试按照here 的建议更改我的代码,并且尝试了更多(无望)的事情。没有任何效果。

我现在最大的问题是:当我想在某个页面上单击最右边的按钮时,如何在构建服务器(在我的情况下为 TFS)上以稳定的方式运行量角器测试?

短代码示例:

browser.get(browser.baseUrl + '#/somePage').then...
element(by.id(buttonId)).click();

谢谢!

更新:

我的问题的主要原因是在构建服务器上运行测试时屏幕分辨率的宽度为 1024,因此 setSize(1920, 1200) 失败。出于这个原因,我现在在 onPrepare 函数中添加了当前分辨率的输出,以便将来得到提示:

onPrepare: function () {
        browser.executeScript('return { height: screen.availHeight, width: screen.availWidth, top: screen.availTop, left: screen.availLeft};').then(function (result) {
            console.log("Screen resolution: ");
            console.log(result);
        });

        browser.manage().window().setSize(1920, 1200);

当然,这可以扩展一点来抛出异常或类似的东西。

【问题讨论】:

  • 快速检查。你确定buttonId 是唯一的吗?..如果输出:element.all(by.id("buttonId")).count().then(function (count) { console.log(count); });.?
  • 嗨@alecxe,非常感谢您的帮助。输出为 1。
  • 好的,你确定这不是时间问题吗?在单击按钮之前,您是否尝试过 browser.wait(EC.elementToBeClickable(element(by.id(buttonId))), 5000); where var EC = protractor.ExpectedConditions;
  • 奇怪。在我的本地系统上,输出为 1。在构建服务器上,输出为 0。但构建服务器上的消息是“元素不可见”......我将再次尝试使用“expectedConditions”的建议。我做到了一次,我收到了超时...再次感谢。
  • 是的。现在我超时了。我不认为这是一个时间问题,因为我可以通过调整窗口大小来重现错误。 (尽管构建服务器的行为有所不同 - 例如将窗口大小设置为 0,0 在本地不会出现错误,但构建服务器一直在抱怨。)

标签: angularjs protractor cucumberjs


【解决方案1】:

有时,我们需要将所需元素显示在视图中,以避免出现“元素不可见”错误。我们可以通过两种一般方式做到这一点:

  • 使用"browser actions":

    var elm = element(by.id("buttonid"));
    browser.actions().mouseMove(elm).click().perform()
    
  • scroll into view:

    var elm = element(by.id("buttonid"));
    browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
    

还链接this answer,它有一系列不错的东西,您可以尝试解决问题。

【讨论】:

  • 大家好。非常感谢您的提示。我遇到了完全相同的问题,我的构建服务器的分辨率只有 1024x768,所以我的元素永远不可见。我使用了 alecxe 的 scrollIntoView() 方法来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
相关资源
最近更新 更多