【问题标题】:Why did Jasmine expect always return true in protractor (Web UI Automation Test)为什么 Jasmine 期望在量角器中总是返回 true(Web UI 自动化测试)
【发布时间】:2017-04-21 15:49:31
【问题描述】:

我正在为 Angular 2 网站自动执行 Web UI 测试。但是,当我想检查登录步骤是否成功时遇到了问题。即使我为注销按钮输入了错误的密码或错误的 XPath,它也总是通过。

当我们成功登录时,这个元素才存在。正如我之前提到的,我故意为 btt_Logout 输入了错误的密码甚至错误的 xpath(xbutton 不是按钮),所以这个元素不能存在,但它仍然是真的。

即使我尝试了很多东西,我也不明白问题出在哪里。我只是将 toBe(true) 更改为 toBe(false) 但它仍然通过:)。似乎这个期望不起作用。我不明白为什么

    import {browser, ExpectedConditions as EC, $, $$, element,by} from 'protractor'
    import { Login } from '../page_objects/login.page';
    import { helper } from '../helpers/helper'


    declare let expect:any;
    describe('Testing Login ', function () {
        beforeEach(async () => {

        })


        it('Go to loginpage', async function () {
//Go to Login Page
            Login.openHomePage();

        });
        it('Login to the page', async function () {
//Enter username, password and press OK. It work well.
            Login.login("admin","admin@123");
//Waiting to see btt_Logout. Problems in here. It always true even i make XPath of btt_Logout wrong or make password wrong. I check/
            browser.wait(EC.presenceOf(Login.btt_Logout), 30000).then(function () {
                expect((Login.btt_Logout).isPresent()).toBe(true);
            }, function (error) {
                expect(true).toBe(false);
            });

        });



        afterAll(()=> {

            helper.cleanUp();
            console.warn(`Test finished!`)
        })
    })

登录页面对象:

import {browser, ExpectedConditions as EC, $, $$, element, by, ElementFinder} from 'protractor'
import {BasePage} from './base.page'
require('../helpers/waitReady.js');

class LoginPage extends BasePage {
    //Internal element
    protected txt_LoginUsername: ElementFinder = element(by.id('username'));
    protected txt_LoginPassword: ElementFinder = element(by.id('password'));
    protected btt_LoginSubmit: ElementFinder = element(by.xpath("//button[contains(@class,'btn-submit')]"));
    //External element

    public login(Username, Password) {
        this.txt_LoginUsername.sendKeys(Username);
        this.txt_LoginPassword.sendKeys(Password);
        this.btt_LoginSubmit.click();

    }
}

export const Login = new LoginPage();

基本页面:

import {browser, ExpectedConditions as EC, $, $$, element, by, ElementFinder} from 'protractor'
require('../helpers/waitReady.js');

export abstract class BasePage {
    protected url: string = '' // Will be same as baseUrl by default.
    public btt_Logout: ElementFinder = element(by.xpath("//xbutton[contains(@class,'btn-logout')]"));
    async openHomePage() {
        return await browser.get(this.url)
    }
    async openUrl(webUrl) {
        return await browser.get(webUrl)
    }
}

结果: 开始

茉莉花开始:

» 测试登录 ▻ 进入登录页面 . ✓ 转到登录页面(16 秒) ▻ 登录页面 . ✓ 登录页面(0.234 s) 测试完成!

2 种规格,0 次失败 在 16.599 秒内完成


  • 总结 *

在 17 秒内执行了 2 个规范中的 2 个

    PASSED   2 ( 100% )
    FAILED   0 ( 0% )
    SKIPPED  0 ( 0% )

[22:38:58] I/launcher - 0 个 WebDriver 实例仍在运行 [22:38:58] I/launcher - chrome #01 通过了

【问题讨论】:

    标签: angularjs angular jasmine protractor javascript-objects


    【解决方案1】:

    我相信这是因为您在expect((Login.btt_Logout).isPresent()).toBe(true); 中使用了isPresent(),它检查元素是否存在,因此它返回true。

    【讨论】:

    • 但为什么总是如此。正如我之前提到的,我为 btt_Logout 输入了错误的密码和错误的 XPath,但它仍然是正确的。
    • 因为元素始终存在,因此它始终存在,并且始终为真。
    • 不,这个元素在我们登录成功时才存在。正如我之前提到的,我故意为 btt_Logout (xbutton) 输入了错误的密码甚至错误的 xpath,所以这个元素不能存在,但它仍然是正确的。
    【解决方案2】:

    您的期望没有被触发,更不用说等待使您的测试变得混乱。此外,presenceOf 仅检查元素是否在 dom 中,而不是可见性。

    尝试在您的login() 方法中等待(无论如何这可能是它的正确位置),并公开注销按钮。 Protractor/jasmine 将在expect 中为您处理等待。

    import {browser, ExpectedConditions as EC, $, $$, element, by, ElementFinder} from 'protractor'
    import {BasePage} from './base.page'
    require('../helpers/waitReady.js');
    
    class LoginPage extends BasePage {
        //Internal element
        protected txt_LoginUsername: ElementFinder = element(by.id('username'));
        protected txt_LoginPassword: ElementFinder = element(by.id('password'));
        protected btt_LoginSubmit: ElementFinder = element(by.xpath("//button[contains(@class,'btn-submit')]"));
        public btt_Logout: ElementFinder = element(by.xpath("//xbutton[contains(@class,'btn-logout')]"));
        //External element
    
        public login(Username, Password) {
            this.txt_LoginUsername.sendKeys(Username);
            this.txt_LoginPassword.sendKeys(Password);
            this.btt_LoginSubmit.click();
            return browser.wait(EC.visibilityOf(this.btt_Logout), 30000, 'timeout: waiting for login');
        }
    }
    
    export const Login = new LoginPage();
    

    那么你的测试将是......

        it('Login to the page', async function () {
            Login.login("admin","admin@123");
    
            expect(Login.btt_Logout.isDisplayed()).toBe(true);
        });
    

    【讨论】:

    • 嗨 Brine,我改成了 isVisible,但它仍然不起作用。当我们成功登录时,这个元素才存在。正如我之前提到的,我故意为 btt_Logout (xbutton) 输入了错误的密码甚至错误的 xpath,所以这个元素不能存在,但它仍然是正确的。
    • 我只是将 toBe(true) 更改为 toBe(false) 但它仍然通过:)。好像这个功能不起作用。
    • 哎呀,我的意思是isDisplayed()。这意味着您的 expect 绝对不会被触发。
    • 是的,我的期望没有被触发。但实际上,我不知道为什么。
    • 我更新了我的答案。你等待的东西正在跳过期望。这应该可以工作,或者希望为您提供有关问题的线索。
    【解决方案3】:

    我刚刚发现我的问题是我将元素 login_button 放在了 base_page 中,这造成了一个大问题。当量角器打开时,它会寻找这个元素,这导致我们必须等待很长时间。 – Mike 刚刚编辑

    【讨论】:

      【解决方案4】:

      您是否检查过该特定对象是否不存在于 HTML/CSS 中?

      在某些情况下,如果您正在检查文本,
      该元素可能仍然存在并且只显示 EMPTY 值,
      这就是为什么它看起来不可见,而是 isPresent 和 isDisplayed。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-29
        • 2012-04-03
        • 2021-09-11
        • 2015-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多