尝试确定是否存在元素时,我的量角器测试挂起

时间:2019-02-27 18:47:53

标签: protractor ui-automation

我有一个量角器测试装置,可以完成可以想象的最基本的操作。它登录到Web应用程序。直到我尝试通过在后续页面上查找某个元素的存在来评估登录是否成功,一切似乎都很好。我确定这是一个同步问题,但无法解决该问题。

注意事项:

  • 我对javascript还是很陌生(尽管不是编码),所以对代码改进的建议表示赞赏。
  • 登录功能就像一个魅力一样,包括等待。
  • 异步/承诺/等待仍然让我有点困惑。

登录方式

this.login = async function (repo, username, password, domain) {
    if (repo == null){ repo = REPO_UNDER_TEST; }

    browser.driver.manage().window().maximize();

    await this.openLoginPage(domain).
        then( this.selectRepo(repo) ).
        then( this.usernameTextBox.sendKeys(username) ).
        then( this.passwordTextBox.sendKeys(password) ).
        then( this.signInButton.click() ).
        then( async function() {
            console.log(`I'm starting my WAIT at ${Date().toString()}`);
            await browser.wait(
                EC.titleIs(repo), 
                32000
            );
        } )
};

测试代码

describe('Login Tests', function () {
it('should log you in given a good username/password', async function () {
    console.log(`I'm starting my TEST at ${Date().toString()}`);
    await loginPage.login(null, 'edwin', 'e', null);
    console.log(`I'm starting my EVAL at ${Date().toString()}`);

    var searchBox = element.all(by.model('searchQuery'));        
    expect(searchBox.isPresent()).toBe(true);
    expect(true).toBeTruthy();

    });  
});

console.logs只是用来确保事情以正确的顺序发生。如果我在希望显示searchBox的那一行注释掉,则测试将完成并正确评估简单的Expect(true).toBeTruthy()。如果我尝试运行对searchBox的期望,则测试会挂起,直到我手动将其关闭。然后控制台将告诉我期望失败,因为即使在console.log之前屏幕上清晰可见该项目不存在,该项目也不存在。

日志输出

[10:22:42] I/hosted - Using the selenium server at http://localhost:4444/wd/hub

Started

I'm starting my TEST at Wed Feb 27 2019 10:22:45 GMT-0800 (Pacific Standard Time)

I'm starting my WAIT at Wed Feb 27 2019 10:22:46 GMT-0800 (Pacific Standard Time)

I'm starting my EVAL at Wed Feb 27 2019 10:23:06 GMT-0800 (Pacific Standard Time)

F

Failures:

1) Login Tests should log you in given a good username/password

  Message:
    Expected false to be true.

  Stack:
    Error: Failed expectation
        at UserContext.<anonymous> 

(C:\GIT\TestFramework_POCs\protract\TESTS\login-spec.js:15:39)
        at process._tickCallback (internal/process/next_tick.js:68:7)


1 spec, 1 failure

Finished in 37.295 seconds


[10:23:22] I/launcher - 0 instance(s) of WebDriver still running

[10:23:22] I/launcher - chrome #01 failed 1 test(s)

[10:23:22] I/launcher - overall: 1 failed spec(s)

[10:23:22] E/launcher - Process exited with error code 1

2 个答案:

答案 0 :(得分:0)

您怀疑,这很可能是异步问题的结果。即使您的登录功能运行良好,我个人还是使用所有await而不是诸如{p>之类的.then()来编写它

this.login = async function (repo, username, password, domain) {
if (repo == null){ repo = REPO_UNDER_TEST; }

  await browser.driver.manage().window().maximize();

  await this.openLoginPage(domain);
  await this.selectRepo(repo);
  await this.usernameTextBox.sendKeys(username);
  await this.passwordTextBox.sendKeys(password);
  await this.signInButton.click();
  console.log(`I'm starting my WAIT at ${Date().toString()}`);
  await browser.wait(EC.titleIs(repo), 32000);
};

虽然.then()确实有效,但我发现在任何地方都使用await更好/更容易。 await等待下一个动作完成,然后再继续执行下一行代码,该代码与多个.then()相同,但是避免了多个.then()会变成恼人的圣诞树功能。

尽管您在isPresent()上检查element.all可能会引起问题,但我认为您的测试本身没有任何问题,而我猜这就是问题所在。 elementelement.all将不会处理任何元素。例如:

element.all(by.css('NothingHere'); // will return array with length of 0
element(by.css('NothingHere'); //will return an ElementFinder object

基本上,0是一个有效的响应,而空的ElementFinder会给出错误,因此,如果您的第一个检查位于element.all()上,则尚未加载的任何内容都会很高兴地返回0。但是,element()将看到没有任何内容,请等待该元素变为可见状态,直到它超时为止。如果您可以在element.all(by.model('searchQuery'));中找到一个唯一元素并将其定位,那么我希望它会通过。

此外,在使用异步/等待时,您还需要在conf文件中放入SELENIUM_PROMISE_MANAGER = false;

答案 1 :(得分:0)

以下代码中的两个问题:

1)element.all()没有isPresent()

2)您错过了以下代码中的await

var searchBox = element.all(by.model('searchQuery'));        
expect(await searchBox.get(0).isPresent()).toBe(true);

// or 
var searchBox = element(by.model('searchQuery'));        
expect(await searchBox.isPresent()).toBe(true);

请确认如何定位搜索框