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.