2012-05-15 6 views
139

Tôi đang tìm kiếm một cái gì đó như:Có cách nào để lấy phần tử của XPath bằng JavaScript trong Selenium WebDriver không?

getElementByXpath(//html[1]/body[1]/div[1]).innerHTML 

tôi cần phải nhận được innerHTML của các yếu tố sử dụng JS (để sử dụng trong Selenium WebDriver/Java, vì WebDriver không thể tìm thấy nó chính nó), nhưng làm thế nào?

Tôi có thể sử dụng thuộc tính ID, nhưng không phải tất cả các phần tử đều có thuộc tính ID.

[FIXED]

Tôi đang sử dụng jsoup để làm cho nó thực hiện trong Java. Điều đó phù hợp với nhu cầu của tôi. Cảm ơn câu trả lời. :)

+2

Ngẫu nhiên, bộ chọn 'html' và' body' là thừa vì DIV phải là con cháu của BODY (ngay lập tức hoặc sâu hơn) và BODY phải là con của HTML, vì vậy miễn là không có phần tử DIV nào khác trong tài liệu , '// DIV [1]' nên hoạt động (mặc dù tôi khá yếu về các biểu thức XPath). Tương đương DOM là 'document.getElementsByTagName ('div') [1]' (hoặc có thể '0'). – RobG

Trả lời

230

Bạn có thể sử dụng document.evaluate:

tính toán một chuỗi biểu thức XPath và trả về một kết quả của sự kiểu được chỉ định nếu có thể.

Đó là w3-standardized và toàn documentend: https://developer.mozilla.org/en-US/docs/Web/API/Document.evaluate

function getElementByXpath(path) { 
 
    return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 
 
} 
 

 
console.log(getElementByXpath("//html[1]/body[1]/div[1]"));
<div>foo</div>

https://gist.github.com/yckart/6351935

Ngoài ra còn có một giới thiệu tuyệt vời về mạng phát triển mozilla: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#document.evaluate

+6

Phép thuật số 9 có nghĩa là gì? Nó sẽ là tốt hơn để sử dụng một hằng số được đặt tên ở đây. –

+3

@WillSheppard 'XPathResult.FIRST_ORDERED_NODE_TYPE === 9' https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#First_Node – yckart

+0

nó không hoạt động Trình duyệt mặc định Samsung Galaxy SIII –

7

Bạn có thể sử dụng JavaScript document.evaluate của javascript để chạy biểu thức XPath trên DOM. Tôi nghĩ rằng nó được hỗ trợ bằng cách này hay cách khác trong các trình duyệt trở lại IE 6.

MDN: https://developer.mozilla.org/en-US/docs/Web/API/Document/evaluate

IE hỗ trợ selectNodes để thay thế.

MSDN: https://msdn.microsoft.com/en-us/library/ms754523(v=vs.85).aspx

+5

Tôi muốn lưu ý rằng {document.evaluate} không hoạt động trong IE. –

1

Giả sử mục tiêu của bạn là để phát triển và thử nghiệm các truy vấn xpath của bạn cho các bản đồ màn hình. Sau đó, hoặc sử dụng Chrome's developer tools. Điều này cho phép bạn chạy truy vấn xpath để hiển thị các kết quả phù hợp. Hoặc trong Firefox> 9 bạn có thể thực hiện tương tự với Web Developer Tools console. Trong phiên bản cũ hơn, hãy sử dụng x-path-finder hoặc Firebug.

93

Trong Chrome Dev Công cụ bạn có thể chạy như sau:

$x("some xpath") 
+0

Tôi đã chơi với nó và nó có vẻ hoạt động, nhưng có tài liệu nào cho tính năng này không? Tôi không tìm thấy gì cả. – Eric

11

Đối với một cái gì đó giống như $ x từ chrome dòng lệnh api (để chọn nhiều phần tử) thử:

var xpath = function(xpathToExecute){ 
    var result = []; 
    var nodesSnapshot = document.evaluate(xpathToExecute, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 
    for (var i=0 ; i < nodesSnapshot.snapshotLength; i++){ 
    result.push(nodesSnapshot.snapshotItem(i)); 
    } 
    return result; 
} 

tổng quan MDN này giúp: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript

0

public class JSElementLocator {

@Test 
public void locateElement() throws InterruptedException{ 
    WebDriver driver = WebDriverProducerFactory.getWebDriver("firefox"); 

    driver.get("https://www.google.co.in/"); 


    WebElement searchbox = null; 

    Thread.sleep(1000); 
    searchbox = (WebElement) (((JavascriptExecutor) driver).executeScript("return document.getElementById('lst-ib');", searchbox)); 
    searchbox.sendKeys("hello"); 
} 

}

Đảm bảo bạn đang sử dụng đúng trình định vị cho nó.