2016-07-19 1 views
0

나는 부패한 요소에 대해 읽었으며 여전히 혼란 스럽다. 예를 들어, 다음과 같은 작동하지 않습니다, 맞습니까?진부한 부패 된 요소

public void clickFoo(WebElement ele) { 
    try { 
     ele.click(); 
    } catch (StaleElementReferenceException ex) { 
     ele.click(); 
    } 
} 

ele가 부실한 경우 부실로 남아 있기 때문입니다. 가장 좋은 방법은 driver.findElement (By)를 다시 실행하는 것입니다.하지만이 예제에서 볼 수 있듯이 xpath는 없습니다. ele.getAttribute ("id")를 시도해보고 사용할 수는 있지만 요소에 ID가없는 경우에도 작동하지 않습니다. 이 메서드를 호출하는 모든 메서드는 try/catch를 둘 필요가 있습니다. 이는 실행 가능하지 않을 수 있습니다.

요소가 재생 될 수있는 다른 방법이 있습니까? 또한, id가 있다고 가정하면, id는 요소가 부실화 된 후에도 동일하게 유지됩니까? WebElement 객체 ele의 내용이 부실되면 어떻게됩니까?

(자바 이클립스)

답변

1

난 당신이 위 같은 방법을 생성하지 않는 것이 좋습니다 것입니다. .click() 위에 다른 기능 레이어를 추가 할 필요가 없습니다. 요소 자체에 .click()으로 전화하면됩니다. 나는 오래된 요소를 방지하기 위해 정기적으로 사용

driver.findElement(By.id("test-id")).click(); 

또는

WebElement e = driver.findElement(By.id("test-id")); 
e.click(); 

한 가지 방법은 당신이 그것을 필요로 일반적으로 내가 페이지 객체 메소드에서이 작업을하여 할 경우에만 요소를 찾을 수 있습니다. 여기에 간단한 예가 있습니다.

홈페이지 페이지 개체입니다.

public class HomePage 
{ 
    private WebDriver driver; 
    public WebElement staleElement; 
    private By waitForLocator = By.id("sampleId"); 

    // please put the variable declarations in alphabetical order 
    private By sampleElementLocator = By.id("sampleId"); 

    public HomePage(WebDriver driver) 
    { 
     this.driver = driver; 
     // wait for page to finish loading 
     new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(waitForLocator)); 

     // see if we're on the right page 
     if (!driver.getCurrentUrl().contains("samplePage.jsp")) 
     { 
      throw new IllegalStateException("This is not the XXXX Sample page. Current URL: " + driver.getCurrentUrl()); 
     } 
    } 

    public void clickSampleElement() 
    { 
     // sample method code goes here 
     driver.findElement(sampleElementLocator).click(); 
    } 
} 

WebDriver driver = new FirefoxDriver(); 
driver.manage().window().maximize(); 
driver.get("http://www.example.com"); 
HomePage homePage = new HomePage(driver); 
homePage.clickSampleElement(); 
// do stuff that changes the page and makes the element stale 
homePage.clickSampleElement(); 

지금은 더 이상 기존 참조에 의존 할 필요가 없습니다 사용합니다. 방금 그 방법을 다시 부르면 나에게 모든 일이 돌아 간다.

페이지 개체 모델에는 많은 참조가 있습니다. Selenium 위키에서 가져온 것입니다. http://www.seleniumhq.org/docs/06_test_design_considerations.jsp#page-object-design-pattern

부실 요소에 대한 자세한 정보를 보려면 문서에 대한 설명이 필요합니다. http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp

+0

감사합니다. 나는 그것을 이해합니다. 일부 메소드가 xpath가 아닌 요소를 취하는 것입니다. 그리고 일부 메소드는 페이지 객체 @FindBy()를 사용합니다. 이것은 당신이 말한 것과 유사합니다. 하지만 일부 요소는 런타임까지 알려지지 않았습니다 (예를 들어 특정 사무실의 div를 찾아서 div.findBy를 사용해야하는 경우 ... 요소에 대한 xpath를 더 일찍 알기 위해 계획을 세워야한다고 생각합니다 (또는 id 또는 무엇이든) – Tony

+0

요소를 취하는 메서드의 경우 로케이터를 사용하여 요소를 찾은 다음 메서드에 전달할 수 있습니다. 특정 사무실의 요소를 찾아야하는 시나리오가있는 경우, – JeffC

+0

어쨌든 ...이 답변이 도움이된다면, 그것을 upvote하십시오. 귀하의 질문에 대답했다면, 답변으로 받아들이십시오. [this ] (// stackoverflow.com/help/someone-answers) 어떻게 upvote하고 대답을 받아들이는지에 대한 더 많은 정보를 얻으려면 – JeffC