2017-07-26 141 views
1

这是我第一次从事硒工作,也没有深入了解网络技术方面的经验。(StaleElementException:Selenium)我该如何处理?

解决方法是,当我尝试访问DOM上的特定对象时,我一直面临StaleElementException。

以下方法处理所有任务:

private void extract(WebDriver driver) { 
    try { 

     List<WebElement> rows = driver.findElements(By.xpath("//*[@id='gvSearchResults']/tbody/tr")); 

     for (WebElement row : rows) { 
      WebElement columns = row.findElement(By.xpath("./td[1]/a")); 

      if (assertAndVerifyElement(By.xpath("//*[@id='gvSearchResults']/tbody/tr/td[1]/a"))) { 
       columns.click(); 
      } 

      List<WebElement> elements = driver 
        .findElements(By.xpath("//*[@id='ctl00_MainContent_pnlDetailsInd']/table/tbody/tr")); 

      for (WebElement element : elements) { 
       WebElement values = element.findElement(By.xpath("./td[1]")); 
       System.out.print(values.getText() + " "); 
       WebElement values2 = element.findElement(By.xpath("./td[2]")); 
       System.out.println(values2.getText()); 
      } 
      if(assertAndVerifyElement(By.xpath("//*[@id='ctl00_MainContent_btnBack']"))) 
       driver.findElement(By.xpath("//*[@id='ctl00_MainContent_btnBack']")).click(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

断言逻辑放在这里:

public boolean assertAndVerifyElement(By element) throws InterruptedException { 
    boolean isPresent = false; 

    for (int i = 0; i < 5; i++) { 
     try { 
      if (driver.findElement(element) != null) { 
       isPresent = true; 
       break; 
      } 
     } catch (Exception e) { 
      // System.out.println(e.getLocalizedMessage()); 
      Thread.sleep(1000); 
     } 
    } 
    Assert.assertTrue("\"" + element + "\" is not present.", isPresent); 
    return isPresent; 
} 

我已经试过几个解决方案,要求我用等到预期的条件,但没有一次成功。

此外,如果您指出我可能在上述示例中使用的任何不良设计实践,将不胜感激。

+0

在这行你也看到了'StaleElementException'? – DebanjanB

+0

找出发生了哪个元素'StaleElementException',并使用'WebDriverWait'和'ExpectedConditions'等待该元素。 – sen4ik

回答

0

我可以给你想法,以克服陈旧。

一般我们会得到陈旧但如果该元素的属性或东西正在启动webelement后改变。例如,在某些情况下,如果用户尝试单击同一页面上的同一元素,但在页面刷新后,则会得到staleelement异常。

为了克服这一点,我们可以当页面被更改或刷新的情况下,创造了新鲜webelement。下面的代码可以给你一些想法。

例子:

webElement element = driver.findElement(by.xpath("//*[@id='StackOverflow']")); 
element.click(); 
//page is refreshed 
element.click();//This will obviously throw stale exception 

为了克服这一点,我们可以在XPath的存储一些字符串和使用,因为我们去它营造出清新webelement。

String xpath = "//*[@id='StackOverflow']"; 
driver.findElement(by.xpath(xpath)).click(); 
//page has been refreshed. Now create a new element and work on it 
driver.findElement(by.xpath(xpath)).click(); //This works 

又如:

for(int i = 0; i<5; i++) 
{ 
    String value = driver.findElement(by.xpath("//.....["+i+"]")).getText); 
    System.out.println(value); 
} 

希望这有助于你。谢谢

0

当有问题的webelement在dom上发生更改并且对该webelement的初始引用丢失时,会发生StaleElementException。

您可以搜索webelement再次

试试这个

try: 
element = self.find_element_by_class('') 
element.click() 
except StaleElementReferenceException: 
element = self.find_element_by_class('') 
element.click()