Javascript 量角器测试时常失败

Javascript 量角器测试时常失败,javascript,protractor,angularjs-e2e,Javascript,Protractor,Angularjs E2e,我使用量角器为我的应用程序编写端到端测试。我确信测试应该是正确的。但我看到了错误:ElementNotVisibleError:element not visible,预期false为true,有时使用定位器找不到元素 以下是测试代码: describe "try test message center and it", -> beforeEach -> ptor = protractor.getInstance() ptor.ignoreSynchronizat

我使用量角器为我的应用程序编写端到端测试。我确信测试应该是正确的。但我看到了错误:
ElementNotVisibleError:element not visible
预期false为true
有时使用定位器找不到元素

以下是测试代码:

describe "try test message center and it", ->
  beforeEach ->
    ptor = protractor.getInstance()
    ptor.ignoreSynchronization = true

  it "should login", ->
    browser.driver.get homeURL
    browser.manage().window().maximize()
    element(`by`.xpath('//select/option[2]')).click()
    element(`by`.css('.buttons input')).click()

  it "should url is as expected", ->
    ptor = protractor.getInstance()
    expectedUrl = homeURL + '#/messages' 
    expect(ptor.getCurrentUrl()).toBe(expectedUrl)

  it "should create and send new message", ->
    ptor = protractor.getInstance()
    ptor.sleep 1000
    element(`by`.css('button.btn-primary')).click()
    element(`by`.model('uiData.createRecipient')).sendKeys 'James'
    ptor.sleep 1000
    element.all(`by`.repeater('match in matches')).get(1).click()
    element(`by`.model('uiData.createSubject')).sendKeys 'subject 2'
    element(`by`.model('uiData.createText')).sendKeys 'body of message'
    ptor.sleep 1000
    element(`by`.css('div.form-group a.btn-primary')).click()
    ptor.sleep 1000
    expect(element(`by`.css('.popupBox')).isPresent()).toBe(true)

  it "should check new message", ->
    ptor = protractor.getInstance()
    ptor.get('#/messages?folder=1')
    ptor.driver.navigate().refresh()
    ptor.sleep 5000
    element(`by`.model('uiData.to')).sendKeys 'k'
    ptor.sleep 3000
    element.all(`by`.cssContainingText('span.grid-col-to', 'James')).last().click()
    ptor.sleep 1000
    expect(element(`by`.xpath('//*[text()[contains(.,"body of message")]]')).isPresent()).toBe(true)
    element(`by`.xpath('//*[text()[contains(.,"Own it!")]]')).click()
    ptor.sleep 1000
    expect(element(`by`.cssContainingText('span', 'Owned by')).isPresent()).toBe(true)
    element(`by`.xpath('//*[text()[contains(.,"Disown it")]]')).click()
    ptor.sleep 1000
    expect(element(`by`.cssContainingText('span', 'Disowned by')).isPresent()).toBe(true)
量角器v1.0.0, Grunt量角器转轮v1.0.1 节点v0.10.28, NPM v1.4.9, Chrome驱动程序v2.10, Selenium服务器v2.42.2。 Jenkins在Windows Server 2008 R2下运行的测试


可能是什么?谢谢。

如果移动或调整窗口大小,它会隐藏量角器正在查找的元素。或者,量角器有时会在页面上的所有元素都以可视方式加载完毕之前移动到下一行代码。由于量角器模拟人类用户,因此它拒绝与隐藏元素交互


此外,您应该尽可能避免使用睡眠。

如果您移动或调整窗口大小,它可能会隐藏量角器正在查找的元素。或者,量角器有时会在页面上的所有元素都以可视方式加载完毕之前移动到下一行代码。由于量角器模拟人类用户,因此它拒绝与隐藏元素交互


此外,你应该尽可能避免使用睡眠。

两个可能有用的提示

  • 在paragrator.conf.js中设置窗口大小,使窗口大小始终相同,并且应始终显示相同的元素
  • 将html与screenshot reporter结合使用,以便在任何案例失败时都能看到屏幕上显示的内容 这两个技巧甚至适用于phantomjs。 将以下内容添加到paragrator.conf.js

    onPrepare: function () {
        // The require statement must be down here, since jasmine-reporters
        // needs jasmine to be in the global and protractor does not guarantee
        // this until inside the onPrepare function.
        var browserName,
            platform,
            window = browser.manage().window();
    
        require('jasmine-reporters');
        require('protractor-html-screenshot-reporter');
    
        jasmine.getEnv().addReporter(new jasmine.ConsoleReporter());
        // create a html reporter with screenshots
        jasmine.getEnv().addReporter(new HtmlReporter({
            baseDirectory: 'reports/screenshots'   ,
            takeScreenShotsOnlyForFailedSpecs: true
        }));
    
        // set the window size
        browser.getCapabilities().then(function (capabilities) {
                browserName = capabilities.caps_.browserName;
                platform = capabilities.caps_.platform;
            }
        ).then(function getCurrentWindowSize() {
                return window.getSize();
            }
        ).then(function setWindowSize(dimensions) {
                var windowWidth = 1980,
                    windowHeight = 1200;
    
                return window.setSize(windowWidth, windowHeight);
            }
        ).then(function getUpdatedWindowSize() {
                return window.getSize();
            }
        ).then(function showWindowSize(dimensions) {
                console.log('Browser:', browserName, 'on', platform, 'at', dimensions.width + 'x' + dimensions.height);
                console.log('Running e2e tests...');
            }
        );
    
    
    },
    

    两个可能有用的提示

  • 在paragrator.conf.js中设置窗口大小,使窗口大小始终相同,并且应始终显示相同的元素
  • 将html与screenshot reporter结合使用,以便在任何案例失败时都能看到屏幕上显示的内容 这两个技巧甚至适用于phantomjs。 将以下内容添加到paragrator.conf.js

    onPrepare: function () {
        // The require statement must be down here, since jasmine-reporters
        // needs jasmine to be in the global and protractor does not guarantee
        // this until inside the onPrepare function.
        var browserName,
            platform,
            window = browser.manage().window();
    
        require('jasmine-reporters');
        require('protractor-html-screenshot-reporter');
    
        jasmine.getEnv().addReporter(new jasmine.ConsoleReporter());
        // create a html reporter with screenshots
        jasmine.getEnv().addReporter(new HtmlReporter({
            baseDirectory: 'reports/screenshots'   ,
            takeScreenShotsOnlyForFailedSpecs: true
        }));
    
        // set the window size
        browser.getCapabilities().then(function (capabilities) {
                browserName = capabilities.caps_.browserName;
                platform = capabilities.caps_.platform;
            }
        ).then(function getCurrentWindowSize() {
                return window.getSize();
            }
        ).then(function setWindowSize(dimensions) {
                var windowWidth = 1980,
                    windowHeight = 1200;
    
                return window.setSize(windowWidth, windowHeight);
            }
        ).then(function getUpdatedWindowSize() {
                return window.getSize();
            }
        ).then(function showWindowSize(dimensions) {
                console.log('Browser:', browserName, 'on', platform, 'at', dimensions.width + 'x' + dimensions.height);
                console.log('Running e2e tests...');
            }
        );
    
    
    },