특정 문자열이 포함 된 속성에서 어떻게 일치시킬 수 있습니까?
속성에 둘 이상의 단어가 포함 된 경우 속성별로 노드를 선택하는 데 문제가 있습니다. 예를 들면 다음과 같습니다.
<div class="atag btag" />
이것은 내 xpath 표현입니다.
//*[@class='atag']
표현은
<div class="atag" />
그러나 이전 예에서는 그렇지 않습니다. 를 어떻게 선택할 수 <div>
있습니까?
속성의 위치에 관계없이 모두 선택합니다
//div[contains(@class, 'atag') and contains(@class ,'btag')]
mjv의 대답은 좋은 시작이지만 atag가 나열된 첫 번째 클래스 이름이 아닌 경우 실패합니다.
일반적인 접근 방식은 다소 다루기 힘든 것입니다.
//*[contains(concat(' ', @class, ' '), ' atag ')]
이것은 클래스가 공백으로 만 분리되고 다른 형태의 공백이 아닌 한 작동합니다. 이것은 거의 항상 그렇습니다. 그렇지 않은 경우 여전히 다루기 힘들어 야합니다.
//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]
(클래스 이름과 같이 공백으로 구분 된 문자열로 선택하는 것은 일반적인 경우입니다 .CSS3의 '[class ~ = "atag"]'와 같이 특정 XPath 함수가 없다는 것은 놀라운 일입니다.)
편집 : 완전한 토큰 수준에서 비교를 수행하는 트릭과 함께 start-with 대신 contains 를 사용하는 bobince의 솔루션을 참조하십시오 ( 'atag'패턴은 다른 'tag'의 일부로 찾을 수 있음).
"atag btag"는 클래스 속성에 대한 홀수 값이지만 결코 적습니다.
//*[starts-with(@class,"atag")]
이 시도: //*[contains(@class, 'atag')]
작동하는 2.0 XPath :
//*[tokenize(@class,'\s+')='atag']
또는 변수와 함께 :
//*[tokenize(@class,'\s+')=$classname]
관심있는 클래스 이름이 다른 가능한 클래스 이름의 하위 문자열이 아니라고 가정 할 수 있으면 bobince의 답변이 지나치게 복잡 할 수 있습니다 . 이것이 사실이라면, contains 함수를 통해 부분 문자열 매칭을 사용할 수 있습니다. 다음은 클래스에 하위 문자열 'atag'가 포함 된 모든 요소와 일치합니다.
//*[contains(@class,'atag')]
위의 가정이 유지되지 않으면 하위 문자열 일치가 의도하지 않은 요소와 일치합니다. 이 경우 단어 경계를 찾아야합니다. 공백 구분 기호를 사용하여 클래스 이름 경계를 찾아 bobince의 두 번째 답변은 다음과 정확히 일치합니다.
//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]
일치 atag
하지 않습니다 matag
.
bobince의 답변에 추가하려면 ... 사용하는 도구 / 라이브러리가 Xpath 2.0을 사용하는 경우 다음을 수행 할 수도 있습니다.
//*[count(index-of(tokenize(@class, '\s+' ), $classname)) = 1]
count-)는 index-of ()가 문자열에서 일치하는 각 인덱스의 시퀀스를 반환하므로 분명히 필요합니다.
당신은 다음을 시도 할 수 있습니다
By.CssSelector("div.atag.btag")
공통 URL을 포함하는 링크의 경우 변수로 콘솔해야합니다. 그런 다음 순차적으로 시도하십시오.
webelements allLinks=driver.findelements(By.xpath("//a[contains(@href,'http://122.11.38.214/dl/appdl/application/apk')]"));
int linkCount=allLinks.length();
for(int i=0; <linkCount;i++)
{
driver.findelement(allLinks[i]).click();
}
도와주세요.
'development' 카테고리의 다른 글
우리는 얼마나 많은 레벨의 포인터를 가질 수 있습니까? (0) | 2020.02.18 |
---|---|
JavaScript를 사용하여 텍스트 너비 계산 (0) | 2020.02.18 |
__init__와 __call__의 차이점은 무엇입니까? (0) | 2020.02.18 |
안드로이드에서 토스트를 표시하는 방법? (0) | 2020.02.18 |
PHP에서 파일 확장자를 얻는 방법? (0) | 2020.02.18 |