Selenium으로 인덱스별로 Xpath 노드 세트 내에서 지정된 노드를 선택하는 방법은 무엇입니까?
Selenium 테스트 케이스를 작성 중입니다. 다음은 데이터 테이블 내의 모든 '수정'버튼과 일치하는 데 사용하는 xpath 표현식입니다.
//img[@title='Modify']
내 질문은 인덱스별로 일치하는 노드 집합을 어떻게 방문 할 수 있습니까? 나는 시도했다
//img[@title='Modify'][i]
과
//img[@title='Modify' and position() = i]
그러나 둘 다 작동하지 않습니다 .. 또한 XPath 검사기 (하나의 firefox 확장)로 시도했습니다. 총 13 개의 일치 항목이 발견되었는데 그중 하나를 어떻게 선택해야할지 전혀 모릅니다. 아니면 XPath가 동일한 상위 노드 아래에 있지 않은 특정 노드 선택을 지원합니까?
이것은 FAQ입니다 :
//someName[3]
의미 : someName
문서의 모든 요소, 즉 someName
부모 의 세 번째 하위 요소-그러한 요소가 많이있을 수 있습니다.
원하는 것은 정확히 세 번째 someName
요소입니다 .
(//someName)[3]
설명 :이 ( []
가)보다 우선 순위 (우선 순위)가 높습니다 //
. //someName
선택한 노드 목록의 N 번째 노드를 지정해야 할 때 항상 유형의 표현식을 괄호 안에 넣어야 합니다.
i
XPath 에는 없습니다 .
리터럴 숫자를 사용하십시오. //img[@title='Modify'][1]
또는 표현식 문자열을 동적으로 빌드합니다. '//img[@title='Modify']['+i+']'
그러나 동적 XPath 표현식은 XSLT 내에서 작동하지 않습니다 .
아니면 XPath가 동일한 상위 노드 아래에 있지 않은 특정 노드 선택을 지원합니까?
예: (//img[@title='Modify'])[13]
이는 //img[@title='Modify'][i]
" <img>
제목이 '수정'이고 하위 요소가 인 모든 항목"을 의미합니다 <i>
.
//img[@title='Modify'][i]
약자
/descendant-or-self::node()/img[@title='Modify'][i]
따라서 동일한 부모 노드 아래에서 i 번째 노드를 반환합니다.
원하는
/descendant-or-self::img[@title='Modify'][i]
(// * [@ attribute = 'value']) [index]는 요소에서 여러 일치 항목을 찾는 동안 요소의 대상을 찾습니다.
더 없다 i
XPath는에 완전히 사실이 아니다. 여전히를 사용 count()
하여 색인을 찾을 수 있습니다 .
다음 페이지를 고려하십시오
<html>
<head>
<style>
table, td, th {
border: 1px solid black;
font-size: 15px;
font-family: Trebuchet MS, sans-serif;
}
table {
border-collapse: collapse;
width: 100%;
}
th, td {
text-align: left;
padding: 8px;
}
tr:nth-child(even){background-color: #f2f2f2}
th {
background-color: #4CAF50;
color: white;
}
</style>
<table>
<thead>
<tr>
<th>Heading 1</th>
<th>Heading 2</th>
<th>Heading 3</th>
<th>Heading 4</th>
<th>Heading 5</th>
<th>Heading 6</th>
</tr>
</thead>
<tbody>
<tr>
<td>Data row 1 col 1</td>
<td>Data row 1 col 2</td>
<td>Data row 1 col 3</td>
<td>Data row 1 col 4</td>
<td>Data row 1 col 5</td>
<td>Data row 1 col 6</td>
</tr>
<tr>
<td>Data row 2 col 1</td>
<td>Data row 2 col 2</td>
<td>Data row 2 col 3</td>
<td>Data row 2 col 4</td>
<td>Data row 2 col 5</td>
<td>Data row 2 col 6</td>
</tr>
<tr>
<td>Data row 3 col 1</td>
<td>Data row 3 col 2</td>
<td>Data row 3 col 3</td>
<td>Data row 3 col 4</td>
<td>Data row 3 col 5</td>
<td>Data row 3 col 6</td>
</tr>
<tr>
<td>Data row 4 col 1</td>
<td>Data row 4 col 2</td>
<td>Data row 4 col 3</td>
<td>Data row 4 col 4</td>
<td>Data row 4 col 5</td>
<td>Data row 4 col 6</td>
</tr>
<tr>
<td>Data row 5 col 1</td>
<td>Data row 5 col 2</td>
<td>Data row 5 col 3</td>
<td>Data row 5 col 4</td>
<td>Data row 5 col 5</td>
<td>Data row 5 col 6</td>
</tr>
<tr>
<td><button>Modify</button></td>
<td><button>Modify</button></td>
<td><button>Modify</button></td>
<td><button>Modify</button></td>
<td><button>Modify</button></td>
<td><button>Modify</button></td>
</tr>
</tbody>
</table>
</br>
<table>
<thead>
<tr>
<th>Heading 7</th>
<th>Heading 8</th>
<th>Heading 9</th>
<th>Heading 10</th>
<th>Heading 11</th>
<th>Heading 12</th>
</tr>
</thead>
<tbody>
<tr>
<td>Data row 1 col 1</td>
<td>Data row 1 col 2</td>
<td>Data row 1 col 3</td>
<td>Data row 1 col 4</td>
<td>Data row 1 col 5</td>
<td>Data row 1 col 6</td>
</tr>
<tr>
<td>Data row 2 col 1</td>
<td>Data row 2 col 2</td>
<td>Data row 2 col 3</td>
<td>Data row 2 col 4</td>
<td>Data row 2 col 5</td>
<td>Data row 2 col 6</td>
</tr>
<tr>
<td>Data row 3 col 1</td>
<td>Data row 3 col 2</td>
<td>Data row 3 col 3</td>
<td>Data row 3 col 4</td>
<td>Data row 3 col 5</td>
<td>Data row 3 col 6</td>
</tr>
<tr>
<td>Data row 4 col 1</td>
<td>Data row 4 col 2</td>
<td>Data row 4 col 3</td>
<td>Data row 4 col 4</td>
<td>Data row 4 col 5</td>
<td>Data row 4 col 6</td>
</tr>
<tr>
<td>Data row 5 col 1</td>
<td>Data row 5 col 2</td>
<td>Data row 5 col 3</td>
<td>Data row 5 col 4</td>
<td>Data row 5 col 5</td>
<td>Data row 5 col 6</td>
</tr>
<tr>
<td><button>Modify</button></td>
<td><button>Modify</button></td>
<td><button>Modify</button></td>
<td><button>Modify</button></td>
<td><button>Modify</button></td>
<td><button>Modify</button></td>
</tr>
</tbody>
</table>
</head>
</html>
이 페이지에는 2 개의 테이블이 있으며 각각 고유 한 열 이름이있는 6 개의 열과 가변 데이터가있는 6 개의 행이 있습니다. 마지막 행에는 Modify
두 테이블 모두에 버튼이 있습니다.
사용자가 Modify
제목을 기준으로 첫 번째 테이블에서 네 번째 버튼 을 선택해야한다고 가정합니다.
xpath 사용 //th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button
count()
운영자는 이와 같은 상황에서 유용합니다.
논리:
- 다음
Modify
을 사용 하여 버튼 의 헤더를 찾습니다.//th[.='Heading 4']
- 다음을 사용하여 헤더 열의 색인을 찾습니다.
count(//tr/th[.='Heading 4']/preceding-sibling::th)+1
참고 : 색인은
0
다음을 사용하여 해당 헤더에 대한 행을 가져옵니다.
//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]
Get the
Modify
button from the extracted node list using//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button
Here is the solution for index variable
Let's say, you have found 5 elements with same locator and you would like to perform action on each element by providing index number (here, variable is used for index as "i")
for(int i=1; i<=5; i++)
{
string xPathWithVariable = "(//div[@class='className'])" + "[" + i + "]";
driver.FindElement(By.XPath(xPathWithVariable)).Click();
}
It takes XPath :
(//div[@class='className'])[1]
(//div[@class='className'])[2]
(//div[@class='className'])[3]
(//div[@class='className'])[4]
(//div[@class='className'])[5]
'Program Tip' 카테고리의 다른 글
Unix 타임 스탬프에 대한 Excel 날짜 (0) | 2020.10.04 |
---|---|
Android 오프라인 문서 및 샘플 코드 (0) | 2020.10.04 |
JSLint '==='를 예상하고 대신 '=='를 보았습니다. (0) | 2020.10.04 |
코코아 : 프레임과 경계의 차이점은 무엇입니까? (0) | 2020.10.03 |
jQuery를 사용하여“Please Wait, Loading…”애니메이션을 어떻게 만들 수 있습니까? (0) | 2020.10.03 |