Java에서 오래된 요소 참조 예외를 처리하는 방법

2279 단어 pythonjavatesting

Background:
What is StaleElementReferenceException? Stale means old, decayed, no longer fresh. Stale Element means an old element or no longer available element. Assume there is an element that is found on a web page referenced as a WebElement in WebDriver. If the DOM changes then the WebElement goes stale. If we try to interact with an element which is staled then the StaleElementReferenceException is thrown.



Selenium은 findElement/findElements가 사용될 때 참조 형식으로 모든 요소를 ​​추적합니다. 그리고 요소를 재사용하는 동안 셀레늄은 DOM에서 요소를 다시 찾는 대신 해당 참조를 사용합니다. 그러나 때때로 AJAX 요청 및 응답으로 인해 이 참조가 더 이상 최신이 아니므로 StaleElementReferenceException이 발생합니다.

이 문제를 해결하는 방법을 알아보겠습니다. 인터넷에서 많은 사람들이 Lazy Initializer 또는 Page Object Model을 사용하여 Stale Element Exceptions를 최소화할 것을 제안한다는 것을 알고 있습니다. 그러나 이 방법은 완전한 증거이며 모든 프레임워크에서 작동할 수 있습니다.

Solution:



public void clickElement(WebElement element)
{
    try
    {
        element.click();
    }catch(StaleElementReferenceException stale)
    {
        System.out.println("Element is stale. Clicking again");
        element = reInitializeStaleElement(element);
        element.click(); 
    }
}



//method to re-initialize the stale element
public WebElement reInitializeStaleElement(WebElement element)
{
    //lets convert element to string, so we can get it's locator
    String elementStr = element.toString();
    elementStr=elementStr.split("->")[1];

    String byType = elementStr.split(":")[0].trim();
    String locator = elementStr.split(":")[1].trim();
    locator=locator.substring(0,locator.length()-1);   


    switch(byType)
    {
        case "xpath":
            return DRIVER.findElement(By.xpath(locator));
        case "css":
            return DRIVER.findElement(By.cssSelector(locator));
        case "id":
            return DRIVER.findElement(By.id(locator));
        case "name":
            return DRIVER.findElement(By.name(locator));
    }
}



위의 코드는 참고용이므로 프로젝트에 맹목적으로 복사하지 마십시오.

이 방법에서 드라이버 인스턴스를 사용하는 방법을 알만큼 똑똑해야 합니다. 클릭 방법을 위한 Singleton 클래스를 생성하거나 프레임워크 디자인 패턴에 따라 이것을 TestUtil 클래스에 넣을 수 있습니다.

좋은 웹페이지 즐겨찾기