क्या सेलेनियम वेबड्राइवर में जावास्क्रिप्ट का उपयोग करके XPath द्वारा तत्व प्राप्त करने का एक तरीका है?


252

मैं कुछ इस तरह की तलाश में हूँ:

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

मुझे जेएस (सेलेनियम वेबड्राइवर / जावा में इसका उपयोग करने के लिए तत्वों का आंतरिक HTML प्राप्त करने की आवश्यकता है, क्योंकि वेबड्राइवर इसे स्वयं नहीं खोज सकता है), लेकिन कैसे?

मैं आईडी विशेषता का उपयोग कर सकता हूं, लेकिन सभी तत्वों में आईडी विशेषता नहीं है।

[निर्धारित]

मैं इसे जावा में करने के लिए jsoup का उपयोग कर रहा हूं। जो मेरी जरूरतों के लिए काम करता है।


2
संयोग से, htmlऔर bodyचयनकर्ता बहुत ही कम हैं क्योंकि DIV को BODY (तत्काल या गहरा) का वंशज होना चाहिए और BODY को HTML का एक बच्चा होना चाहिए, बशर्ते दस्तावेज़ में कोई अन्य DIV तत्व न हों, //DIV[1]काम करना चाहिए (हालांकि मैं बहुत सुंदर हूं) XPath अभिव्यक्ति पर जंग)। DOM समतुल्य है document.getElementsByTagName('div')[1](या हो सकता है 0)।
रॉब

जवाबों:


422

आप उपयोग कर सकते हैं document.evaluate:

XPath अभिव्यक्ति स्ट्रिंग का मूल्यांकन करता है और यदि संभव हो तो निर्दिष्ट प्रकार का एक परिणाम देता है।

यह w3- मानकीकृत और संपूर्ण दस्तावेज है: https://developer.mozilla.org/en-US/docs/Web/API/Document.ev मूल्यांकन

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

मोज़िला डेवलपर नेटवर्क पर भी एक शानदार परिचय है: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#document.ev मूल्यांकन


वैकल्पिक संस्करण, का उपयोग कर XPathEvaluator:


11
जादू नंबर 9 का क्या मतलब है? यहां नामित नाम का उपयोग करना बेहतर होगा।
विल शेपर्ड

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

2
मैंने एक getElementByXPath फ़ंक्शन लिखा है जिसमें IE के लिए समर्थन है लेकिन अभी के लिए कुछ बुनियादी xpath समर्थन है। वहाँ भी एक समारोह getElementXpath है और वे अच्छी तरह से एक साथ काम करते हैं जो मुझे चाहिए। gist.github.com/Joopmicroop/10471650
joopmicroop

@CiroSantilli हाँ सर, यह है: w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator-ev Assess
yckart

var xpathResult = document.ev मूल्यांकन (xpathExpression, referenceNode, namespaceResolver, resultType, result);
टेकडॉग

167

Chrome देव टूल में आप निम्नलिखित चला सकते हैं:

$x("some xpath")

1
मैंने इसके साथ खेला है और यह काम करने लगता है, लेकिन क्या इस सुविधा के लिए कोई दस्तावेज है? मुझे कुछ नहीं मिला।
एरिक

इसे और ऊपर ले जाने की जरूरत है। फ़ायरफ़ॉक्स भी इसका समर्थन करता है।
iSWORD

यह बहुत उपयोगी है जब आप अपने वेब पेज को डीबग कर रहे हैं। धन्यवाद।
theeranitp

@ एरिक डॉक्यूमेंटेशन: Developers.google.com/web/tools/chrome-devtools/console/…
rybo111

21

क्रोम कमांड लाइन आपी से $ x जैसे कुछ के लिए (कई तत्वों का चयन करने के लिए) कोशिश करें:

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

इस MDN अवलोकन ने मदद की: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript


9

आप DOM पर XPath एक्सप्रेशन चलाने के लिए जावास्क्रिप्ट के डॉक्यूमेंट का उपयोग कर सकते हैं । मुझे लगता है कि यह IE 6 में वापस ब्राउज़रों में एक तरह से या दूसरे में समर्थित है।

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

IE इसके बजाय selectNodes का समर्थन करता है ।

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


7
मैं यह नोट करना चाहूंगा कि IE में काम नहीं करता {{document.ev मूल्यांकन}।
क्रिस्टोफर बाल्स

2

अपने उद्देश्य को मानते हुए स्क्रीन मैप्स के लिए अपने xpath प्रश्नों का विकास और परीक्षण करना है। फिर या तो क्रोम के डेवलपर टूल का उपयोग करें । यह आपको मैचों को दिखाने के लिए xpath क्वेरी चलाने की अनुमति देता है। या फ़ायरफ़ॉक्स> 9 में आप वेब डेवलपर टूल कंसोल के साथ एक ही काम कर सकते हैं । पहले के संस्करण में x-path-finder या Firebug का उपयोग करें


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

सुनिश्चित करें कि आप इसके लिए सही लोकेटर का उपयोग कर रहे हैं।


1
हाय प्ररित, सवाल यह था कि इसके xpath के आधार पर एक तत्व का चयन करें। आपने जो समाधान प्रदान किया है, उसे आईडी द्वारा चुनना है। :)
गौरव थान्ट्री

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

एक वर्णनात्मक उत्तर जोड़ें। आपका विवरण प्रश्नकर्ता को आपके समाधान को जल्दी समझने में मदद करेगा।
NickCoder

0

बिंदु पर निर्देशित करने के लिए, आप आसानी से xapth का उपयोग कर सकते हैं। नीचे दिए गए कोड का उपयोग करके ऐसा करने का सटीक और सरल तरीका। कृपया प्रयास करें और प्रतिक्रिया प्रदान करें। धन्यवाद।

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

इसके अलावा रीडिंग - https://medium.com/@smeesheady/webdriver-javascriptexecutor-interact-with-elements-and-open-and-handle-multiple-tabs-and-get-url-dcfda49bfa0f


मेरा मानना ​​है कि ओपी ने आपकी तरह सेलेनियम समाधान के लिए नहीं पूछा, सही?
एकॉस्टिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.