2017-12-29 89 views
0

여기에 작동하지 않습니다 테이블에 사용자 (FE "목록에 11 사용자")의각도기 스크립트는이 수를 나타냅니다 내가 요소의 사용자</p> <p>I gettext에()에 대한 정보가 들어있는 테이블 페이지를 열</p> <p>을 할 노력하고있어 정확히 제대로

나는 "목록에서 사용자"부분을 제거하고 나는 이름으로 특정 사용자를 찾을 필요가 루프

나중에에 사용하는 정수로 문자열을 변환 (9 번째 열) 그리고 j 번 wh ich는이 사용자의 정보가있는 행 번호입니다 (여기는 내가 갇혀 있습니다).

j 행의 첫 번째 열로 이동하여이 특정 사용자의 버튼을 편집하려고합니다. 사용자의 코드의

한 예로 나는 이것이 내가

true 
1 
true 
2 
true 
3 
true 
4 
true 
5 
true 
6 
true 
7 
true 
8 
true 
9 
true 
10 

는 그래서 계산 않을 수 있지만, 항상 true를 돌려주는 것입니다

it("Validation of ND account", function() { 
    //login 
    element(by.id("j_username")).sendKeys($usernameND); 
    element(by.id("j_password")).sendKeys($passwordND); 
    element(by.buttonText("Login")).click(); 
    //navigate to a page with list of users displayed in a table 
    element(by.xpath('//a[@short-title="Users"]')).click(); 
    //narrow the search result by typing 'testuser' 
    element(by.model("userList.searchBox.options.query")).sendKeys($usernameND); 
    //the table has 11 results such as 'testuser', 'testuser1', 'testuser2' 
    //I get text of element with text '11 users in list' to get just the number out of it 
    element(by.xpath('//div[@viewid="userList"]//div[@class="results-count ng-binding"]')).getText().then(function(numberOfUsers) { 
     numberOfUsers = Number(numberOfUsers.replace(" Users in list","")); 
     // declare a variable which will be responsible for accessing to j row in a table 
     var j=1 
     //I search through 11 rows from the table for my username 
     for (i=1; i<numberOfUsers; i++) { 

      element(by.xpath("(//td[@data-field='username'])["+j+"]")).getText().then(function(username){ 

       if (username===$usernameND){ 
        console.log("true"); 
        console.log(j); 
        j++ 
       } else { 
        console.log("false"); 
        j++ 
       } 
      }); 
     } 
    });  
}); 

시도 사용자 이름이 다르더라도 (첫 번째 행을 매번 확인하는 것처럼 보입니다). 나는

element(by.xpath('//div[@viewid="userList"]//div[@class="results-count ng-binding"]')).getText().then(function(numberOfUsers) { 
    numberOfUsers = Number(numberOfUsers.replace(" Users in list","")); 

    for (i=1; i<numberOfUsers; i++) { 
     element(by.xpath("(//td[@data-field='username'])["+i+"]")).getText().then(function(username){ 

      if (username===$usernameND){ 
       console.log("true"); 
       console.log(i); 
      } else { 
       console.log("false"); 
      }  
     });  
    }  
}); 

내가

true 
11 
false 
false 
false 
false 
false 
false 
false 
false 
false 

얻을 지금은 각 행에 액세스하고 잘 될 것 같다 다른 방법을 시도하지만, 첫 번째 행에 숫자 11가 무슨 일이야 반환? 그것을 고치는 방법?

P. 내가하는 일을 예를 들어 줄 것입니다. screenshot of the page 내 사용자를 찾고 '편집'버튼을 클릭하고 싶습니다. 첫 번째 열의 6 번째 행에서 셀을 클릭하기 만하면됩니다. 그러나 더 많은 사용자가 추가 될 경우이를 신뢰할 수있게 만들고 싶습니다. 이렇게하려면 사용자 이름 열을 검색하고이 사용자가 테이블에있는 행의 번호를 기록한 다음 찾은 행 번호의 첫 번째 열에있는 셀로 이동해야합니다.

답변

0

내가 쉽게 찾을 수있는 방법은 테이블에서 찾고이 행의 버튼 편집을 클릭 한 사용자의 tr에 액세스하는 것입니다. 두 가지 예

$username26="testuser26" 
element.all(by.xpath('//trLocator')).first().element(by.xpath("//tr[.//td[@data-field='username' and text()="+$username26+"]]")).element(by.xpath(".//a[text()='Edit']")).click() 

element(by.xpath("//td[@data-field='username' and text()='"+$username26+"']/..")).element(by.xpath(".//a[text()='Edit']")).click(); 

이해해야 할 중요한 부분은 현재 노드를 의미하는 두 번째 xpath의 점입니다. 이 점이 없으면 "//"은 문자 그대로 페이지의 어느 곳에서나 의미합니다. 즉, 이미 선택한 요소에서 시작하는 것을 의미하는 ".//"입니다.

이제이 방법은 길지만 이것은 내가 찾던 논리였습니다.

var tableRows = element.all(by.xpath('xpathTableRowsLocator')); //returns 11 rows 
var mentricsLogo = element(by.css('a.logo')); 
var searchedUsername = "TESTUSER26"; 

//somehow the code didn't work by itself so I had to place it inside of random function whuch I didn't care about 
mentricsLogo.isPresent().then(function(result) { 
     return tableRows.filter(function(eachRow, index) { 
//get text of the whole row and separate it by columns 
      return eachRow.getText().then(function(text){ 
       text=text.split(" ") 
// I get third element is username 
       if (text[2]===searchedUsername){ 
        var xpathIndex = Number(index)+1 
        element(by.xpath("//*[@id='user-list-content']/div[2]/div[2]/div[1]/div[2]/div[1]/table/tbody/tr["+xpathIndex+"]/td[1]/a")).click() 
       } 
      }) 
     }); 
}); 

나는 그것이 합리적으로 보일 수는 없다는 것을 알고 있지만 다른 어떤 것도 나를 위해 일하지 않았다.

0

솔직히 나는 당신이 무엇을 확인하고 있는지 몰랐습니다. 모든

먼저 당신이

element.all(by.xpath("(//td[@data-field='username'])")) 대신 그것은 elementArrayFinder 반환 element(by.xpath("(//td[@data-field='username'])["+j+"]"))

의 사용을 고려해야합니다. 변수 (예 : tableRows)에 할당 한 다음 해당 데이터로 처리 할 수 ​​있습니다.

당신은 문자열 "목록에 11 사용자"의 번호가 올바른지 여부를 확인하려는 경우, 유우 사용할 수 있습니다 tableRows.count()

할 수도 filter 요소 : http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.filter

사용 map : http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.map

정확하게 테스트해야 할 사항을 알려주세요.

편집 :

확인. 여기에 코드 샘플이 있습니다. 정의 된 사용자 (이 경우 TESTUSER26)의 EDIT 링크를 클릭합니다. 유일한 변경 사항은 defineSelectorForUsernameCell을 실제 값으로 변경하는 것입니다.

var tableRows = element.all(by.css('td')); 
var searchedUsername = 'TESTUSER26'; 

return tableRows.filter((eachRow) => { 
    return eachRow.element(by.css('defineSelectorForUsernameCell')).getText((usernameCellText) => { 
     if (usernameCellText === searchedUsername) { 
      return eachRow.element(by.linkText('EDIT')).click(); 
      } 
    }); 
}); 
+0

잘 테이블이 작동하는 행 수를 결정하는 부분. 네, 그렇게하는 것이 더 간단 할 것입니다. 그러나 이것은 내가 어려움에 처해있는 곳이 아닙니다. 나는 P.S. 단락 내 질문에, 제발 내가 뭘하는지 설명을보세요. –

+0

감사합니다. 내 편집 – Kacper

+0

을 확인하십시오.하지만 여전히 나던합니다. 그것은 내가 찾고있는 사용자의 행을 찾는다. (내 테이블에서 11 번에서 11 번까지 번호를 말할 수있다.) 편집 창이 열리지 만, 그 버튼을 5 번 더 시도한다. (11-6) 버튼이 더 이상 표시되지 않으므로 오류가 발생합니다. 나는 그 실행이 –