문제

나는 사용한다 Xpather 브라우저 HTML 페이지에서 내 XPath 표현식을 확인하려면.

최종 목표는 사용자 인터페이스 테스트를 위해 셀레늄에서 이러한 표현식을 사용하는 것입니다.

이와 유사한 콘텐츠가 포함 된 HTML 파일을 얻었습니다.

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

문자열이 포함 된 텍스트가있는 노드를 선택하고 싶습니다. "&nbsp;".

"ABC"와 같은 일반 문자열에는 아무런 문제가 없습니다. 나는 비슷한 xpath를 사용합니다 //td[text()="abc"].

xpath와 같은 시도 할 때 //td[text()="&nbsp;"] 아무것도 반환하지 않습니다. 텍스트에 관한 특별한 규칙이 있습니까?&" ?

도움이 되었습니까?

해결책

그것은 것 같습니다 OpenQa, 셀레늄 뒤에있는 사람들은 이미이 문제를 해결했습니다. 그들은 일부 변수를 설명하여 공백과 일치하도록 정의했습니다. 제 경우에는 비슷한 XPath를 사용해야합니다. //td[text()="${nbsp}"].

이 문제에 관한 OpenQA의 텍스트를 여기에서 재현했습니다 (찾았습니다. 여기):

HTML은 주요/후행 공간을 무시하고 추가 공간, 탭 및 신성을 단일 공간으로 변환하여 요소 내에서 공백을 자동으로 정규화합니다. Selenium이 페이지에서 텍스트를 읽을 때이 동작을 복제하려고 시도하므로 HTML의 모든 탭과 최신 라인을 무시하고 렌더링 할 때 브라우저에서 텍스트가 어떻게 보이는지에 따라 어설 션을 수행 할 수 있습니다. 우리는 모든 가시적이지 않은 공백을 교체하여이를 수행합니다 (비 분해 공간 포함.&nbsp;") 단일 공간.<br>, <p>, 그리고 <pre> 포맷 된 새 선)을 보존해야합니다.

HTML Selenese 테스트 케이스 테이블의 텍스트에서 동일한 정규화 로직을 사용합니다. 이것은 여러 가지 장점이 있습니다. 첫째, 귀하의 주장이 무엇인지 알아 내기 위해 페이지의 HTML 소스를 볼 필요가 없습니다. "&nbsp;"기호는 최종 사용자에게는 보이지 않으므로 Selenese 테스트를 작성할 때 걱정할 필요가 없습니다.&nbsp;"테스트 케이스의 마커가 포함 된 필드에서 AssertText"&nbsp;".) 당신은 또한 당신의 셀렌에 여분의 최신 라인과 공간을 넣을 수도 있습니다. <td> 태그; 테스트 케이스에서 텍스트에서와 동일한 정규화 로직을 사용하므로 어설 션과 추출 된 텍스트가 정확히 일치하도록 확인할 수 있습니다.

이것은 테스트 케이스에 추가 공백을 삽입하기를 정말로 원하거나 필요로하는 드문 경우에 약간의 문제를 일으 킵니다. 예를 들어, 다음과 같은 필드에 텍스트를 입력해야 할 수도 있습니다. "foo ".하지만 단순히 글을 쓰면 <td>foo </td> Selenese 테스트 케이스에서는 추가 공간을 하나의 공간으로 교체 할 것입니다.

이 문제는 간단한 해결 방법이 있습니다. 우리는 Selenese에서 변수를 정의했습니다. ${space}, 그 가치는 단일 공간입니다. 당신이 사용할 수있는 ${space} 다음과 같이 자동으로 트림되지 않는 공간을 삽입하려면 다음과 같이합니다. <td>foo${space}${space}${space}</td>. 우리는 또한 변수를 포함 시켰습니다 ${nbsp}, 비 분해 공간을 삽입하는 데 사용할 수 있습니다.

Xpaths는 그렇습니다 ~ 아니다 우리가하는 방식으로 공백을 정상화하십시오. 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를 사용하여 프로그래밍 언어에 의존하여 올바른 유니 코드 이스케이프 시퀀스를 제공하는 것처럼 보입니다. 그래서 어쨌든 나는 올바른 일을했습니다.

소수 단체를 사용해보십시오 &#160; 지명 된 엔티티 대신. 그래도 작동하지 않으면 단순히 사용할 수 있어야합니다. 깨지지 않는 공간에 대한 유니 코드 문자 대신 &nbsp; 실재.

(참고 : Xpather에서 이것을 시도하지는 않았지만 산소에서 시도했습니다.)

표준 호환 XML 프로세서는 XML의 5 개의 표준 참조 이외의 엔터티 참조를 대체 할 것임을 명심하십시오 (&amp;, &gt;, &lt;, &apos;, &quot;) XPATH 표현식이 평가되는 시간에 의해 대상 인코딩에서 해당 문자를 사용하여. 그 행동을 감안할 때 Philho와 Jsulak의 제안은 XML 도구로 작업하려면 갈 길입니다. 입장 할 때 &#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;"> ]>

그것이 당신에게 도움이 될지 확실하지 않지만 나는 실제로 찾기 NBSP xpath 표현식 사용.

편집 : 내 코드 샘플에는 실제로 문자가 포함되어 있습니다 '' '' 그러나 JavaScript Syntax 하이라이트는이를 공간 문자로 변환합니다. 오도하지 마십시오!

검색 &nbsp; 또는 만 nbsp - 이것을 시도 했습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top