如果可能的话,我想写IF ELSE声明DRYer

Protractor - I want to write IF ELSE statement DRYer, if possible

本文关键字:IF ELSE 声明 DRYer 如果      更新时间:2023-09-26

我能D.R.Y这个代码吗?如果id invite-user标签显示在用户的简档中,则用户可以点击以请求玩游戏ELSE,则将选择新的随机用户,直到id invite-user显示在用户简档中为止。

  browser.get("/index").then(function() {
   element.all(by.css('game-player')).get(randomUser).click();
   browser.sleep(sleep);
element(by.id('invite-user')).isDisplayed().then(function(clickUser) {
  if (clickUser) {
    element(by.id('invite-user')).click();
    element(by.id('role')).sendKeys('Player');
    button.click();
    browser.sleep(sleep);
    expect(element(by.id('pending-admin-approval')).first().isDisplayed()).toBe(true);
  } else {
    browser.get("/index").then(function() {
      element.all(by.css('game-player')).get(randomUser).click();
      browser.sleep(sleep);
      element(by.id('invite-user')).click();
      element(by.id('role')).sendKeys('Player');
      button.click();
      browser.sleep(sleep);
      expect(element(by.id('pending-admin-approval')).first().isDisplayed()).toBe(true);
    });
  }
});

});

browser.get("/index").then(function() {
    element.all(by.css('game-player')).get(randomUser).click();
    browser.sleep(sleep);
    element(by.id('invite-user')).isDisplayed().then(function(clickUser) {
        if (clickUser) {
            inviteUser();
        } else {
            browser.get("/index").then(function() {
                element.all(by.css('game-player')).get(randomUser).click();
                browser.sleep(sleep);
                inviteUser();
            });
        }
    });
    function inviteUser(){
        element(by.id('invite-user')).click();
        element(by.id('role')).sendKeys('Player');
        button.click();
        browser.sleep(sleep);
        expect(element(by.id('pending-admin-approval')).first().isDisplayed()).toBe(true);
    }
});

更优化的方法:

    browser.get("/index").then(function() {
        element.all(by.css('game-player')).get(randomUser).click();
        waitForApi();
        element(by.id('invite-user')).isDisplayed().then(function(clickUser) {
            if (clickUser) {
                inviteUser();
                return; // Don't go further 
            }
            browser.get("/index").then(function() {
                element.all(by.css('game-player')).get(randomUser).click();
                waitForApi();
                inviteUser();
            });
        });
        function inviteUser(){
            element(by.id('invite-user')).click();
            element(by.id('role')).sendKeys('Player');
            button.click();
            waitForApi();
            expect(element(by.id('pending-admin-approval')).first().isDisplayed()).toBe(true);
        }

需要这个功能:例如,如果我们在browser.sleep中设置2000(即2秒),那么会有两种情况:1。API花费的时间超过2秒,那么测试用例将失败2。API花费的时间少于2秒,因此我们不得不不必要地等待。因此,为了克服这个问题,我建议当API成功执行时,对我们显示/隐藏的元素进行检查

        function waitForApi(){
            let EC = protractor.ExpectedConditions;
            // Waits for the api loader to be no longer visible
            browser.wait(EC.invisibilityOf(element(by.css('#test > .loader'))), 10000); // TODO : Change the condition as per visibility/invisibilty of element in your project
        }
    });