Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 带等待的角度量角器测试的异步性质_Angular_Selenium_Asynchronous_Protractor_Wait - Fatal编程技术网

Angular 带等待的角度量角器测试的异步性质

Angular 带等待的角度量角器测试的异步性质,angular,selenium,asynchronous,protractor,wait,Angular,Selenium,Asynchronous,Protractor,Wait,我有以下用于量角器测试的typescript类。正在为身份验证运行OpenAM服务器 import { element, by, ElementFinder, browser, ExpectedConditions} from 'protractor'; import { BasePage } from './base.pageobject'; import { SelectSitePage } from './select-site.pageobject'; export class Aut

我有以下用于量角器测试的typescript类。正在为身份验证运行OpenAM服务器

import { element, by, ElementFinder, browser, ExpectedConditions} from 'protractor';
import { BasePage } from './base.pageobject';
import { SelectSitePage } from './select-site.pageobject';

export class AuthPage extends BasePage {
    readonly url: string = '/';

    readonly loginMenu: ElementFinder = element(by.css('nav.profile-menu'));
    readonly loginLink: ElementFinder = element(by.cssContainingText('a', 'Login'));
    readonly logoutLink: ElementFinder = element(by.cssContainingText('a', 'Logout'));

    // On OpenAM login page
    readonly userNameField: ElementFinder = element(by.id('idToken1'));
    readonly passwordField: ElementFinder = element(by.id('idToken2'));
    readonly loginButton: ElementFinder = element(by.id('loginButton_0'));
    readonly aintExist: ElementFinder = element(by.id('loginButton_666'));

    private selectSitePage: SelectSitePage = new SelectSitePage();

    /**
     * Log in if are not already
     */
    public logIn() {
        this.loginMenu.click();
        this.loginLink.isPresent().then((isPresent: boolean) => {
            if (isPresent) {
                this.loginLink.click();

                this.disableWaitingForAngular();
                var EC = ExpectedConditions;
                let loginButtonExpected = EC.presenceOf(this.loginButton);
                console.log('wait for login button ...');
                browser.driver.wait(loginButtonExpected, 2000);
                console.log('login button present');
                this.userNameField.clear();
                this.userNameField.sendKeys('user');
                this.passwordField.clear();
                this.passwordField.sendKeys('pw');
                this.loginButton.click();

                let searchBoxExpected = EC.presenceOf(this.selectSitePage.searchBox);
                console.log('wait for searchBox ...');
                browser.driver.wait(searchBoxExpected, 2000);
                console.log('searchBox present');

                this.enableWaitingForAngular();
            } else {
                console.log('AuthPage / logIn - already logged in');
            }
        });
    }
这运行正常,但是
console.log
s几乎立即出现,就好像
wait()
s对它们没有影响一样。但是,如果移除,测试将失败,因此它们似乎是相关的


等待是否只针对WebDriver对象?doco没有明确说明这一点。

量角器中几乎所有的命令都是
异步的。这意味着首先需要解决这些问题。这也适用于
等待
,请参阅

因此,在您的情况下,所有命令都是在彼此之后执行的,但由于
console.log()
是同步的,因此它将比前一行的promis得到解决更快地记录结果

如果你在承诺方面遇到困难,也许可以帮助你

如果希望
console.log()
发生在前一行之后,可以执行以下操作

var EC = ExpectedConditions;
let loginButtonExpected = EC.presenceOf(this.loginButton);
console.log('wait for login button ...');
browser.driver.wait(loginButtonExpected, 2000)
    .then(() => {
       console.log('login button present');
    });
顺便说一下。您正在使用TypeScript。这意味着您还可以使用方法
async/await
,这将使您的代码更加“同步”,并且
await
将在解析前一行之前“保持”执行下一行。另请参见上的示例项目


希望有帮助

好的,是的,这是有道理的。我同意这些承诺,但要意识到几乎所有的命令都是
async
,这是关键。现在,如果它们都是异步的,那么是什么阻止它们无序解析呢?感谢您提供有关
async
wait
的提示。考虑到量角器似乎能实现自己的承诺,我认为这是行不通的。谢谢这就是控制流的目的,请参见[此处](dragrator/blob/master/docs/Control flow.md)是的,我记得我读过关于它的文章。因此,为什么量角器有自己的承诺,因为它们在核心/本机承诺之外的特殊执行上下文中运行。选择!顺便说一句,链接是Tnx,这就是我看到的,也是他们要删除的原因,因为不同的承诺令人困惑?这是有道理的,所以看看他们的想法会很有趣。