Selenium WebDriver'da JavaScript kullanarak XPath tarafından element almanın bir yolu var mı?


252

Gibi bir şey arıyorum:

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

JS kullanarak WebHTriver kendisini bulamıyor beri Selenyum WebDriver / Java kullanmak için öğeleri kullanarak innerHTML almak gerekir, ama nasıl?

Kimlik özniteliğini kullanabilirim, ancak tüm öğelerin kimlik özniteliği yoktur.

[SABİT]

Java'da jsoup kullanıyorum. Bu benim ihtiyaçlarım için işe yarıyor.


2
Bu arada, htmlve bodyseçiciler gereksizdir çünkü bir DIV, BODY'nin (derhal veya daha derin) bir inişi olmalı ve BODY, HTML'nin bir çocuğu olmalıdır, bu nedenle belgede başka DIV öğeleri olmaması kaydıyla, //DIV[1]çalışmalıyım (güzel olduğum halde) XPath ifadelerinde paslı). DOM eşdeğeri document.getElementsByTagName('div')[1](veya belki 0).
— RobG

Yanıtlar:


423

Şunları kullanabilirsiniz document.evaluate:

XPath ifade dizesini değerlendirir ve mümkünse belirtilen türde bir sonuç döndürür.

Öyle -w3 standardize belgelenmiş ve bütün: 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

Mozilla geliştirici ağında da harika bir giriş var: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#document.evaluate


Alternatif sürüm XPathEvaluator:


11
Sihirli sayı 9 ne anlama geliyor? Burada adlandırılmış bir sabit kullanmak daha iyi olur.
— Sheppard

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

2
IE desteği var ama şimdilik bazı temel xpath desteği olan bir getElementByXPath işlevi yazdım. Orada da getElementXpath bir işlevi var ve onlar ne ihtiyacım için güzel birlikte çalışır. gist.github.com/Joopmicroop/10471650
— joopmicroop


var xpathResult = document.evaluate (xpathExpression, contextNode, namespaceResolver, resultsType, sonuç);
— TechDog

168

Chrome Geliştirme Araçları'nda aşağıdakileri çalıştırabilirsiniz:

$x("some xpath")

1
Bununla oynadım ve işe yarıyor gibi görünüyor, ancak bu özellik için herhangi bir belge var mı? Hiçbir şey bulamadım.
— Eric

Bunun daha yüksek olması gerekiyor. Firefox da bunu destekliyor.
— iSWORD

Bu, web sayfanızda hata ayıklarken çok kullanışlıdır. Teşekkürler.
— theeranitp


21

Chrome komut satırı api'sinden $ x gibi bir şey için (birden çok öğe seçmek için) şunu deneyin:

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

Bu MDN'ye genel bakış yardımcı oldu: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript


9

DOM üzerinde bir XPath ifadesi çalıştırmak için javascript'in document.evaluate komutunu kullanabilirsiniz. IE 6'ya kadar tarayıcılarda şu ya da bu şekilde desteklendiğini düşünüyorum.

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

IE bunun yerine selectNodes'u destekler .

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


7
{Document.evaluate} öğesinin IE'de çalışmadığını belirtmek isterim.
— Christopher Bales


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

Bunun için doğru konumlayıcıyı kullandığınızdan emin olun.


1
Merhaba Prerit, soru xpath değerine göre bir eleman seçmekti. Sağladığınız çözüm kimliği kullanarak seçmektir. :)
— 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);

açıklayıcı bir cevap ekleyin. açıklamanız sorgulayıcının çözümünüzü hızlı bir şekilde anlamasına yardımcı olacaktır.
— NickCoder

0

Noktaya yönlendirmek için kolayca xapth kullanabilirsiniz.Aşağıdaki kodu kullanarak bunu yapmanın kesin ve basit yolu. Nazik deneyin ve geribildirim sağlamak. Teşekkür ederim.

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']")));

Diğer okumalar - https://medium.com/@smeesheady/webdriver-javascriptexecutor-interact-with-elements-and-open-and-handle-multiple-tabs-and-get-url-dcfda49bfa0f


OP'nin sizinki gibi bir Selenyum çözümü istemediğine inanıyorum, değil mi?
— ankostis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.