답변:
몇 가지 옵션이 있습니다. 샘플 코드는 Java로되어 있지만 다른 언어로의 이식은 간단해야합니다.
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", myElement);
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath("./.."));
WebElement
참고 : 보시다시피 JavaScript 버전의 경우 driver
. 직접 액세스 할 수없는 경우 다음을 WebElement
사용하여 검색 할 수 있습니다 .
WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
By.xpath(“./..”)
때 DOM 트리를 올바르게 이동 하려면을 사용해야 합니다 element.findElement
. 컨텍스트 노드를 설정하려면 선행 "./"가 필요합니다.
자세히 알아보기 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']]"));
설명 : 하위 노드의 값을 기반으로 노드를 선택하십시오.
div
여러 div로 다시 중첩되는 것을 찾고 있다면 .//span
in 대신 By.xpath("//div[.//span[text()='Close']]")
사용할 수 *//span
있으며 주어진 범위의 대부분의 상위 div 요소를 찾습니다. 지금은 같이 표시됩니다driver.findElement(By.xpath("//div[*//span[text()='Close']]"));
다른 사람에게 유용 할 수 있습니다.이 샘플 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']
이 단지 수단, 라벨에 대한보기는 (이 같은 것을 할 수 a
, h2
)라고합니다 labelName
. 해당 레이블 (예 :)의 부모로 이동합니다 div class="ParentDiv"
. 해당 부모의 하위 항목 내에서 검색하여 값이 인 자식 요소를 찾습니다 elementToSelect
. 이를 통해 div가 부모로 된 두 번째 elementToSelect
를 선택하지 않습니다 DontSelect
.
트릭은 먼저 부모로 이동 한 다음 필요한 요소에 대해 해당 부모의 하위 항목을 검색하여 요소의 검색 영역을 줄일 수 있다는 것입니다. 경우에 따라 다른 구문도 following-sibling::h2
사용할 수 있습니다. 이것은 형제 다음 요소를 의미합니다 h2
. 이는 동일한 상위 요소를 갖는 동일한 수준의 요소에 대해 작동합니다.
xpath에서 / parent :: node () 를 사용하여이를 수행 할 수 있습니다 . / parent :: node () 를 자식 요소 xpath에 추가하기 만하면 됩니다.
예를 들어, 자식 요소의 xpath를 childElementXpath로 설정 합니다.
그런 다음 직계 조상의 xpath는 childElementXpath / parent :: node () 입니다.
다음 조상의 Xpath는 childElementXpath / parent :: node () / parent :: node ()입니다.
등등..
또한를 사용하여 요소의 상위 항목으로 이동할 수 있습니다
'childElementXpath/ancestor::*[@attr="attr_value"]'
. 이것은 고유하지만 고유하게 식별 할 수없는 상위 요소가있는 알려진 하위 요소가있을 때 유용합니다.
다음과 같이 Selenium의 도움으로 상위 태그를 선택할 수 있습니다.
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
이것은 알려진 요소의 조부모를 찾는 데 도움이 될 것입니다. 바로 옆에있는 부모 요소를 찾으려면 하나 (/ ..) 만 제거하면됩니다.
처럼:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
이것을 구현하는 다른 방법이 있지만 잘 작동했습니다.