2016-09-02 3 views
1

동적 목록도 동적 인 IDs, CSS 및 기타 모든 옵션은 요소 목록을 얻는 데 도움이되지 않습니다 편도 기대합니다. 을 사용하십시오. 그러나 어떤면에서? 때문에 단지 셀레늄과 XPATH 1.0 지원,셀레늄/getElements XPATH 및 포함 (JAVA)

//a[@id='contentDataTable:4711:startMenu']/span 
//a[@id='contentDataTable:4712:startMenu']/span 
//a[@id='contentDataTable:4713:startMenu']/span 
.. 
//a[@id='contentDataTable:4714:startMenu']/span 

일치 내가 사용할 수 없습니다

목록이 목록은이 같은 XPATH 값이 포함되어 있습니다. 그래서

는 첫 번째 아이디어는
xpath=//a[contains(@id, 'contentDataTable:')] 

했지만 그것은 작동하지 않습니다 ... 올바른 contains() 호출을 찾고 있어요. 내가 요소를 얻기 위해 시도한 방법

:

public List<WebElement> getWebElements(Boolean isDebug, Boolean isHPOMDebug, RemoteWebDriver remWebDriver, String htmlType, String htmlValue, String actField) { 
    List<WebElement> webElements = null; 
    String   webRequest = ""; 

    try { 
     switch (htmlType) { 
      case "XPATH": 
       webRequest = htmlValue; 
       webElements = remWebDriver.findElements(By.xpath(webRequest)); 
       break; 

      case "LINKTEXT": 
       webRequest = htmlValue; 
       webElements = remWebDriver.findElements(By.linkText(webRequest)); 
       break; 

      case "LINKTEXTPART": 
       webRequest = htmlValue; 
       webElements = remWebDriver.findElements(By.partialLinkText(webRequest)); 
       break; 

      case "CSS": 
       webRequest = htmlValue; 
       webElements = remWebDriver.findElements(By.cssSelector(webRequest)); 
       break; 

      case "TAG": 
       webRequest = htmlValue; 
       webElements = remWebDriver.findElements(By.tagName(webRequest)); 
       break; 

      case "ID": 
       webRequest = actField; 
       webElements = remWebDriver.findElements(By.id(webRequest)); 
       break; 

      case "NAME": 
       webRequest = actField; 
       webElements = remWebDriver.findElements(By.name(webRequest)); 
      break; 


      default: 
       webElements = null; 
     } // END OF INNER SWTICH 

     if (isDebug && webElements != null && webElements.size() > 1) { 
      logger.log(LogStatus.INFO, "getWebElements: " + webRequest + " FOUND: " + webElements.size()); 
      for (int i=0;i<webElements.size(); i++) { 
       logger.log(LogStatus.INFO, "getWebElements: (" + i + ") TEXT = [" + webElements.get(i).getText()  + "]"); 
       logger.log(LogStatus.INFO, "getWebElements: (" + i + ") TAG = [" + webElements.get(i).getTagName() + "]"); 
       logger.log(LogStatus.INFO, "getWebElements: (" + i + ") LOC = [" + webElements.get(i).getLocation() + "]"); 
      } 
      report.flush(); 
     } 

    } 
    catch (Exception e) { 
     e.printStackTrace(); 
     webElements = null; 
    } 

    return(webElements); 
} 
+0

왜 당신이 작동하지 않는 생각으로 - :이 줄을 변경해야

? it 또는'// a [starts-with (@id, 'contentDataTable :')]'가 작동해야합니다. – splash58

+0

제공된 xpath는 괜찮아 보이니 xPath가 작동하지 않는 이유는 무엇입니까 ?? 어떤 예외가 있습니까 ?? –

+0

xpath가 okej로 보이고 xpath로 firefox 또는 chome에서 직접 테스트 했습니까?/span' 반환 – Tim

답변

2

실제로 xpath은 정확하고 점점 요소 방법 getWebElements(Boolean isDebug, Boolean isHPOMDebug, RemoteWebDriver remWebDriver, String htmlType, String htmlValue, String actField)에 대한 자바 코드도 좋아 보인다. 당신이 주석

라인 : - 당신이 잘못 null로 첫 webElements 변수를 초기화하는 있기 때문에

I got an null pointer exception... I check this again, perhaps I am an idot

당신은 NullPointerException을 받고 있습니다.

List<WebElement> webElements = null; 

List<WebElement> webElements = new ArrayList<WebElement>(); 
+0

당신이 틀렸다고 생각합니다. null 포인터는 contains를 사용하여 만 발생합니다 (!!!). 이 방법은 위에서 본 방법과 항상 같습니다. – OldMan

+0

@OldMan 아니요, FYI'findElements'는 'null'을 반환하지 않습니다. WebElement 또는 빈 목록 중 하나를 반환하므로 대부분 null 포인터의 원인이므로 제안 된대로 해당 줄을 변경해야합니다. –

+0

'null = list'처럼 의미가 없으면, 항상 NullPointerException을 던질 것입니다. –

0

은 이것에 대한 CSS 선택기를 얻기 위해 매우 쉽습니다. - contentDataTable 포함하는 ID를 가지고 <a> 요소를 발견 -을 위해 : 어떤이 셀렉터가하는 일은

a[id*=contentDataTable][id*=startMenu] 
 
a[id*=contentDataTable]

입니다 : 확인 작업을해야 CSS는 다음 선택기 중 하나를 사용하는 것입니다 동일한 요소 id에 startMenu가 포함되어야하는 다른 조건을 추가 할 수 있습니다.

공백을 사용할 경우 다음과 같습니다. div a [id * = contentDataTable]은 요소를 찾음을 의미합니다. <a>에는 contentDataTable을 포함하는 ID가 있지만이 요소는 div 내에 있어야합니다.

당신이 할 수있는 또 다른 일은 xpath에서 ":"을 제거하고 이것이 오류의 문제인지 확인하는 것입니다.

CSS 선택기는 w3schools에서 매우 잘 설명되어 있습니다. 몇 가지 기본 선택기가있는 표가 표시되며 더 잘 이해할 수 있도록 읽어야합니다. 당신이 필요로하는 요소를받지 못하고 있다면

w3schools css selectors

+0

CSS는 클래스에 사용되는 것으로 생각 ... .... 이걸 확인하십시오 .... – OldMan

+0

아니요, 사용할 수 있습니다. CSS를 사용하면 거의 모든 요소를 ​​식별 할 수 있습니다. 링크를 확인하면 ID, 클래스, 태그 및 기타 속성을 사용하여 대부분의 요소를 선택할 수 있습니다. – lauda

+0

첫 번째 옵션은 없음, 마지막으로 많이 발견됨 -하지만 ... – OldMan

1

을 확인하시기 바랍니다, 다음 아마도 XPath를 맞는 페이지의 다른 요소가있다. 당신은 xpath를 향상시킬 수 있습니다;

webDriver.findElements(By.xpath("//a[contains(@id, 'contentDataTable') and contains(@id, 'startMenu')]")) 
+0

고마워요. 권리에 논리가 포함되어 있는지 찾아내는 데 도움이됩니다. – OldMan