셀레늄에서 알려진 요소의 상위 요소 선택
Selenium 1로 선택할 수있는 특정 요소가 있습니다 .
불행히도 원하는 동작을 얻으려면 부모 요소를 클릭해야합니다. 내가 쉽게 찾을 수있는 요소에는 속성을 선택할 수 없어서 클릭 할 수 없습니다. XPath로 어떻게 위쪽으로 이동 합니까?
몇 가지 옵션이 있습니다. 샘플 코드는 Java로되어 있지만 다른 언어로의 이식은 간단해야합니다.
자바 스크립트 :
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", myElement);
XPath :
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath("./.."));
드라이버 구하기 WebElement
참고 : 보시다시피 JavaScript 버전의 경우 driver
. 직접 액세스 할 수없는 경우 다음을 WebElement
사용하여 검색 할 수 있습니다 .
WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
자세히 알아보기 XPath axes
아래 HTML
구조 가 있다고 가정 해 봅시다 .
<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
//span/parent::*
- 직계 부모 인 모든 요소를 반환 합니다 .
이 경우 출력은 <div class="parent">
//span/parent::div[@class="parent"]
- 정확한 노드 유형의 부모 요소 만 반환 하고 지정된 조건자가 True 인 경우 에만 반환합니다.
산출: <div class="parent">
//span/ancestor::*
- 모든 조상 (부모 포함)을 반환 합니다 .
출력 : <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
//span/ancestor-or-self::*
- 모든 조상 과 현재 요소 자체를 반환 합니다.
출력 : <span>Child</span>
, <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
//span/ancestor::div[2]
-유형의 두 번째 조상 (부모에서 시작)을 반환합니다div
.
산출: <div class="third_level_ancestor">
DOM을 다음과 같이 생각해 봅시다.
<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>
이제 <span>
텍스트를 기반으로 부모 태그 'a'를 선택한 다음
driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
설명 : 하위 노드의 값을 기반으로 노드를 선택하십시오.
가능한 XPath 축을 살펴보면 아마도 찾고있을 것입니다 parent
. 첫 번째 요소를 찾는 방법에 따라 xpath를 조정할 수 있습니다.
또는 당신은 시도 할 수 있습니다 더블 도트 구문 , ..
현재 노드의 부모를 선택합니다.
다른 사람에게 유용 할 수 있습니다.이 샘플 HTML 사용
<div class="ParentDiv">
<label for="label">labelName</label>
<input type="button" value="elementToSelect">
</div>
<div class="DontSelect">
<label for="animal">pig</label>
<input type="button" value="elementToSelect">
</div>
예를 들어 동일한 섹션 (예 : div)에있는 요소를 레이블로 선택하려면 다음을 사용할 수 있습니다.
//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect']
This just means, look for a label (it could anything like a
, h2
) called labelName
. Navigate to the parent of that label (i.e. div class="ParentDiv"
). Search within the descendants of that parent to find any child element with the value of elementToSelect
. With this, it will not select the second elementToSelect
with DontSelect
div as parent.
The trick is that you can reduce search areas for an element by navigating to the parent first and then searching descendant of that parent for the element you need. Other Syntax like following-sibling::h2
can also be used in some cases. This means the sibling following element h2
. This will work for elements at the same level, having the same parent.
You can do this by using /parent::node() in the xpath. Simply append /parent::node() to the child elements xpath.
For example: Let xpath of child element is childElementXpath.
Then xpath of its immediate ancestor would be childElementXpath/parent::node().
Xpath of its next ancestor would be childElementXpath/parent::node()/parent::node()
and so on..
Also, you can navigate to an ancestor of an element using 'childElementXpath/ancestor::*[@attr="attr_value"]'
. This would be useful when you have a known child element which is unique but has a parent element which cannot be uniquely identified.
We can select the parent tag with the help of Selenium as follows:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
this will help you to find the grandparent of the known Element. Just Remove one (/..) to find the immediate Parent Element.
Like:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
There are some other ways to implement this, but it worked fine for me.
참고URL : https://stackoverflow.com/questions/8577636/select-parent-element-of-known-element-in-selenium
'developer tip' 카테고리의 다른 글
C # 분할 문자열이지만 분할 문자 / 구분자 유지 (0) | 2020.08.23 |
---|---|
IIS7 설정 파일 위치 (0) | 2020.08.23 |
MSTest에는 NUnit의 TestCase와 동일한 기능이 있습니까? (0) | 2020.08.22 |
삽입 순서를 추적하는 std :: map? (0) | 2020.08.22 |
'XXX'키가있는 ViewData 항목은 'System.Int32'유형이지만 'IEnumerable'유형이어야합니다. (0) | 2020.08.22 |