XPath를 사용하여 CSS 클래스별로 요소를 찾으려면 어떻게해야합니까?


297

내 웹 페이지 div에는 class이름이 인가 Test있습니다.

어떻게 찾을 수 XPath있습니까?



보다 일반적인 XPath, CSS, DOM 및 Selenium 솔루션은 XPath, CSS, DOM 및 Selenium : Rosetta Stone 문서에서 찾을 수 있습니다 . 구체적으로 답은 Id & Name 항목에서 찾을 수 있습니다 .
Terence Xie

답변:


472

이 선택기는 작동하지만 적절한 마크 업으로 바꾸면 더 효율적입니다.

//*[contains(@class, 'Test')]

또는 우리는 추구하는 요소가 다음을 알고 있기 때문에 div:

//div[contains(@class, 'Test')]

그러나 이것은 class="Testvalue"또는 과 같은 경우와 일치 class="newTest"하므로 주석에 제공된 @Tomalak 버전이 더 좋습니다 .

//div[contains(concat(' ', @class, ' '), ' Test ')]

실제로 올바르게 일치하는지 확인하려면 normalize-space 함수를 사용하여 클래스 이름 주위의 공백 문자를 정리할 수도 있습니다 (@Terry에서 언급 한대로).

//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]

이 모든 버전에서 *는 주어진 조건에 대해 문서의 모든 요소를 ​​검색하지 않는 한 실제로 일치시키려는 요소 이름으로 대체하는 것이 가장 좋습니다.


37
@meder : 더 좋아 //div[contains(concat(' ', @class, ' '), ' Test ')]-당신도 부분적으로 일치합니다.
Tomalak

5
// div [@ class = 'Test']
Jessica

11
클래스는 하나 개 이상의 값을 포함 할 수 있기 때문에
MEDER을 omuraliev

8
xpath에 공백으로 구분 된 토큰 목록에서 토큰을 찾는 더 빠르고 효율적인 방법이 없다는 것에 놀랐습니다. 이후 버전의 xpath에 무엇이 있습니까?
thomasrutter

1
@thomasrutter 왜 놀라운 일입니까? 이것은 더 구체적인 HTML이 아닌 XML을 위해 만들어진 언어 일뿐입니다. 누가 공간 분리 목록을 XML의 노드 값으로 사용하는 것이 캐주얼하다고 말합니다. Tomalak의 솔루션은 매우 실행 가능한 솔루션입니다.
bitoolean

152

가장 쉬운 방법 ..

//div[@class="Test"]

<div class="Test">설명 된대로 찾으려고 가정합니다 .


3
위의 구문은 사용하기가 훨씬 쉽고 오류가 적습니다. 검색하려면 클래스 주변에 이중 인용구가 있어야합니다. 위의 목록을 사용하는 것이 좋습니다. // div [@ class = "Test"]
FlyingV

이것은 div [class = 'Test']가 더 깊은 수준에있는 경우에 작동합니까?
Jake0x32

1
@ Jake0x32는 //단지 사용 하지 않기 때문 /입니다.
Solomon Ucko 2016 년

7
`<div class = "Test some-other-class"> 와도 일치합니까?
Jugal Thakkar

11
@JugalThakkar 아니오, 그렇지 않습니다. 작동하려면 정확히 일치해야하지만 // div [contains (@class, "Test")] 대신 시도 할 수 있습니다.
Olli Puljula

29

XPath를 사용 하는 유일한 방법은 다음과 같습니다.

//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]

이 함수는 normalize-space선행 및 후행 공백을 제거하고 일련의 공백 문자를 단일 공백으로 바꿉니다.


노트

이러한 Xpath 쿼리가 많이 필요하지 않은 경우 CSS 선택기는 일반적으로 XPath 쿼리보다 읽기 및 쓰기가 훨씬 쉬우므로 CSS 선택기를 XPath로 변환하는 라이브러리를 사용할 수 있습니다. 예를 들어,이 경우 div[class~="Test"]div.Test를 모두 사용 하여 동일한 결과를 얻을 수 있습니다.

내가 찾은 일부 라이브러리 :


24

Tomalak이 오래 전에 meder의 답변에 대한 의견으로 제공 한 것처럼 이것을 답변으로 제공하고 있습니다.

//div[contains(concat(' ', @class, ' '), ' Test ')]

3
그런 옛날부터 이것을 유감스럽게 생각하지만 concat(' ', normalize-space(@class), ' ')모든 종류의 공백 문자를 설명하는 것은 어떻습니까?
Terry

호기심을 위해-왜 //div[contains(concat(' ', @class, ' '), ' Test ')]/chid아이들을 선택하지 않습니까?
Fusion

@Fusion 질문으로 게시하면 답변을 얻을 수 있습니다.
bitoolean

@bitoolean이 Cbvious 주장 인 요즘 힘들다
Fusion

@ 퓨전 나는 방금 도와 주려고 노력했다. XPath는 HTML 인식 언어가 아닙니다. 보다 일반적인 XML 전용입니다. 나는 그것에 대한 경험이 없지만 태그 대신 ID를 넣을 수 있다고 가정합니다. "id"속성 값을 선택해야합니다. 따라서 HTML 문서를 XML로 생각해야합니다. 주제를 벗어난 토론은 사람들이 해결책을 찾는 데 도움이되지 않습니다.
bitoolean

1

유용한 답변은 이전 답변으로 만들 수 있습니다.

function matchClass($className) {
    return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}

그런 다음 함수 호출을 쿼리에 연결하십시오.


이 코드는 PHP에서만 작동합니다. 당신은 그것을 언급 할 수 있습니다.
bitoolean

0

공백이있는 하나의 클래스 와 일치합니다 .

<div class="hello "></div>
//div[normalize-space(@class)="hello"]

-6

이 예제와 같은 요소를 찾을 수 있습니다 (모든 CSS 요소)

private By 
allElementsCss = By.xpath(".//div[@class]");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.