量角器Angular 2 e2e测试:在登录后查找元素并执行操作

时间:2017-03-09 15:04:13

标签: angular protractor e2e-testing angularjs-e2e

我刚开始使用角度为2的量角器进行e2e测试。我在登录后找到一个元素并在其上执行操作时遇到问题(点击)。

登录后,它使用父消息组件中的消息组件构建页面。当运行测试时,查找父组件它成功,运行第二个测试查找子组件并执行它成功的操作。但是当删除第一个测试时,它失败了。我正在测试组件级别,我只想测试必要的。这里不需要进行第一次测试。见代码:

declare var by: any;
declare var browser: any;
declare var element: any;

function login() {

    let usernameInput = element(by.css("input[name=\"username\"]"));
    let passwordInput = element(by.css("input[name=\"password\"]"));
    let submit = element(by.css("button[type=\"submit\"]"));

    usernameInput.sendKeys("Username");
    passwordInput.sendKeys("welcome");

    submit.click();
}

describe("my-App", function () {
    let page: WebPage;

    beforeEach(() => {
        page = new WebPage();
    });

    // If I remove this it doesnt work
    it("If we provide credentials to the login form we should be authenticated and login", () => {
        page.navigateTo();
        login();
        expect(element(by.css("parent-element")).isPresent()).toBe(true);
    });

    it("should open conversation-component when clicking on a message", () => {
        page.navigateTo();
        // Do login here when the first it() is removed.
        // login();

        element(by.css("parent-element")).isPresent().then(function () {
            let message = element.all(by.css(".child-message")).first()
            message.click();
        });

        /* 
        == not working either ==
        browser.wait(element(by.css("parent-component")).isPresent(), 5000).then(function () {
            element.all(by.css(".child-message")).first().click();
        }); 
        */

    })

    expect(element(by.css("conversation-component")).isPresent()).toBe(true);
});

不要真正了解控制流程。检索邮件需要几秒钟。我在配置中玩了超时,但没有。

1 个答案:

答案 0 :(得分:1)

您应该使用beforeAll语句登录,这将在describe块中的所有代码之前运行一次。

beforeAll(() => {
    page.navigateTo();
    login();
});

此外,您可以移动您的页面=新的WebPage();在beforeEach(()=> {})块之外。

describe("my-App", function () {

    let page: WebPage;
    page = new WebPage();

    beforeAll(() => {
        page.navigateTo();
        login();
    });

回答关于等待的第二个问题

您的测试是在页面完全加载之前尝试与元素进行交互。在一个非纯粹的Angular.js的应用程序中发生这种情况是很常见的。

试试这段代码(我不是100%肯定它会起作用,因为看起来你正在使用打字稿)。

it('should open conversation-component when clicking on a message',() => {
    page.navigateTo();
    //browser.sleep(10000); //Uncomment this if the below solution does not work.
    var EC = protractor.ExpectedConditions;
    let message = $$('.child-message').first();
    var isClickable = EC.elementToBeClickable(message);
    browser.wait(isClickable,10000);
    message.click();
});

isPresent()函数可以(以非常有创意的方式)等待元素,但是ExpectedConditions更适合这个。请参阅此链接以了解有关它们的更多信息。 http://www.protractortest.org/#/api?view=ProtractorExpectedConditions