2013-08-14 12 views
29

से जुड़ा हुआ नहीं है मेरी सूची है जिसमें प्रत्येक अनुभाग के अंतर्गत एकाधिक लिंक हैं। प्रत्येक अनुभाग में एक ही लिंक होते हैं जिन्हें मुझे प्रत्येक अनुभाग के तहत एक विशेष लिंक पर क्लिक करने की आवश्यकता होती है। मैंने नीचे कोड लिखा है लेकिन जब इसे निष्पादित करता है तो यह मुझे stale element reference: element is not attached to the page document त्रुटि देता है।पुरानी तत्व संदर्भ: तत्व पृष्ठ दस्तावेज़

यह मेरा कोड है:

public static void main(String[] args) throws InterruptedException 
{ 
    WebDriver driver = new ChromeDriver(); 
    driver.navigate().to("url......"); 
     driver.findElement(By.id("Login1_txtEmailID")).sendKeys("[email protected]"); 
    driver.findElement(By.id("Login1_txtPassword")).sendKeys("Testing1*"); 
    driver.findElement(By.id("Login1_btnLogin")).click(); 
    List<WebElement> LeftNavLinks=driver.findElements(By.xpath("//*[@id='sliding-navigation']//a")); 
    Thread.sleep(1000); 
    String ben="Benefit Status"; 
    String[] linkTexts = new String[LeftNavLinks.size()]; 
    int i = 0; 
    for (WebElement e : LeftNavLinks) 
    { 
     linkTexts[i] = e.getText(); 
     System.out.print(i+" " + linkTexts[i]+"\n"); 
     if(linkTexts[i].equals(ben)) 
     { 
      String BenefitStatLi="//*[@id='sliding-navigation']/li[%s]/a"; 
      System.out.print(i+" " + linkTexts[i]+"\n"); 
       driver.findElement(By.xpath(String.format(BenefitStatLi,i))).click(); 
      driver.findElement(By.xpath("//* [@id='divContentHolder']/div[1]/a[1]")).click(); 
     } 
     i++; 
    } 
} 

} 

इस HTML संरचना है

<div id="ucAdminMenu_divMenu"> 
    <ul id="sliding-navigation"> 
    <li class="sliding-element"> 
     <a href=" ">Claims Status</a> 
    </li> 
    <li class="sliding-element"> 
     <a href=" ">Eligibility Status</a> 
    </li> 
    <li class="sliding-element"> 
     <h3>Section-1</h3> 
    </li> 
    <li class="sliding-element"> 
     <a href=" ">Forms and Documents</a> 
    </li> 
    <li class="sliding-element"> 
     <a href=" HourBank.aspx?id=002">Hour Bank</a> 
    </li> 
    <li class="sliding-element"> 
     <h3>Section-2</h3> 
    </li> 
    <li class="sliding-element"> 
     <a href=" ">Benefit Status</a> 
    </li> 
    <li class="sliding-element"> 
     <a href=" ">Forms and Documents</a> 
    </li> 
    <li class="sliding-element"> 
     <h3>Section-3</h3> 
    </li> 
    <li class="sliding-element"> 
     <a href=" ">Forms and Documents</a> 
    </li> 
    <li class="sliding-element"> 
     <h3>Testing Fund</h3> 
    </li> 
    <li class="sliding-element"> 
     <a href=" ">Benefit Status</a> 
    </li> 
    <li class="sliding-element"> 
     <a href=" ">Order ID Card</a> 
    </li> 
    </ul> 
</div> 

नीचे के रूप में है त्रुटि ट्रेस है:

Exception in thread "main" 
org.openqa.selenium.StaleElementReferenceException: stale element 
reference: element is not attached to the page document 

उत्तर

31

क्या लाइन जो अपवाद देता है ??

इसका कारण तत्व के लिए जो आप के लिए भेजा है IEDriver के साथ काम करते DOM संरचना

मैं एक ही समस्या का सामना करना पड़ रहा था से निकाल दिया जाता है। इसका कारण यह था कि जब मैंने संदर्भित किया है तो जावास्क्रिप्ट ने तत्व को एक और बार लोड किया है, इसलिए मेरा दिनांक संदर्भ एक अप्रत्याशित वस्तु की ओर इशारा करता है, भले ही यह यूआई पर सही हो। मैंने निम्नलिखित कार्यवाही का उपयोग किया।

try { 
    WebElement date = driver.findElement(By.linkText(Utility.getSheetData(path, 7, 1, 2))); 
    date.click(); 
} 
catch(org.openqa.selenium.StaleElementReferenceException ex) 
{ 
    WebElement date = driver.findElement(By.linkText(Utility.getSheetData(path, 7, 1, 2))); 
    date.click(); 
} 

देखें कि क्या यह आपकी मदद कर सकता है! इस कोड को

+0

लिंकटेक्स [i] = e.getText(); लाइनें मुझे दूसरी बार लूपिंग करते समय त्रुटि देती हैं –

+0

त्रुटि को हल किया गया पृष्ठ पृष्ठ रीफ्रेश के कारण था। सबसे पहले मैंने सभी लिंक ग्रंथों को एक स्ट्रिंग सरणी चर में कॉपी किया और बाद में प्रत्येक अनुभाग के तहत आवश्यक लिंक पर क्लिक करने के लिए लूप के लिए उपयोग किया। के लिए (WebElement e: LeftNavLinks) \t \t {\t \t लिंकटेक्स [i] = e।gettext(); \t \t i ++; } के लिए (इंट जे = 0; j

+0

तो यह वही कारण था। पृष्ठ को ताज़ा करने के कारण पहले पहचान किए गए तत्वों को डीओएम से हटा दिया गया था :) –

3

उपयोग:

public class LinkTest 
{ 
    public static void main(String[] args) 
    { 
     WebDriver driver = new FirefoxDriver(); 
     driver.navigate().to("file:///C:/Users/vkiran/Desktop/xyz.html"); 
     List<WebElement> alllinks =driver.findElements(By.xpath("//*[@id='sliding-navigation']//a")); 
     String a[]=new String[alllinks.size()]; 
     for(int i=0;i<alllinks.size();i++) 
     { 
      a[i]=alllinks.get(i).getText(); 
      if(a[i].startsWith("B")) 
      { 
       System.out.println("clicking on this link::"+driver.findElement(By.linkText(a[i])).getText()); 
       driver.findElement(By.linkText(a[i])).click(); 

      } 
      else 
      { 
       System.out.println("does not starts with B so not clicking"); 
      } 
     } 
} 
} 
5

उपयोग इस कोड को प्रतीक्षा करने के लिए जब तक तत्व जुड़ा हुआ है:

boolean breakIt = true; 
     while (true) { 
     breakIt = true; 
     try { 
      // write your code here 
     } catch (Exception e) { 
      if (e.getMessage().contains("element is not attached")) { 
       breakIt = false; 
      } 
     } 
     if (breakIt) { 
      break; 
     } 

    } 
+1

मेरे लिए काम नहीं किया है लेकिन अभी भी एक दिलचस्प दृष्टिकोण – Yar

+9

यह अब तक कोई समझ नहीं आता है। – Sam

+0

यह समझ में आता है, यह अपने परिवर्तनीय नाम "ब्रेकआईट" के संदर्भ में सबसे स्पष्ट नहीं है। जैसे ही "तत्व संलग्न नहीं होता है" जैसे ही (सत्य) लूप से बाहर निकलता है त्रुटि अब फेंक नहीं दी जाती है। – emery

2

यहाँ बात यह है कि आप अपने सशर्त बयान के बाहर पाश के लिए एक का उपयोग कर रहे है ।

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

आप अपने कथन के अंत में ब्रेक जोड़ सकते हैं, यह मेरे लिए काम करता है।

1

जब आप उस तत्व को ढूंढते हैं जिसे आप उस पर क्लिक करना चाहते हैं तो बस लूप को तोड़ दें। उदाहरण के लिए :

List<WebElement> buttons = getButtonElements(); 
    for (WebElement b : buttons) { 
     if (b.getText().equals("Next"){ 
      b.click(); 
      break; 
     } 
3

इसे संभाल करने के लिए, मैं निम्नलिखित क्लिक विधि का उपयोग करें। यह तत्व को खोजने और क्लिक करने का प्रयास करेगा। यदि खोज और क्लिक के बीच डोम बदल जाता है, तो यह फिर से प्रयास करेगा। विचार यह है कि अगर यह असफल रहा और मैं तुरंत पुनः प्रयास करता हूं तो दूसरा प्रयास सफल होगा। यदि डोम परिवर्तन बहुत तेज़ हैं तो यह काम नहीं करेगा।

public boolean retryingFindClick(By by) { 
    boolean result = false; 
    int attempts = 0; 
    while(attempts < 2) { 
     try { 
      driver.findElement(by).click(); 
      result = true; 
      break; 
     } catch(StaleElementException e) { 
     } 
     attempts++; 
    } 
    return result; 
} 
संबंधित मुद्दे