2014-06-18 2 views
1

셀레늄을 처음 사용하고 junit 프레임 워크에서 웹 응용 프로그램을 자동 작성하려고합니다. 많은 사람들이 웹 요소를 식별하는 데 문제가 있으므로 두 개의 제출 버튼에 동일한 xpath 및 css 선택자가있는 지점에 너무 갇혀 있습니다.xpath가 같더라도 셀레늄의 요소를 식별하는 방법

두 형태의 태그

I 관찰 할 수있는 유일한 차이점이다 .., I는 클래스 이름이 다른 것을 알 수있다 (제 1 형태의 태그는 "feature_space_checkbox"이고 두 번째 형태의 태그는 "auto_fs_steps_checkbox"이다)

로서 나는 내가 이것을 실행하려고하면

driver.findElement(new ByChained(By.className("auto_fs_steps_checkbox"),By.xpath("//*[@id='edit_brochure_2863']/input[3]"))); 

다음과 같이 두 번째 제출 버튼을 식별하는 시도가 두 번째 button..So를 제출 식별해야합니다, 나는

org.openqa.selenium.NoSuchElementException: Cannot locate an element using By.chained({By.className: auto_fs_steps_checkbox,By.xpath: //*[@id='edit_brochure_2863']/input[3]}) 
01로 오류가 발생했습니다 나는이 시나리오 그것이 두 번째 제출 버튼

<form action="/brochures/2865/feature_space_checked" class="feature_space_checkbox" id="edit_brochure_2865" method="post"><div style="margin:0;padding:0"> 
    <input name="commit" type="submit" value="Submit"> 
    </form> 

에 대한 DOM을 추가하는 실수

을 만든 곳 23,516,

는 사람이 .. 저를 수정하시기 바랍니다 수

<form action="/brochures/2865/update_auto_fs_steps" class="auto_fs_steps_checkbox" id="edit_brochure_2865" method="post"><div style="margin:0;padding:0"> 
    <input name="commit" type="submit" value="Submit"> 
    </form> 

답변

2

첫째, XPath 및 CSS 선택자가 명확하지 않습니다. 페이지의 모든 요소에 대해 많은 XPath와 CSS가 있으므로 동일한 Xpath와 CSS 선택자가 잘못되었다고 말할 수 있습니다.

예를 들어, XPath를 사용하거나 두 개의 선택기를 결합 할 필요가 있습니까?

다음 CSS가 작동합니다.

form.auto_fs_steps_checkbox input 
+0

고맙다 Robbie .. 이제 괜찮아. –

1

이 모두의 XPath 표현 될 수있는 체인을 사용할 필요가 없습니다 :

//*[@id='edit_brochure_2863' and @class='feature_space_checkbox']/input 

그래서이 자바에있을 것입니다 : 두 번째에 대한 물론

driver.findElement(By.xpath("//*[@id='edit_brochure_2863' and @class='feature_space_checkbox']/input")); 

, 제출 버튼은

driver.findElement(By.xpath("//*[@id='edit_brochure_2863' and @class='auto_fs_steps_checkbox']/input")); 
+0

"클래스 ="는 클래스를 리터럴 문자열로 취급하므로 xpath에서 항상 위험합니다. CSS 선택자와 달리, 요소에 추가 클래스가 추가되면 xpath가 더 이상 작동하지 않습니다. 순서도 보장 할 수 없으므로 "class = 'foo bar"는 "bar foo"와 일치하지 않으므로 불안정 할 수 있습니다. 클래스를 추가하더라도 항상 "contains (@class,"foo ")를 사용하려고합니다. –

+0

@RobbieWareham 경고는 확실히 사실이고 타당합니다. 그러나, 나는 그것을 의도적으로했고 문제를 알고있었습니다.OP가 XML을 명확하게 지정 했으므로 다른 클래스가 존재하지 않으므로 _specific_ 문제의 경우 작동합니다. – dirkk

+0

예,하지만 HTML은 종종 동적 인 클래스이므로, 대안을 지적하고 싶습니다. BTW 나는 XPath에 아무런 문제가 없다는 사실을 나는 그것이 종종 잘못 이해하고있다라고 생각한다. –

0

두 번째 제출에 대한 xpath는

driver.findElement(By.xpath("//form[@class='auto_fs_steps_checkbox']/input")); 

두 번째 버튼을 식별하기에 충분합니다. 여기에서 클래스 이름은 고유하고 id는 둘 다 동일합니다. 그래서 우리는 클래스 이름으로 그것을 더 잘합니다.

관련 문제