xpath - सेलेनियम के उपयोग के लिए ExtJS वाले पृष्ठों के तत्वों के लिए अद्वितीय चयनकर्ता कैसे खोजते हैं?




selenium webdriver selenium-webdriver (4)

मैं फ़ायरफ़ॉक्स वेबड्रिवर के साथ सेलेनियम का उपयोग कर रहा हूं ताकि एक पृष्ठ पर तत्वों के साथ काम किया जा सके जिस पर अद्वितीय सीएसएस आईडी (प्रत्येक पेज लोड पर) हों, लेकिन आईडी हर बार बदलती रहती हैं, इसलिए मैं तत्व का पता लगाने में उनका उपयोग करने में असमर्थ हूं। इसका कारण यह है कि पेज एक एक्स्टजेएस के साथ बनाया गया वेब अनुप्रयोग है

मैं तत्व जानकारी प्राप्त करने के लिए Firebug का उपयोग करने की कोशिश कर रहा हूं

मुझे एक अनोखा एक्सपेथ या चयनकर्ता खोजने की जरूरत है इसलिए मैं प्रत्येक तत्व सेलेनियम के साथ व्यक्तिगत रूप से चयन कर सकता हूं।

जब मैं एक्सपाथ की प्रतिलिपि करने के लिए फ़ायरबग का उपयोग करता हूं, तो मुझे इस तरह से मूल्य मिलता है:

//*[@id="ext-gen1302"]

हालांकि, अगली बार पेज लोड हो रहा है ऐसा लगता है:

//*[@id="ext-gen1595"]

उस पृष्ठ पर प्रत्येक तत्व का यह आईडी प्रारूप होता है, इसलिए तत्व को खोजने के लिए सीएसएस आईडी का उपयोग नहीं किया जा सकता।

मैं एक्सपाथ जो डीओएम में अपनी स्थिति के संदर्भ में प्राप्त करना चाहता हूं, लेकिन फायरबग केवल आईडी एक्सपैथ वापस करेगा क्योंकि यह पृष्ठ के उस उदाहरण के लिए अद्वितीय है।

/html/body/div[4]/div[3]/div[4]/div/div/div/span[2]/span

मुझे एक अनूठा चयनकर्ता देने के लिए फ़ायरबॉग (या ऐसा कोई दूसरा उपकरण जो समान गति से काम करेगा) कैसे प्राप्त कर सकता है, जो कि extengen ID परिवर्तन के बाद भी सेलेनियम के साथ तत्व को खोजने के लिए इस्तेमाल किया जा सकता है?


Answers

एक्स्टजएस यूआई स्वचालन परीक्षण का एक और शिकार, यहां विशेष रूप से एक्स्टजेएस परीक्षण के लिए मेरे सुझाव दिए गए हैं I (हालांकि, यह आपके शीर्षक में वर्णित प्रश्न का उत्तर नहीं देगा)

टिप 1: कभी भी अपठनीय XPath जैसे /div[4]/div[3]/div[4]/div/div/div/span[2]/span । स्रोत कोड का एक छोटा परिवर्तन DOM संरचना परिवर्तन के कारण हो सकता है। इसके विशाल रखरखाव लागत का कारण होगा

टिप 2: सार्थक ऑटो जनरेट किए गए आंशिक आईडी और कक्षा नामों का लाभ उठाएं।

उदाहरण के लिए, यह ExtJS ग्रिड उदाहरण: By.cssSelector(".x-grid-view .x-grid-table") आसान होगा। यदि ग्रिड के कई By.cssSelector("#something-meaningful .x-grid-view .x-grid-table") , तो इनके सूचकांक की कोशिश करें या पहचानने योग्य पूर्वज का पता लगाएं, जैसे कि By.cssSelector("#something-meaningful .x-grid-view .x-grid-table")

टिप 3: सोर्स कोड में सार्थक वर्ग नाम बनाएं। tdCls कस्टम क्लास नामों के लिए tdCls और tdCls प्रदान करता है, ताकि आप अपने स्रोत कोड में cls:'testing-btn-cancel' tdCls जोड़ सकते हैं, और इसे By.cssSelector(".testing-btn-cancel")

टिप 3 सबसे अच्छा और अंतिम एक है यदि आपके पास स्रोत कोड तक पहुंच नहीं है, तो अपने प्रबंधक से बात करें, सेलेनियम यूआई स्वचालन वास्तव में किसी ऐसे व्यक्ति के लिए डेवलपर का काम होना चाहिए, जो एंड-यूज़र-जैसे परीक्षक के बजाय स्रोत कोड को संशोधित कर सकता है।


मैं इस उदाहरण में सीएसएस का उपयोग करके By.cssSelector("span[id^='ext-gen'])

उपर्युक्त बयान का अर्थ है "किसी ऐसे एन्डी के साथ एक स्पैन एलिमेंट चुनें जिसे ext-gen से शुरू होता है" (यदि इसे और अधिक विशिष्ट होना चाहिए, तो आप उत्तर दे सकते हैं, और मैं देखूंगा कि मैं आपकी सहायता कर सकता हूं)।

वैकल्पिक रूप से, यदि आप XPath का उपयोग करना चाहते हैं, तो इस उत्तर को देखें: एक्सपैथ को यादृच्छिक संख्या सहित html आईडी चुनने के लिए


यद्यपि यह कुछ मामलों में वांछित नहीं है जैसा ऊपर उल्लेखित है, आप तत्वों को पार्स कर सकते हैं और एक्सपेथ आईडी उत्पन्न कर सकते हैं।

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class XPATHDriverWrapper {
Map xpathIDToWebElementMap = new LinkedHashMap();
Map webElementToXPATHIDMap = new LinkedHashMap();
public XPATHDriverWrapper(WebDriver driver){
    WebElement htmlElement = driver.findElement(By.xpath("/html"));
    iterateThroughChildren(htmlElement, "/html");
}

private void iterateThroughChildren(WebElement parentElement, String parentXPATH) {
    Map siblingCountMap = new LinkedHashMap();

    List childrenElements = parentElement.findElements(By.xpath(parentXPATH+"/*"));
    for(int i=0;i<childrenElements.size(); i++) {
        WebElement childElement = childrenElements.get(i);
        String childTag = childElement.getTagName();
        String childXPATH = constructXPATH(parentXPATH, siblingCountMap, childTag);
        xpathIDToWebElementMap.put(childXPATH, childElement);
        webElementToXPATHIDMap.put(childElement, childXPATH);
        iterateThroughChildren(childElement, childXPATH);
//          System.out.println("childXPATH:"+childXPATH);
    }
}

public WebElement findWebElementFromXPATHID(String xpathID) {
    return xpathIDToWebElementMap.get(xpathID);
}

public String findXPATHIDFromWebElement(WebElement webElement) {
    return webElementToXPATHIDMap.get(webElement);
}

private String constructXPATH(String parentXPATH,
        Map siblingCountMap, String childTag) {
    Integer count = siblingCountMap.get(childTag);
    if(count == null) {
        count = 1;
    } else {
        count = count + 1;
    }
    siblingCountMap.put(childTag, count);
    String childXPATH = parentXPATH + "/" + childTag + "[" + count + "]";
    return childXPATH;
}
}

दस्तावेज़ से आईडी बनाने के लिए एक और आवरण पोस्ट किया जाता है: http://scottizu.wordpress.com/2014/05/12/generating-unique-ids-for-webelements-via-xpath/


आप जावास्क्रिप्ट के w3-standardized का उपयोग कर सकते हैं। डीओएम पर एक XPath अभिव्यक्ति चलाने के लिए मूल्यांकन करें। मुझे लगता है कि यह ब्राउज़र में आईई 6 पर वापस एक या दूसरे तरीके से समर्थित है।

एमडीएन: https://developer.mozilla.org/en-US/docs/Web/API/Document/evaluate

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

एमएसडीएन: selectNodes