prosource

XPATH를 사용하여 다음을 포함하는 텍스트 검색

probook 2023. 9. 25. 22:50
반응형

XPATH를 사용하여 다음을 포함하는 텍스트 검색

XPather Browser를 사용하여 HTML 페이지에서 XPATH 표현식을 확인합니다.

제 최종 목표는 셀레늄에서 사용자 인터페이스를 테스트하는 데 이 표현들을 사용하는 것입니다.

다음과 같은 내용의 HTML 파일을 받았습니다.

<tr><td>abc </td><td>&nbsp;/td></tr>

합니다 된 텍스트를 하고 싶습니다&nbsp;".

와 가 없습니다.한 XPATH합니다.//td[text()="abc"].

해 볼 때//td[text()="&nbsp;"]아무 것도 돌려주지 않습니다.""까"가이 있습니까?&" ?

Selenium의 배후에 있는 OpenQA는 이미 이 문제를 해결한 것으로 보입니다.그들은 몇 가지 변수를 공백과 정확히 일치하도록 정의했습니다.제 경우에는 다음과 같은 XPATH를 사용해야 합니다.//td[text()="${nbsp}"].

오픈의 텍스트를 여기서 재현했습니다.이 문제와 관련된 QA(여기에서 확인 가능):

HTML은 요소 내의 공백을 자동으로 정규화하여 선행/후행 공백을 무시하고 여분의 공백, 탭 및 새 줄을 단일 공백으로 변환합니다.셀레늄은 페이지 밖으로 텍스트를 읽을 때 이 동작을 복제하려고 시도하므로 HTML의 모든 탭과 새 줄을 무시하고 렌더링 시 텍스트가 브라우저에서 어떻게 보이는지에 따라 주장을 수행할 수 있습니다.은 눈에 않는 모든 빈백함)합니다" 으로써 수행됩니다.&nbsp; 한 으로.") 으로합니다. 눈에 새 선선()<br>,<p>,그리고.<pre>형식화된 새 줄)을 보존해야 합니다.

HTML Selenese test case table의 텍스트에 동일한 정규화 로직을 사용합니다.이것은 많은 장점을 가지고 있습니다.를 볼 가 없습니다째, HTML다를의하세요;"&nbsp;를 작성할 에 대해 걱정하지 됩니다라고 셀레네즈 ".&nbsp;" 검사 케이스에 표시된 마커를 사용하여 주장할 수 있습니다.을(를) 하는 필드&nbsp;도 있습니다.") 셀레네어에 줄과 여백을 추가할 수도 있습니다.<td>할 수 s;다.

따라서 테스트 케이스에 공백을 추가로 삽입해야 하는 드문 경우에 약간의 문제가 발생합니다.를 들어 어,다"와해야 할 foo". 하지만 당신이 단순히 글을 쓴다면,<td>foo </td>셀레네 테스트 케이스에서는 여분의 공간을 하나의 공간으로 교체해 드립니다.

이 문제는 간단한 해결 방법을 가지고 있습니다.데에서 ${space}입니다.합니다.${space}오.<td>foo${space}${space}${space}</td>했습니다이라는 ${nbsp} 않는 하는 데 할 수 있습니다.

XPath는 우리가 하는 것처럼 공백을 정규화하지 않습니다.XPath를 작성해야 한다면 다음과 같습니다.//div[text()="hello world"]의 HTML말"입니다.hello&nbsp;world", 당신은 진짜를 삽입해야 할 것입니다.&nbsp;시키는 것처럼 "셀레네 합니다.//div[text()="hello${nbsp}world"].

두 따옴표 사이에 Windows에서 Alt+0160을 입력하면 하드 코딩된 깨지지 않는 공간(U+00A0)을 입력할 수 있습니다.

//table[@id='TableID']//td[text()=' ']

그 특별한 차로 나를 위해 일했습니다.

XPath 1.0 표준은 탈출 유니코드 문자를 처리하지 않는 것으로 알고 있습니다.XPath 2.0에 그것에 대한 기능이 있는 것 같지만 Firefox가 그것을 지원하지 않는 것 같습니다(혹은 제가 뭔가 잘못 이해했습니다).그래서 당신은 지역 코드 페이지와 관련이 있습니다.못생겼다는 거 알아요.

사실 표준은 정확한 유니코드 탈출 순서를 제공하기 위해 XPath를 사용하는 프로그래밍 언어에 의존하고 있는 것 같습니다.그래서, 어떻게든, 옳은 일을 한 겁니다.

제공하신 HTML에 따라:

<tr>
  <td>abc</td>
  <td>&nbsp;</td>
</tr>

문자열로 노드를 찾으려면 다음 기반 솔루션 중 하나를 사용할 수 있습니다.

  • 으로.text():

    "//td[text()='\u00A0']"
    
  • 으로.contains():

    "//td[contains(., '\u00A0')]"
    

그러나 이상적으로 NO-BREAK SPACE 문자를 피하고 다음 로케이터 전략 중 하나를 사용하는 것이 좋습니다.

  • 항목 하기 <tr>efollowing-sibling:

    "//tr//following-sibling::td[2]"
    
  • 으로.starts-with():

    "//tr//td[last()]"
    
  • 에서 설명한 을 사용합니다.<td>efollowingnode and': -':

    "//td[text()='abc']//following::td[1]"
    

언급

관련 자세한 내용은 다음에서 확인할 수 있습니다.


tl; dr

유니코드 문자 'NO-BREAK SPACE' (U+00A0)

를(를) 사용해 보십시오.&#160;이름있는 개체 대신에만약 그것이 작동하지 않는다면, 당신은 유니코드 문자를 단지 깨지지 않는 공간에 사용할 수 있어야 합니다.&nbsp;독립체.

(참고: XPather에서는 시도하지 않았지만, Oxygen에서는 시도했습니다.)

는 XML의 참조(을 들어 XML 의 XML 입니다 5는)를 엔티티 .&amp;,&gt;,&lt;,&apos;,&quot;XPath 식을 평가하는 시간까지 대상 인코딩에서 해당 문자를 사용합니다.이러한 동작을 고려할 때 XML 도구를 사용하고자 한다면 PhiLho와 jsulak의 제안이 최선의 방법입니다..&#160;XPath 식에서 XPath 식을 적용하기 전에 해당 바이트 시퀀스로 변환해야 합니다.

Xpather를 사용하여 일치하는 파일을 얻을 수는 없지만 Microsoft의 XML 메모장에 있는 일반 XML 및 XSL 파일에서는 다음과 같은 작업이 가능했습니다.

<xsl:value-of select="count(//td[text()='&nbsp;'])" />

반환된 값은 1로 제 테스트 케이스의 정확한 값입니다.

그러나 다음을 사용하여 nbsp를 XML 및 XSL 내의 엔티티로 선언해야 했습니다.

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

그게 도움이 될지는 모르겠지만 실제로 XPath 식을 사용하여 nbsp를 찾을 수 있었습니다.

편집: 내 코드 샘플에는 실제로 '&nbsp;' 문자가 포함되어 있지만, 자바스크립트 구문 하이라이트를 통해 공백 문자로 변환됩니다.오해하지 마!

:&nbsp;ynbsp -요?

언급URL : https://stackoverflow.com/questions/247135/using-xpath-to-search-text-containing-nbsp

반응형