2012-09-14 3 views
2

이 날 미치게하고 나는 By.Id or By.Xpath를 사용하여 시도 없지만 아무도 내 Select MethodSystem.NotImplementedException는 : 요소가 더 이상 유효하지 -Selenium Webdriver

// 테스트 코드

드롭 다운리스트

에서 텍스트를 선택하려고 여기에 작업을하지 않기
SelectMyText(By.XPath("//*[@id='ctl00_ContentPlaceHolder1_ddlCategory']"), "Employee"); 

// 방법 : 여기

 public void SelectMyText(By locator, string valueToBeSelected) 
    { 
     var options = GetElementId(locator).FindElements(By.TagName("option")); 
     foreach (var option in options) 
     { 
      if (valueToBeSelected == option.Text) 
      { 
       option.Click(); 
       return; 
      } 
     } 
    } 

    public IWebElement GetElementId(By locator) 
    { 
     return Driver.FindElement(locator); 
    } 

오류가 점점 :

threw exception: 
System.NotImplementedException: Element is no longer valid 
    at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse) 
    at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters) 
    at OpenQA.Selenium.Remote.RemoteWebDriver.InternalExecute(String driverCommandToExecute, Dictionary`2 parameters) 
    at OpenQA.Selenium.Remote.RemoteWebElement.Execute(String commandToExecute, Dictionary`2 parameters) 
    at OpenQA.Selenium.Remote.RemoteWebElement.get_Text() 

다음은이 오류의 스크린 샷입니다 :

enter image description here enter image description here

+3

브라우저가 DOM을 재구성했기 때문일 수 있습니다. try catch에 해당 코드를 래핑하고 실패 할 경우 코드를 다시 호출하십시오. 두 번째로 작동한다면 아마 그럴 것이고, 마침내 포기하기 전에 합리적인 횟수를 다시 시도하는 테스트에 '안정화 코드'를 만들어야 할 것입니다. 가장 좋은 방법은 – lefthandedgoat

답변

2

글쎄, 당신의 질문은 드롭 다운 메뉴에서 옵션을 선택 할 수 있습니다 방법 질문의 범주에서입니다. 나는 보통이 방법 사용 접근 방식을 1 (행동 빌더, 고급 사용자 작업 API를 사용하여) :

WebElement mnuElement; 
WebElement submnuElement; 
mnEle = driver.findElement(By.Id("mnEle")).click(); 
sbEle = driver.findElement(By.Id("sbEle")).click(); 

Actions builder = new Actions(driver); 
// Move cursor to the Main Menu Element 
builder.MoveToElement(mnEle).perform(); 
// Giving 5 Secs for submenu to be displayed 
Thread.sleep(5000L); 
// Clicking on the Hidden SubMenu 
driver.findElement(By.Id("sbEle")).click() 

을; 일부 추가 정보는 (직접 JS를 사용하여) here

두 번째 방법을 얻을 수 있습니다 :이 당신을 위해 작동

String cssSelector =..blablabla... 
JavascriptExecutor js = (JavascriptExecutor) driver; 
     StringBuilder stringBuilder = new StringBuilder(); 
     stringBuilder.append("var x = $(\'"+cssSelector+"\');"); 
     stringBuilder.append("x.click();"); 
     js.executeScript(stringBuilder.toString()); 

희망)

+0

입니까? 그리고 더 믿을만한가? –

+0

두 번째 것 (js 사용). 항상 나를 위해 일합니다. –

+0

당신의 솔루션을 보니 결국 selectedText를 .js 코드로 전달하는 방법을 찾지 못했습니까? 조금 더 자세히 설명해 주실 수 있습니까? –

2

아이디어는 매우 간단합니다. -getText -clickontheelement -getelementproperty

public void clickOnTheElement(String cssLocator){ 
JavascriptExecutor js = (JavascriptExecutor) driver; 
     StringBuilder stringBuilder = new StringBuilder(); 
     stringBuilder.append("var x = $(\'"+cssLocator+"\');"); 
     stringBuilder.append("x.click();"); 
     js.executeScript(stringBuilder.toString()); 

} 

public String getTextOfTheElement(String cssLocator) 
{ JavascriptExecutor js = (JavascriptExecutor) driver; 
     StringBuilder stringBuilder = new StringBuilder(); 

stringBuilder.append("var x = $(\""+cssLocator+"\");"); 
     stringBuilder.append("return x.text().toString();")  ; 


     String res= (String) js.executeScript(stringBuilder.toString()); 
     return res; 
} 

//getElementProperty e.g. color 

public String jsGetColor(String css){ 

     JavascriptExecutor js = (JavascriptExecutor) driver; 
     StringBuilder stringBuilder = new StringBuilder(); 
     stringBuilder.append("var x=$(\'"+css+"\');"); 
     stringBuilder.append("return x.css('color')"); 
     String res= (String) js.executeScript(stringBuilder.toString()); 
     return res; 

    } 

//SO the only thing remains: you have to find css locator of the element you want to interact //with(get property, click on or get text) and pass it to appropriate function: 
String myCssLocatorOfTheElement=..blablabla..; 
String color=jsGetColor(myCssLocatorOfTheElement); 
String text=getTextOfTheElement(myCssLocatorOfTheElement); 
clickOnTheElement(myCssLocatorOfTheElement); 

희망이 도움이 : 당신이 접근 불가가되는 요소를 의심 할 때, 눈에 보이지 않는, 당신은 JS를 사용할 수있는 등 그래서 다음과 같이 우리는 몇 가지 방법이 있어요)를 속임수 너)

관련 문제