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

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>
  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">


답변

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'] 

이 단지 수단, 라벨에 대한보기는 (이 같은 것을 할 수 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']/..));

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