web-dev-qa-db-fra.com

Existe-t-il un moyen d’obtenir élément par XPath en utilisant JavaScript dans Selenium WebDriver?

Je cherche quelque chose comme:

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

Je dois obtenir le innerHTML des éléments en utilisant JS (pour l'utiliser dans Selenium WebDriver/Java, car WebDriver ne le trouve pas lui-même), mais comment?

Je pourrais utiliser l'attribut ID, mais tous les éléments n'ont pas d'attribut ID.

[FIXED]

J'utilise jsoup pour le faire en Java. Cela fonctionne pour mes besoins.

202
pMan

Vous pouvez utiliser document.evaluate:

Evalue une chaîne d'expression XPath et renvoie si possible un résultat du type spécifié.

C'est standardisé par w et tout le 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

Il existe également une excellente introduction sur le réseau de développeurs mozilla: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#document.evaluate


Version alternative, en utilisant XPathEvaluator:

function getElementByXPath(xpath) {
  return new XPathEvaluator()
    .createExpression(xpath)
    .evaluate(document, XPathResult.FIRST_ORDERED_NODE_TYPE)
    .singleNodeValue
}

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

Dans ChromeDev Tools, vous pouvez exécuter les tâches suivantes:

$x("some xpath")
132
Dmitry Semenyuk

Pour quelque chose comme $ x from chrome api de ligne de commande (pour sélectionner plusieurs éléments), essayez:

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

Cette présentation de MDN a aidé: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript

16
Jay

Vous pouvez utiliser document.evaluate de javascript pour exécuter une expression XPath sur le DOM. Je pense que cela est supporté d'une manière ou d'une autre dans les navigateurs, de nouveau à IE 6.

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

IE prend en charge selectNodes .

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

9
RobG

En supposant que votre objectif est de développer et de tester vos requêtes xpath pour les cartes d’écran. Ensuite, utilisez outils de développement de Chrome . Cela vous permet d'exécuter la requête xpath pour afficher les correspondances. Ou dans Firefox> 9, vous pouvez faire la même chose avec le console Web Developer Tools . Dans les versions antérieures, utilisez x-path-Finder ou Firebug .

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

Assurez-vous que vous utilisez le bon localisateur.

1
Prerit Jain
**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
Alok Patel