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.
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>
Dans ChromeDev Tools, vous pouvez exécuter les tâches suivantes:
$x("some xpath")
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
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
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 .
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.
**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