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

twD*_*uke 32 selenium-chromedriver angularjs protractor

嗨,我在使用基本量角器测试时遇到一些麻烦.

我的设置:

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

    "use strict";
    exports.config = {
        specs: '../E2ETests/**/*.js',
        chromeOnly: true,
        getPageTimeout: 30000,
        allScriptsTimeout: 30000
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 我使用了一些第三方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();
    });
});
Run Code Online (Sandbox Code Playgroud)

错误:

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)
Run Code Online (Sandbox Code Playgroud)

思考

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

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

Thx Br Twd

Gal*_*lit 30

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

onPrepare: function() {
  browser.manage().window().setSize(1600, 1000);
}
Run Code Online (Sandbox Code Playgroud)

  • 在protractor.conf.js中添加以下内容:exports.config = {capabilities:{'browserName':'chrome','chromeOptions':{'args':[' - windowow-size = 1690,1000']}} } (2认同)

Ama*_*pta 20

以下对我来说很好:

browser.actions().mouseMove(element).click();
Run Code Online (Sandbox Code Playgroud)

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

browser.actions().mouseMove(element).click().perform();
Run Code Online (Sandbox Code Playgroud)


ori*_*nof 12

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

browser.driver.manage().window().setSize(1280, 1024);
Run Code Online (Sandbox Code Playgroud)

  • 您的代码有两个问题: 没有必要使用 browser.driver ,它会绕过量角器并在下面的一层到达 webdriver 本身。您也不应该将该代码插入 beforeEach() 块 - 这是一个开销。 (2认同)

Rau*_*ban 12

或者只是使用Actions类:

browser.actions().mouseMove(elem).click().perform();
Run Code Online (Sandbox Code Playgroud)

  • Ni Noel,我最近遇到了这个问题,所以我开始寻找解决方案.我读了这个帖子,尝试了代码,并发现`actions`类还需要最后调用`perform`方法.建议这种方法的人错过了包含调用`perform()`方法.对于那些对WebDriver没有太多经验的人来说,这会有所不同. (2认同)

fre*_*tma 5

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

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

    const msg = 'Waiting for animation timeout after 1s';
    const EC  = new protractor.ProtractorExpectedConditions();
    await browser.wait(EC.elementToBeClickable(model.elements.button.checkCompliance), 1000, `${msg} panel`);
    await model.elements.button.checkCompliance.click();
Run Code Online (Sandbox Code Playgroud)

@note - 我正在使用 async/await 节点 8 功能,您也可以将其转换为常规 Promise。也使用ProtractorExpectedConditions而不是ExpectedConditions 查看文档