-
19-09-2019 - |
문제
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']처럼 보일 수 있습니다.