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.