문제

ASP.NET를 사용하면 태그 ID가 꽤 변동성이 높기 때문에 테스트를보다 강력하게 만들기 위해 레이블 텍스트로 요소를 찾으려고합니다. 나는 Watin과 약간의 연주를했고 그것은 완벽하게 수행하지만 그 프로젝트는 요즘 죽은 것처럼 보이므로 프레임 워크를 결정하기 전에 셀레늄을 살펴볼 것이라고 생각했습니다.

이런 식으로 보이는 HTML이 있습니다

<label for="ctl00_content_loginForm_ctl01_username">Username</label>:
<input type="text" id="ctl00_content_loginForm_ctl01_username" />

입력하고 싶지 않습니다.

selenium.Type("ctl00_content_loginForm_ctl01_username", "xxx");

그것은 ID에 너무 의존합니다. Watin에서는 다음을 쓸 것입니다.

browser.TextField(Find.ByLabelText("Username")).TypeText("xxx");

셀레늄에서 이것을 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

나는 당신이 다음과 같이 이것을 할 수 있다고 생각합니다.

selenium.Type(selenium.getAttribute("//label[text()='Username']/@for"), "xxx");

text () = 'username'비트는 InnerHtml에서 원하는 레이블을 가져오고 /@for는 "for"attribute의 값을 다시 제공합니다.

머리 위로 : 이것은 테스트되지 않았지만 (사과!) IDE 플러그인의 일부 툴링을 기반으로 작동 할 것 같습니다.

다른 팁

이것은 작동합니다 :

//input[@id=(//label[text()="Username"]/@for)]

설명 : 입력을 찾고 있기 때문에 :

//input[@id=("ctl00_content_loginForm_ctl01_username")]

레이블의 속성 값으로 "ctl00_content_loginform_ctl01_username"을 교체하십시오.

//label[text()="Username"]/@for

좋아, 이것은 1 살이 되었을지 모르지만 그들은 이봐. 텍스트 '사용자 이름'이 포함 된 레이블 아래에서 첫 번째 입력을 선택합니다.

//label[text()='Username']/input

일부 브라우저가 가끔 요소에 성가신 공간을 추가하고 있음을 알기 때문에 일반적으로 contains ()를 사용하는 것을 선호합니다.

//label[contains(., 'Username')]/input

입력 이전의 단일 슬래시는 이중 슬래시가 레이블 아래의 모든 레벨을 확인하는 한 레벨만으로 보인다는 것을 나타냅니다. Firefox에 Xpather를 사용하여 XPATH를 생성하고 확인하십시오. 매우 유용합니다.

예, XPath, CSS 또는 DOM 로케이터를 사용하여 요소를 식별 할 수 있습니다. 이 예에서 XPath는 // lable [@for = 'ctl00_content_loginform_ctl01_username']처럼 보일 수 있습니다.

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