2017-03-20 87 views
0

我大部分时间都在做这个测试,我已经评论了我所做的事情,但它不起作用。我有能力搜索公司内的用户,然后生成一个表,并且我想选择一个匹配用户名称的表。目前我只使用td.text-center,因为它是表中唯一的td,但这看起来非常糟糕,并且如果系统中有其他具有相同名称的用户,则很容易中断。量角器测试非常缓慢,并且经常超时

尝试2似乎是最好的解决方案,但它总是给元素找不到错误。有没有人找到了在表格中定位TD的可靠方法?下面的方法适用于其它表,只是没有这一个....

this.editUser = function(name) { 

     // Original Code Block 
     //browser.actions().mouseMove(element(by.css('td.text-center'))).perform(); 
     //var editUserBtn = element(by.css('.user-action-open')); 
     //editUserBtn.click().then(function() { 
     // var editDetails = element(by.cssContainingText('li > a', 'Edit Details')); 
     // browser.wait(EC.visibilityOf(editDetails), 3000); 
     // editDetails.click(); 
     //}); 


     // Attempt 2 

     // browser.actions().mouseMove(element(by.css('td.text-center'))).perform(); 
     //browser.sleep(3000); 
     //var edit = element.all(by.repeater('user in users')).filter(function(rowElement){ 
     // return rowElement.element.all(by.css('td[ng-bind="user.Firstname"]')).getText().then(function(text){ 
     //  return text.trim() == name; 
     // }); 
     //}).first(); 
     //browser.actions().mouseMove(edit).perform(); 


     // Currently just times out and doesn't find the element. 

     var editUserButton = $('.user-action-open'); 
     browser.wait(EC.visibilityOf(editUserButton), 20000).then(function() { 
      editUserButton.click().then(function() { 
       var editDetails = element(by.cssContainingText('li > a', 'Edit Details')); 
       browser.wait(EC.visibilityOf(editDetails), 3000); 
       editDetails.click(); 
      }); 
     }); 
    } 

回答

1

你可以使用ExpectedConditions做一些等待,而不是武断地睡了3秒。您可以改为浏览器等待。如果对象处于期望的状态,这将等待到超时。

let users = element.all(by.repeater('user in users'); 

    // the original post shows that this is an element.all 
    // this would only be true if the user can have multiple first names 
    let firstName = element(by.css('td[ng-bind="user.Firstname"]')); 

    browser.actions().mouseMove(element(by.css('td.text-center'))).perform(); 

    // wait to see if the repeater is present or timeout in 3 seconds 
    browser.wait(users).isPresent(), 3000); 

    let edit = element.all(users).filter((rowElement) => { 
     // wait for first name, get the first name of the row's element 
     // if the text matches the name, resolve the promise true. 
     return browser.wait(rowElement.firstName, 3000).then(() => { 
     return rowElement.firstName.getText().then((text) => { 
      return text.trim() == name; 
     }); 
     }); 
    }).first(); 

    browser.actions().mouseMove(edit).perform(); 

rowElement.firstName可能不是正确的语法。


链的承诺

// wait to see if the repeater is present or timeout in 3 seconds 
    browser.wait(users).isPresent(), 3000).then(() => { 
    let edit = element.all(users).filter((rowElement) => { 
     // wait for first name, get the first name of the row's element 
     // if the text matches the name, resolve the promise true. 
     return browser.wait(rowElement.firstName, 3000).then(() => { 
     return rowElement.firstName.getText().then((text) => { 
      return text.trim() == name; 
     }); 
     }); 
    }).first(); 

    browser.actions().mouseMove(edit).perform(); 
    }).catch(err => { 
    // we could also have asserted the length was at least 1 
    // maybe we want to catch on something else? maybe this isn't a 
    // fail case so maybe do not use `fail(` 
    fail("did not find users"); 
    }); 
+0

,看起来不错,我想我试图做的主要事情是去除browser.actions.mouseMove到行盘旋,并用环路滤波器更换只需找到该行并点击它,不管出于什么原因,我似乎都无法做到这一点,所以会尝试这种方法 – theHussle

+0

如果你只是想点击一个对象,只要确保它可以点击。任意超时并不理想。另外,我不确定为什么有鼠标移动。我认为这与在“td.text-center''上悬停后出现的菜单有关。另一个缺少的是点击行动,如果你打算点击它。 – cnishina

+0

是的,它不是一个理想的设计,但必须与之合作。基本上它会生成一个表,当td悬停时出现一个编辑该特定行的按钮,因此显示的代码会让该行显示,但是我觉得这个设置很容易中断,因为它依赖于搜索返回一个td行。 – theHussle