量角器+镀铬驱动器:元素在点上无法点击

时间:2014-10-06 07:38:32

标签: angularjs protractor selenium-chromedriver

您好我在进行基本量角器测试时遇到了一些麻烦。

我的设置:

  • 我使用requirejs所以我使用angular.bootstrap()初始化角度,而不是ng-app attr。根据量角器文档,这不是开箱即用的,但似乎适用于不涉及点击的测试。
  • 量角器conf.json:

    "use strict";
    exports.config = {
        specs: '../E2ETests/**/*.js',
        chromeOnly: true,
        getPageTimeout: 30000,
        allScriptsTimeout: 30000
    }
    
  • 我使用了一些我在指令中包装的第三方jquery插件,我怀疑这些可能是问题的一部分。

测试:

"use strict";
describe('When clicking should add stuff', function () {
    var ptor;
    beforeEach(function () {
        browser.get('https://localhost/myApp');
        ptor = protractor.getInstance();
    });
    it('add stuff', function () {
        // If I comment this, the test pass. 
        element(by.id('add-stuff-button')).click();
        // This does not matter fails on the line above..
        expect(browser.getTitle()).toBeDefined();
    });
});

错误:

UnknownError: unknown error: Element is not clickable at point (720, 881). Other element would         receive the click: <div class="col-md-5 col-md-offset-5">...</div>
(Session info: chrome=37.0.2062.124)
(Driver info: chromedriver=2.10.267521,platform=Windows NT 6.1 SP1 x86_64)

思想

chromedriver确实找到了按钮,因为如果我更改了id,它会抱怨没有找到任何元素。所以我认为问题是按钮从初始位置移开。由于元素(***)函数应该等待角度完成,我怀疑它可能会干扰它的第三方插件,因为它们可能不会使用角度api的获取数据等。所以有角度认为它完成但是然后第三方插件填充和移动周围的东西。

任何想法该怎么办? 如果第三方插件是问题所在,我能以某种方式告诉角度第三方的东西正在进行,然后告诉它何时完成?

THX BR TWD

15 个答案:

答案 0 :(得分:27)

您应该在配置文件中设置窗口大小

onPrepare: function() {
  browser.manage().window().setSize(1600, 1000);
}

答案 1 :(得分:19)

以下为我工作正常:

browser.actions().mouseMove(element).click();

编辑:如果上面不起作用,请尝试链接perform()方法(我将此作为编辑建议,我没有测试过,但有人可以验证并评论)

browser.actions().mouseMove(element).click().perform();

答案 2 :(得分:12)

如果chrome窗口太小,会发生这种情况,尝试在beforeEach

内添加
browser.driver.manage().window().setSize(1280, 1024);

答案 3 :(得分:11)

或者只使用Actions类:

browser.actions().mouseMove(elem).click().perform();

答案 4 :(得分:4)

也许它不适用于您的情况,但我遇到了同样的问题,根据package_data or data_files的答案,我一直在寻找另一个遮住按钮的元素(在我的情况下,我的屏幕右上角的下拉菜单。)

它似乎是由 Gulp 启动的 browsersync 发送的已连接到浏览器同步通知消息。消息在短时间后消失,但在我的onClick()调用之后消失。

要删除通知,在我的gulpfile中,我在初始化browsersync时添加了notify:false参数:

browserSync.init(files, {
    server: {
        baseDir: "dist",
        index: "index.html"
    },
    notify: false
});

答案 5 :(得分:4)

有同样的问题,但与窗口大小无关,但必须等待ngAnimation结束。

所以我不得不等到元素可以点击。

ProtractorExpectedConditions

@note - 我正在使用async / await node 8功能,您也可以将其转换为常规Promises。 同时使用ExpectedConditions代替using Autofac.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection; see documentation

答案 6 :(得分:3)

我通过使用浏览器时间睡眠解决了这个问题。

browser.driver.sleep(3000)
在给出点击按钮之前

答案 7 :(得分:2)

我有同样的错误,纯粹调整屏幕尺寸并没有为我解决。

进一步检查后,看起来好像另一个元素遮挡了按钮,因此Selenium测试失败,因为按钮没有(并且无法点击)。也许这就是为什么调整屏幕大小会为某些人修复它?

固定的矿井正在移除另一个元素(后来调整它的位置)。

答案 8 :(得分:1)

其他方式,你可以试试这个:

this.setScrollPage = function (element) {

    function execScroll() {
        return browser.executeScript('arguments[0].scrollIntoView()',
            element.getWebElement())
    }

    browser.wait(execScroll, 5000);
    element.click();
};

答案 9 :(得分:1)

这比指定窗口大小更好,以防您测试需要在多个显示器上运行。

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

答案 10 :(得分:1)

这意味着该元素不在可见区域内。有几种方法可以解决这个问题:

  1. 无论可见性如何,都强制点击元素
await browser.executeScript('arguments[0].click();', $element.getWebElement());
  1. 滚动到元素,然后点击
await browser.executeScript(`arguments[0].scrollIntoView({block: "center"});`, $element.getWebElement());
await $element.click()
  1. 在测试前最大化浏览器窗口的工作区域
beforeAll(async () => await browser.driver
  .manage()
  .window()
  .setSize(1920, 1080)
);

答案 11 :(得分:0)

您也可以尝试关闭可能正在使用的任何调试工具。我使用的是Laravel和debugbar,并且必须将APP_DEBUG设置为false。

答案 12 :(得分:0)

来自Gal Malgarit的答案,

您应该在配置文件中设置窗口大小

onPrepare: function() {
  browser.manage().window().setSize(1600, 800);
}

如果它仍然不起作用,您应该滚动到元素的位置

browser.executeScript('window.scrollTo(720, 881);');
element(by.id('add-stuff-button')).click();

答案 13 :(得分:0)

请注意,这有时会由顶部导航栏或底部导航栏/ Cookie警告栏覆盖该元素。对于角度2,当点击它时滚动直到元素仅在页面上。这意味着当向下滚动以点击某些内容时,如果存在底部导航,则会阻碍点击。同样,向上滚动时,顶部导航可以覆盖它。

现在,为了绕过滚动,我使用以下内容:

sapply(ls()[grepl("list",sapply(ls(), function(z) class(get(z))))], 
       function(z) format(object.size(get(z)), units = "Mb") )

我确保在测试开始之前通过单击关闭它来移除底部栏。

答案 14 :(得分:0)

您可以通过量角器配置文件(例如protractor.conf.jsconfig.js)定义所需的屏幕分辨率,以实现一致的测试行为。

例如,使用Chrome浏览器:

exports.config = {
  specs: [
    // ...
  ],
  capabilities: {
    browserName: 'chrome',
    chromeOptions: {
      args: [
        '--window-size=1600,900',
        '--headless'
      ]
    }
  }
  // ...
}

说明

  • window-size参数将以1600 x 900的窗口启动Chrome。
  • headless将启动无头Chrome,即使屏幕分辨率低于此值,您也可以在指定的窗口大小(1600 x 900)下运行测试。

您可能需要两种配置,一种用于始终具有高分辨率屏幕的开发人员(无头模式),另一种用于构建服务器(无头模式),其中屏幕分辨率有时是一个谜,有时可能低于您的应用程序/测试是为。量角器配置文件是javascript,可以扩展以避免代码重复。