无法使量角器等待现有元素可点击(condition.elementToBeClickable)

时间:2017-01-04 09:01:58

标签: angularjs selenium protractor automated-tests

我们有一个Angular 1.5应用程序,它有一个登录屏幕,应用程序代码和我们的测试中没有任何更改。我们使用量角器(带有grunt-protractor等......)
版本:

  "dependencies": {
    "async": "^0.9.0",
    "chalk": "^1.1.1",
    "fs-extra": "^0.24.0",
    "grunt": "~0.4.5",
    "grunt-contrib-jshint": "^0.10.0",
    "grunt-protractor-runner": "^4.0.0",
    "grunt-protractor-webdriver": "^0.2.5",
    "jshint-stylish": "^1.0.0",
    "load-grunt-tasks": "~3.1.0",
    "lodash": "^2.4.1",
    "log4js": "^0.6.21",
    "protractor": "^4.0.11",
    "selenium-webdriver": "^3.0.1"
  }

我们所有的测试都采用以下格式:

  • 登录应用并暂停
  • 测试(它)。每个它获取done()函数,该函数在测试结束时从browser.sleep('1000')调用。然后(完成)promise(jasmine语法)。

    describe('login', function () {
        browser.get('/');
        components.login.loginDefault();
        console.log('done login');
        browser.driver.manage().window().maximize(); // just in case the driver wont reach the '.add-new-type' button 
        browser.sleep(1000);
    });
    
    describe('post login', function () {
        it('just a test for after user loged in', function (done) {
            console.log('post login');
            const ec = protractor.ExpectedConditions;
            const getStarted = element(by.css('.add-new-type')); // just a button appears on the next page
            console.log('getStarted ' + JSON.stringify(getStarted));
            browser.wait(ec.elementToBeClickable(getStarted), 5000);
            console.log('post wait');
            browser.sleep(5000).then(done);
       })});  
    

我们没有在我们的环境中更改依赖项版本或什么也没有,突然没有任何工作,测试只通过登录阶段然后失败,因为没有找到元素(我猜)并且一直停留,直到jasmine抛出超时异常

Session created: count=1, browserName=chrome, chromeOptions={args=[--no-sandbox, --test-type=browser, --disable-extensions], prefs={download={default_directory=./e2e/tmp, prompt_for_download=false}}}
node path changed
done login
Started
post login
F 

登录后测试只是一个例子,我们尝试了其他方法让司机等待“ExpectedConditions”。 如果我在控制台调试器(chrome)中查找元素,我将正确地获取元素... 我们还试图调试和打印repl模式

element(by.css('.add-new-type')).getText()

并且行为相同 - 没有/没有回应

有任何帮助!

3 个答案:

答案 0 :(得分:1)

您是否尝试过等待元素和网址?

'use strict';

var WaitUtils = function () {

    this.waitElement = function (element , timeout) {
        timeout = timeout || browser.params.time.long;
        var expected = protractor.ExpectedConditions;
        return browser.wait(expected.visibilityOf(element), timeout, "Element not found");
    };

    this.waitUrl = function (url, timeout) {
        timeout = timeout || browser.params.time.long;
        var expected = protractor.ExpectedConditions;
        return browser.wait(expected.urlContains(url), timeout, "URL has not contains "+url);
    };
};

module.exports = WaitUtils;

答案 1 :(得分:0)

我认为这是因为您的测试运行速度比浏览器加载元素的速度快,看看是否有效;

describe('post login', function () {
it('just a test for after user loged in', function (done) {
    console.log('post login');
    const ec = protractor.ExpectedConditions;
    const getStarted = element(by.css('.add-new-type'));

    browser.wait(ec.visibilityOf(getStarted), 5000);

    console.log('getStarted ' + JSON.stringify(getStarted));
    browser.wait(ec.elementToBeClickable(getStarted), 5000);
    console.log('post wait');
    browser.sleep(5000).then(done);
})});  

希望它有所帮助!

答案 2 :(得分:0)

所以在调查之后,我发现了有问题的提交,我们没有在我们的应用程序中更改任何css,但我确实使用$ timeout实现了自动保存机制。 我认为我们的内部超时在某种程度上导致与量角器超时的冲突...参考问题here(量角器' github repo)

他们建议使用$ interval而不是timeout - 这实际上解决了问题,但我不确定是否要使用此解决方法。