셀레늄에서 알려진 요소의 상위 요소 선택


116

Selenium 1로 선택할 수있는 특정 요소가 있습니다 .

불행히도 원하는 동작을 얻으려면 부모 요소를 클릭해야합니다. 내가 쉽게 찾을 수있는 요소에는 속성을 선택할 수 없어서 클릭 할 수 없습니다. XPath로 어떻게 위쪽으로 이동 합니까?

답변:


169

몇 가지 옵션이 있습니다. 샘플 코드는 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();

41
조부모로 이동하려면 By.Xpath ( "../ ..")를 사용하십시오.
Monsignor

@Monsignor 작품 단지 파일 경로 ... 또는 URL 경로와 같은 : stackoverflow.com/questions/8577636/../../questions/8577636/...
jpaugh

이러한 XPath는 Selenium과 함께 사용하기에 적합하지 않습니다. 를 사용할 By.xpath(“./..”)때 DOM 트리를 올바르게 이동 하려면을 사용해야 합니다 element.findElement. 컨텍스트 노드를 설정하려면 선행 "./"가 필요합니다.
JimEvans 2018

35

자세히 알아보기 XPath axes

아래 HTML구조 가 있다고 가정 해 봅시다 .

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
  1. //span/parent::*- 직계 부모 인 모든 요소를 반환 합니다 .

이 경우 출력은 <div class="parent">

  1. //span/parent::div[@class="parent"]- 정확한 노드 유형의 부모 요소 반환 하고 지정된 조건자가 True 인 경우 에만 반환합니다.

산출: <div class="parent">

  1. //span/ancestor::*- 모든 조상 (부모 포함)을 반환 합니다 .

출력 : <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...

  1. //span/ancestor-or-self::*- 모든 조상 현재 요소 자체를 반환 합니다.

출력 : <span>Child</span>, <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...

  1. //span/ancestor::div[2]-유형의 두 번째 조상 (부모에서 시작)을 반환합니다 div.

산출: <div class="third_level_ancestor">


안녕하세요 @Anderson 제 질문에 대한 도움이 필요합니다. 살펴볼 시간이 있습니까? 미리 감사드립니다. stackoverflow.com/questions/54647055/…

18

DOM을 다음과 같이 생각해 봅시다.

<a>
    <!-- some other icons and texts -->
    <span>Close</span>
</a>

이제 <span>텍스트를 기반으로 부모 태그 'a'를 선택한 다음

driver.findElement(By.xpath("//a[.//span[text()='Close']]"));

설명 : 하위 노드의 값을 기반으로 노드를 선택하십시오.


div여러 div로 다시 중첩되는 것을 찾고 있다면 .//spanin 대신 By.xpath("//div[.//span[text()='Close']]")사용할 수 *//span있으며 주어진 범위의 대부분의 상위 div 요소를 찾습니다. 지금은 같이 표시됩니다driver.findElement(By.xpath("//div[*//span[text()='Close']]"));
재이 Prak에게

14

가능한 XPath 축을 살펴보면 아마도 찾고있을 것입니다 parent. 첫 번째 요소를 찾는 방법에 따라 xpath를 조정할 수 있습니다.

또는 당신은 시도 할 수 있습니다 더블 도트 구문 , ..현재 노드의 부모를 선택합니다.


5

다른 사람에게 유용 할 수 있습니다.이 샘플 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. 이는 동일한 상위 요소를 갖는 동일한 수준의 요소에 대해 작동합니다.


0

xpath에서 / parent :: node () 를 사용하여이를 수행 할 수 있습니다 . / parent :: node () 를 자식 요소 xpath에 추가하기 만하면 됩니다.

예를 들어, 자식 요소의 xpath를 childElementXpath로 설정 합니다.

그런 다음 직계 조상의 xpath는 childElementXpath / parent :: node () 입니다.

다음 조상의 Xpath는 childElementXpath / parent :: node () / parent :: node ()입니다.

등등..

또한를 사용하여 요소의 상위 항목으로 이동할 수 있습니다 'childElementXpath/ancestor::*[@attr="attr_value"]'. 이것은 고유하지만 고유하게 식별 할 수없는 상위 요소가있는 알려진 하위 요소가있을 때 유용합니다.


0

다음과 같이 Selenium의 도움으로 상위 태그를 선택할 수 있습니다.

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));

이것은 알려진 요소의 조부모를 찾는 데 도움이 될 것입니다. 바로 옆에있는 부모 요소를 찾으려면 하나 (/ ..) 만 제거하면됩니다.

처럼:

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));

이것을 구현하는 다른 방법이 있지만 잘 작동했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.