Có cách nào để lấy phần tử bằng XPath bằng JavaScript trong Selenium WebDriver không?


252

Tôi đang tìm kiếm một cái gì đó như:

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

Tôi cần lấy phần bên trong của các phần tử bằng cách sử dụng JS (để sử dụng phần tử đó trong Selenium WebDriver / Java, vì WebDriver không thể tự tìm thấy 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 yếu tố đều có thuộc tính ID.

[ĐÃ SỬA]

Tôi đang sử dụng jsoup để hoàn thành nó trong Java. Điều đó làm việc cho nhu cầu của tôi.


2
Ngẫu nhiên, htmlvà các bodybộ chọn là không cần thiết vì DIV phải là hậu duệ của BODY (ngay lập tức hoặc sâu hơn) và BODY phải là con của HTML, do đó, không có yếu tố DIV nào khác trong tài liệu, //DIV[1]nên hoạt động (mặc dù tôi khá gỉ trên biểu thức XPath). Tương đương DOM là document.getElementsByTagName('div')[1](hoặc có thể 0).
RobG

Câu trả lời:


421

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

Đánh giá một chuỗi biểu thức XPath và trả về kết quả của loại đã chỉ định nếu có thể.

Nó được chuẩn hóa w3 và toàn bộ tài liệu: https://developer.mozilla.org/en-US/docs/Web/API/Document.evalu

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 trên mạng của nhà phát triển mozilla: https://developer.mozilla.org/en-US/docs/Int sinhtion_to_USE_XPath_in_JavaScript#document.evalu


Phiên bản thay thế, sử dụng XPathEvaluator:


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

5
@WillSheppard XPathResult.FIRST_ORDERED_NODE_TYPE === 9 developer.mozilla.org/en-US/docs/ từ
yckart

2
Tôi đã viết một hàm getEuityByXPath có hỗ trợ cho IE nhưng hiện tại có một số hỗ trợ xpath cơ bản. Ngoài ra còn có một hàm getEuityXpath trong đó và chúng hoạt động độc đáo với nhau cho những gì tôi cần. gist.github.com/Joopmicroop/10471650
joopmicroop

@CiroSantilli Vâng thưa ông, đó là: w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator-evalu
yckart

var xpathResult = document.evalu (xpathExpression, contextNode, namepaceResolver, resultType, result);
TechDog

166

Trong Chrome Dev Tools, bạn có thể chạy như sau:

$x("some xpath")

1
Tôi đã chơi xung quanh với điều này và nó dường như 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

Điều này cần phải được cao hơn lên. Firefox cũng hỗ trợ nó.
iSWORD

Điều này rất hữu ích khi bạn đang gỡ lỗi trang web của bạn. Cảm ơn.
theeranitp


21

Đối với một cái gì đó như $ x từ api dòng lệnh chrome (để chọn nhiều phần tử), hãy 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 về MDN này đã giúp: https://developer.mozilla.org/en-US/docs/Int sinhtion_to_USE_XPath_in_JavaScript


9

Bạn có thể sử dụng tài liệu của javascript.evalu để chạy biểu thức XPath trên DOM. Tôi nghĩ rằng nó được hỗ trợ theo 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/evalu

IE hỗ trợ selectNodes thay thế.

MSDN: https://msdn.microsoft.com/en-us/l Library / ms754523 (v = vs85) .aspx


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

2

Giả sử mục tiêu của bạn là phát triển và kiểm tra các truy vấn xpath của bạn cho bản đồ màn hình. Sau đó, sử dụng các công cụ dành cho nhà phát triển của Chrome . Điều này cho phép bạn chạy truy vấn xpath để hiển thị các kết quả khớp. Hoặc trong Firefox> 9, bạn có thể làm điều tương tự với bảng điều khiển Công cụ dành cho nhà phát triển web . Trong phiên bản trước, sử dụng x-path-finder hoặc Fireorms .


2
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");
    }
}

Hãy chắc chắn rằng bạn đang sử dụng đúng công cụ định vị cho nó.


1
Xin chào Prerit, câu hỏi là chọn một yếu tố dựa trên xpath của nó. Giải pháp bạn đã cung cấp là chọn nó theo id. :)
Gaurav Thantry

2
**Different way to Find Element:**

IEDriver.findElement(By.id("id"));
IEDriver.findElement(By.linkText("linkText"));
IEDriver.findElement(By.xpath("xpath"));

IEDriver.findElement(By.xpath(".//*[@id='id']"));
IEDriver.findElement(By.xpath("//button[contains(.,'button name')]"));
IEDriver.findElement(By.xpath("//a[contains(.,'text name')]"));
IEDriver.findElement(By.xpath("//label[contains(.,'label name')]"));

IEDriver.findElement(By.xpath("//*[contains(text(), 'your text')]");

Check Case Sensitive:
IEDriver.findElement(By.xpath("//*[contains(lower-case(text()),'your text')]");

For exact match: 
IEDriver.findElement(By.xpath("//button[text()='your text']");

**Find NG-Element:**

Xpath == //td[contains(@ng-show,'childsegment.AddLocation')]
CssSelector == .sprite.icon-cancel

0
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

System.setProperty("webdriver.chrome.driver", "path of your chrome exe");
        WebDriver driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.get("https://www.google.com");

            driver.findElement(By.xpath(".//*[@id='UserName']")).clear();
            driver.findElement(By.xpath(".//*[@id='UserName']")).sendKeys(Email);

thêm một câu trả lời mô tả. mô tả của bạn sẽ giúp người hỏi hiểu được giải pháp của bạn một cách nhanh chóng.
NickCoder

0

Để hướng đến điểm, bạn có thể dễ dàng sử dụng xapth. Cách chính xác và đơn giản để thực hiện việc này bằng mã dưới đây. Vui lòng thử và cung cấp thông tin phản hồi. Cảm ơn bạn.

JavascriptExecutor js = (JavascriptExecutor) driver;

    //To click an element 
    WebElement element=driver.findElement(By.xpath(Xpath));
    js.executeScript(("arguments[0].click();", element);

    //To gettext

    String theTextIWant = (String) js.executeScript("return arguments[0].value;",driver.findElement(By.xpath("//input[@id='display-name']")));

Bài đọc thêm - https://medium.com/@smeesheady/webdo-javascriptexecutor-interact-with-elements-and-open-and-handle-multipl-tabs-and-get-url-dcfda49bfa0f


Tôi tin rằng OP đã không yêu cầu một giải pháp Selen như của bạn, đúng không?
ankostis
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.