2015-01-12 14 views
10

Tôi đang viết các bài kiểm tra thước đo và thích nó, mặc dù đôi khi dường như bị cuốn vào thứ gì đó dường như đơn giản. Ví dụ, tôi muốn lặp qua tất cả các nút trên một trong các trang của chúng tôi có văn bản 'Nominate'. Có hàng tá trên trang, nhưng chỉ có 1 hoặc 2 sẽ hiển thị. Vì vậy, tôi muốn nhấp vào cái đầu tiên. Dưới đây là đoạn code Tôi hiện đang sử dụng:Chọn phần tử có thể nhìn thấy đầu tiên trong thước đo

var nominateButtons = element.all(by.buttonText('Nominate')); 
    nominateButtons.then(function(els){ 
     for(var x = 0;x < els.length;x++){ 
      //Since isDisplayed returns a promise, I need to do it this way to get to the actual value 
      els[x].isDisplayed().then(function(isVisible){ 
       //isVisible now has the right value     
       if(isVisible){ 
        //But now els is not defined because of the scope of the promise!! 
        els[x].click(); 
       } 
      }); 
     } 
    }); 

Khi tôi chạy mã này, tôi nhận được một 'không thể gọi phương thức click không xác định' lỗi, vì els [x] không còn trong phạm vi, nhưng tôi có thể' t dường như kiểm tra khả năng hiển thị mà không sử dụng lời hứa. Vì vậy, câu hỏi của tôi là, làm thế nào bạn có thể lặp qua một tập hợp các phần tử, kiểm tra khả năng hiển thị của chúng và nhấp vào phần tử đầu tiên hiển thị? (Tôi đang cố gắng không sử dụng một mong đợi để kiểm tra tầm nhìn vì tôi biết rằng hầu hết các nút sẽ không được hiển thị)

Cảm ơn trước

Trả lời

15

els được định nghĩa. Những gì không được xác định là x. Cách đơn giản để làm điều đó là:

var nominateButtons = element.all(by.buttonText('Nominate')); 
var displayedButtons = nominateButtons.filter(function(elem) { 
    return elem.isDisplayed(); 
}); 
displayedButtons.first().click(); 

hoặc

element.all(by.buttonText('Nominate')). 
    filter(function(elem) { 
    return elem.isDisplayed(); 
    }). 
    first(). 
    click(); 

EDIT, bằng cách này, bạn không nên dựa vào hành vi này (nhấp vào nút đầu tiên của văn bản 'Nominate') bởi vì nó sẽ dẫn đến các vấn đề khi bạn thay đổi ứng dụng của mình. Xem nếu bạn có thể chọn bởi ID, hoặc chọn một cụ thể hơn 'Nominate' như element(by.css('the section the nominate is under')).element(by.buttonText('Nominate'));

EDIT lại: xem Using protractor with loops cho lời giải thích

+0

Cảm ơn bạn rất nhiều. Tôi đã chiến đấu với điều này cả ngày. Không chỉ tôi không nhận ra rằng x là thủ phạm, tôi đã không nhận thức được hàm đầu tiên() mà bạn tham chiếu, vì vậy tôi rất biết ơn. Tôi biết rằng việc nhấp vào phần tử đầu tiên không phải là một ý tưởng hay, và thông thường tôi sẽ tránh nó. Đây là một phần của một trường hợp lẻ mặc dù, và nó thực sự nên làm việc, mặc dù tôi biết tôi có thể sẽ cắn lưỡi của tôi về điều đó. Trong mọi trường hợp, tôi thực sự đánh giá cao việc bạn dành thời gian để trả lời. Nó đã nhận được trường hợp thử nghiệm của tôi làm việc cuối cùng, và dạy tôi một vài điều trên đường đi. Tôi là một anh chàng python và khá mới để JS và hứa hẹn – user2233949

+0

Bạn đang chào đón. Bạn nên chấp nhận câu trả lời nếu nó giúp bạn thay vì trả lời câu trả lời mới mặc dù =) – hankduan

+0

Tôi không biết chúng tôi có thể chuỗi yếu tố - cảm ơn – mrwaim

Các vấn đề liên quan