Angularjs 量角器:如果调试,则迭代选项有效,如果调试不成功,则迭代选项无效

Angularjs 量角器:如果调试,则迭代选项有效,如果调试不成功,则迭代选项无效,angularjs,combobox,protractor,Angularjs,Combobox,Protractor,为了brievity的缘故,我进行了以下测试,删除了page对象: element(by.model("elc.search.placeOfBirth")) //this is a select element(by.model("elc.search.placeOfBirth")).all(by.tagName("option")).then(function(options) { for(var i = 0; i < options.length; i++) { opti

为了brievity的缘故,我进行了以下测试,删除了page对象:

element(by.model("elc.search.placeOfBirth")) //this is a select

element(by.model("elc.search.placeOfBirth")).all(by.tagName("option")).then(function(options) {
  for(var i = 0; i < options.length; i++) {
    options[i].getText().then(function(text) {
      if(text !== "---") {
        element(by.model("elc.search.placeOfBirth")).sendKeys(text);

        var firstRow = element.all(by.repeater("employee in elc.filtered")).first();
        firstRow.all(by.tagName("td")).then(function(cells) {
          expect(cells[4].getText()).toBe(text);
        });

        var lastRow = element.all(by.repeater("employee in elc.filtered")).last();
        lastRow.all(by.tagName("td")).then(function(cells) {
          expect(cells[4].getText()).toBe(text);
        });
      }
    });
  }
});
让我解释一下这里发生了什么。我有一张桌子,上面有一个选择框。表的第5列与select组合框相关,我在ng repeat中为表使用的数组由组合框中的值过滤。我想在这里做的是检查组合框中的值,选择一个特定的值,并确保表的第一行和最后一行都有该值

如果我只是在循环中使用browser.debugger,那么这会起作用,测试也会通过,但是如果我不调试,测试似乎进行得太快,我的表更新得不够快,测试就会失败。我猜这是因为一个承诺没有得到解决,代码一直在运行,但我不确定我在等待哪个承诺,因为我也尝试在我将键发送到组合框之后放置一个.thenfunction{…}。

我猜for循环执行得很快,因此它里面等待承诺的代码被跳过。可以通过在for循环内执行函数来避免这种情况。更新你的代码来完成它-

var someFunction = function(options, i){
    //Write your code that was inside your for loop
};

element(by.model("elc.search.placeOfBirth")).all(by.tagName("option")).then(function(options) {
    for(var i = 0; i < options.length; i++) {
        someFunction(options, i);
    }
});
在执行任何操作之前,可以使用中间的等待来确保DOM已更新。希望它能解决您的问题。

我想您的for循环执行得很快,因此它里面等待承诺的代码会被跳过。可以通过在for循环内执行函数来避免这种情况。更新你的代码来完成它-

var someFunction = function(options, i){
    //Write your code that was inside your for loop
};

element(by.model("elc.search.placeOfBirth")).all(by.tagName("option")).then(function(options) {
    for(var i = 0; i < options.length; i++) {
        someFunction(options, i);
    }
});

在执行任何操作之前,可以使用中间的等待来确保DOM已更新。希望它能解决您的问题。

当我将其提取到单独的函数中时,它似乎会变慢,但我的组合框只会以这种方式第一次发送键,并忽略其他值,我添加了一个console.log以确保不同的文本值存在。知道为什么组合框会忽略发送的更多键吗?另外,当我将代码提取到一个函数中时,为什么代码会起作用,这有什么区别?从我可以看出,第二次调用sendkeys时,实际上并没有删除第一次发送的键。这会导致一个问题,因为我无法清除实际的选择框。有什么建议吗?@user2352164您必须手动清除文本框或组合框值。无论何时输入任何新内容,它都会增加现有值。要删除现有数据,请在输入新数据之前,在函数末尾包含elementby.modellelc.search.placeOfBirth.clear命令。希望它有帮助问题是,它不允许我清除select元素,它会抛出一个错误,指出只能在文本输入上调用clear。@user2352164我以为你在试图清除组合框。我不知道是否清除了select元素。在选择元素的情况下,如果已启用为用户选择默认项,则您所能做的就是使用单击操作选择默认元素。单击select元素上的一个选项可以获得堆栈溢出的帮助。谢谢当我把它解压到一个单独的函数中时,它似乎会变慢。我的组合框只会第一次以这种方式发送键,而忽略了其他值。我添加了一个console.log,以确保不同的文本值存在。知道为什么组合框会忽略发送的更多键吗?另外,当我将代码提取到一个函数中时,为什么代码会起作用,这有什么区别?从我可以看出,第二次调用sendkeys时,实际上并没有删除第一次发送的键。这会导致一个问题,因为我无法清除实际的选择框。有什么建议吗?@user2352164您必须手动清除文本框或组合框值。无论何时输入任何新内容,它都会增加现有值。要删除现有数据,请在输入新数据之前,在函数末尾包含elementby.modellelc.search.placeOfBirth.clear命令。希望它有帮助问题是,它不允许我清除select元素,它会抛出一个错误,指出只能在文本输入上调用clear。@user2352164我以为你在试图清除组合框。我不知道是否清除了select元素。在选择元素的情况下,如果已启用为用户选择默认项,则您所能做的就是使用单击操作选择默认元素。单击select元素上的一个选项可以获得堆栈溢出的帮助。谢谢