Câu trả lời:
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.
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
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ừ WebElement
cách sử dụng:
WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
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.
Thêm một chút về XPath axes
Giả sử chúng ta có HTML
cấ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>
//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">
//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">
//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">
...
//span/ancestor-or-self::*
- trả về tất cả tổ tiên và 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">
...
//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">
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ó
div
được một lần nữa lồng với nhiều divs sau đó thay vì .//span
trong 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']]"));
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.
Đ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 elementToSelect
với DontSelect
div 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::h2
cũ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ẹ.
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.
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.