Chọn phần tử mẹ của phần tử đã biết trong Selenium


116

Tôi có một phần tử nhất định mà tôi có thể chọn với Selenium 1.

Thật không may, tôi cần phải nhấp vào phần tử cha để có được hành vi mong muốn. Phần tử tôi có thể dễ dàng định vị có thuộc tính không thể chọn được, làm cho nó chết khi nhấp vào. Làm cách nào để điều hướng lên trên với XPath ?

Câu trả lời:


169

Có một vài lựa chọn ở đó. Mã mẫu bằng Java, nhưng cổng sang các ngôn ngữ khác phải đơn giản.

JavaScript:

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("./.."));

Lấy trình điều khiển từ WebElement

Lưu ý: Như bạn có thể thấy, đối với phiên bản JavaScript, bạn sẽ cần driver. Nếu bạn không có quyền truy cập trực tiếp vào nó, bạn có thể lấy nó từ WebElementcách sử dụng:

WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();

41
Và nếu bạn muốn điều hướng đến ông bà, hãy sử dụng By.Xpath ("../ ..").
Đức ông

@Monsignor trình giống như đường dẫn tập tin ... hoặc đường dẫn URL: stackoverflow.com/questions/8577636/../../questions/8577636/...
jpaugh

Không có XPath nào trong số này đúng để sử dụng với Selenium. Người ta cần sử dụng By.xpath(“./..”)để đi lên cây DOM một cách chính xác khi sử dụng element.findElement. “./” đứng đầu là bắt buộc để đặt nút ngữ cảnh.
JimEvans

35

Thêm một chút về XPath axes

Giả sử chúng ta có HTMLcấu trúc bên dưới :

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
  1. //span/parent::*- trả về bất kỳ phần tử nào là cha trực tiếp.

Trong trường hợp này, đầu ra là <div class="parent">

  1. //span/parent::div[@class="parent"]- yếu tố lợi nhuận mẹ chỉ loại nút chính xác và chỉ nếu vị nhất định là True.

Đầu ra: <div class="parent">

  1. //span/ancestor::*- trả về tất cả tổ tiên (bao gồm cả cha mẹ).

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

  1. //span/ancestor-or-self::*- trả về tất cả tổ tiên chính phần tử hiện tại.

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

  1. //span/ancestor::div[2]- trả về tổ tiên thứ hai (bắt đầu từ cha mẹ) của kiểu div.

Đầu ra: <div class="third_level_ancestor">


Xin chào @Anderson Tôi cần trợ giúp với câu hỏi của mình Bạn có thời gian để xem qua không? Cảm ơn bạn trước. stackoverflow.com/questions/54647055/…

18

Hãy coi DOM của bạn là

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

Bây giờ bạn cần chọn thẻ cha 'a' dựa trên <span>văn bản, sau đó sử dụng

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

Giải thích: Chọn nút dựa trên giá trị của nút con của nó


Nếu chúng ta đang tìm kiếm divđược một lần nữa lồng với nhiều divs sau đó thay vì .//spantrong By.xpath("//div[.//span[text()='Close']]")chúng ta có thể sử dụng *//span, nó sẽ tìm kiếm nhất phần tử div mẹ của khoảng nhất định. Bây giờ nó sẽ giống như thế nàydriver.findElement(By.xpath("//div[*//span[text()='Close']]"));
Jai Prak

14

Hãy xem các trục XPath có thể có, có thể bạn đang tìm kiếm parent. Tùy thuộc vào cách bạn đang tìm phần tử đầu tiên, bạn có thể chỉ cần điều chỉnh xpath cho phần tử đó.

Hoặc bạn có thể thử các đôi dot cú pháp , ..mà chọn phụ huynh của nút hiện hành.


5

Điều này có thể hữu ích cho người khác: Sử dụng html mẫu này

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

Ví dụ: nếu tôi muốn chọn một phần tử trong cùng một phần (ví dụ: div) làm nhãn, bạn có thể sử dụng

//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect'] 

Điều này chỉ có nghĩa là, hãy tìm một nhãn (có thể giống như a, h2) được gọi là labelName. Điều hướng đến cấp độ gốc của nhãn đó (tức là div class="ParentDiv"). Tìm kiếm trong phần tử con của phần tử cha đó để tìm bất kỳ phần tử con nào có giá trị elementToSelect. Với điều này, nó sẽ không chọn thứ hai elementToSelectvới DontSelectdiv là cha.

Bí quyết là bạn có thể giảm các khu vực tìm kiếm cho một phần tử bằng cách điều hướng đến phần tử gốc trước rồi tìm kiếm phần tử con của phần tử bạn cần. Cú pháp khác như following-sibling::h2cũng có thể được sử dụng trong một số trường hợp. Điều này có nghĩa là phần tử sau anh chị em h2. Điều này sẽ hoạt động đối với các phần tử ở cùng cấp, có cùng cha mẹ.


0

Bạn có thể làm điều này bằng cách sử dụng / parent :: node () trong xpath. Đơn giản chỉ cần nối / parent :: node () vào các phần tử con xpath.

Ví dụ: Cho xpath của phần tử con là childElementXpath .

Khi đó xpath của tổ tiên trực tiếp của nó sẽ là childElementXpath / parent :: node () .

Xpath tổ tiên tiếp theo của nó sẽ là childElementXpath / parent :: node () / parent :: node ()

và như thế..

Ngoài ra, bạn có thể điều hướng đến tổ tiên của một phần tử bằng cách sử dụng 'childElementXpath/ancestor::*[@attr="attr_value"]'. Điều này sẽ hữu ích khi bạn có một phần tử con đã biết là duy nhất nhưng có một phần tử mẹ không thể được xác định duy nhất.


0

Chúng ta có thể chọn thẻ cha với sự trợ giúp của Selenium như sau:

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

điều này sẽ giúp bạn tìm ra ông bà của Phần tử đã biết. Chỉ cần Xóa một (/ ..) để tìm Phần tử gốc ngay lập tức.

Giống:

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

Có một số cách khác để thực hiện điều này, nhưng nó hoạt động tốt đối với tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.