2014-04-23 3 views
1

테스트중인 애플리케이션이 외부 공급 업체에서 개발되었으므로 HTML 구조를 제어 할 수 없습니다. 이 애플리케이션은 Javascript와 Ajax가 무겁고 동적으로 생성되는 수많은 버튼과 자동 완성 목록이 있습니다. 정해진 ID로Behat/Mink - 버튼을 찾는 데 어려움이 있음

  • 요소 (ID를 즉석에서 생성 번호 또는 동적으로 추가 다른 텍스트가있다) 즉

    , 페이지의 특성들이 가득되어 있습니다

  • 같은 몇 가지 클래스와 함께 발생
  • (목록 있지만 숨겨진 된 div를 조회하지 않음) 그들이 중 사용자 정의 조회 목록 에 대한 '아래로'화살표를 코딩되어 있기 때문에 버튼이 텍스트가 그들과 연관되지 않은 시간의 대부분 또는 '+'및 '-'아이콘은 입니다. 콘텐츠의 일부를 최대화하거나 최소화합니다. -

따라서 이러한 요소, 특히 버튼을 식별하는 것은 매우 어렵습니다.

나는 각각의 버튼을 하드 코드 할 필요가 없도록 일반 유형의 '버튼 근처를 클릭하십시오.'라고 쓰려고합니다 (각 항목을 식별 할 수 있다고 가정 할 때) 모든 시험.

이 문제는 일반적으로 버튼과 가까운 종류의 레이블이 있다는 것을 의미합니다.

내가 원하는 것은 텍스트 라벨을 찾아 동일한 범위 안에 버튼이 있는지 확인하고, 그렇지 않은 경우 부모 요소를 '뒤로'이동하고 버튼이 있는지 확인하는 것입니다. 각 학부모의 범위 내에서 최대 5 명의 학부모까지

이 접근법에는 여러 가지 문제가있을 수 있지만 일반적으로 작동하는지 궁금합니다. 나는 몇 가지 문제를 겪었다.

은 우선은 XPath를 사용하려고, 그래서 나는 통해 부모는 XPath를 가지고 : 그들은 것, (//html//span[text()='Cost center'])[1] 및 부모 요소를 통해 모든 시간을 이동 : 이것은 저에게하는 XPath를 줄 것이다

$parentelement = $element->getParent(); 

$parentXpath->getXpath(); 

연속적으로된다 :

(//html//span[text()='Cost center'])[1]/..[1] 

(//html//span[text()='Cost center'])[1]/..[1]/..[1] 

등.

실제 버튼에 있습니다 (//html//span[text()='Cost center'])[1]/..[1]/..[1]//button하지만 거기에 도착하기 위해 모든 부모 요소를 통과해야한다, 그래서 (//html//span[text()='Cost center'])[1]//button로 시작하고 버튼을 찾아야한다 곳에 (//html//span[text()='Cost center'])[1]/..[1]/..[1]//button로 끝나야합니다.

$button_element = $session->getPage()->find('xpath',$parentXpath."//button") 

내가 곧 그것이 었죠 사용하려한다는 명령은 XPath는 그래서 당신의 XPath는 문자열의 맨 앞에에 // html로를 추가 '발견'보았다 : 내가 사용 XPath는을 사용하려고

(각 부모 XPath는하지만, 예를 들어이 하나 사용) :

//span[text()='Cost center'][1]/..[1] 
: 나를 떠나 내가 다음 괄호뿐만 아니라 // HTML을 제거

(//html(//html//span[text()='Cost center'])[1]/..[1]) 

을,3210

그러나 나는 시도 할 때 :

$button_element = $session->getPage()->find('xpath',$strippedParentXpath."//button") 

내가 가지고 다음과 같은 오류 : 그러나

SyntaxError: Failed to execute 'evaluate' on 'Document': The string '(//html//span[text()='Cost center'][1]/..[1]//button)[1]' is not a valid XPath expression 

, 그것을 발견하지 않지만 Firepath이 식을 실행할 수 있으며위한 구문 오류가 표시되지 않습니다 실제 버튼 (버튼은 Firepath가 찾은 곳에서 실제로 한 레벨 위에 위치하기 때문에).

그럼 내 질문 1 : 내 Xpath에 문제가있어서 찾기에서 사용할 수 없습니까? 사실 마치 //span[text()='Cost center'][1]//button이 동일한 예외를 throw하지 않는 것처럼 보입니다. 왜냐하면 말했듯이 부모 Xpath를 통해 반복하고 있으며 //span[text()='Cost center'][1]//button으로 시작하기 때문입니다. //span[text()='Cost center'][1]/..[1]//button에서 충돌이 발생합니다.

두 번째 옵션은 페이지에서 텍스트를 찾는 것으로 시작하여 부모 요소를 가져 오는 것이었지만 findbutton 기능을 사용하여 부모 요소의 범위 내에있는 버튼을 검색하는 것이 었습니다. (최대 5까지) 부모 요소 통해 반복

: 환언

$parentelement = $parentelement->getParent(); 

$butonelement = $parentelement->findbutton('xxx'); 

가 부모 요소의 범위를 어떤 버튼을 찾을. 내가 가진 문제는 일반적인 '버튼'을 지정하는 방법입니다.

하나의 텍스트를 단추 (위의 'xxx'로 표시)와 연결해야합니다.

는하지만이 응용 프로그램에서 버튼의 전형적인 예입니다 : 클래스가 두 번 이상 사용

<button class="autocomplete_button" type="button" id="button_OM_1">&nbsp;</button> 

및 ID 자동 생성이 아닌 같은 수의 모든 시간입니다. 클래스가 이미지를 지정하기 때문에 버튼과 연관된 텍스트가 없습니다.

질문 2 : 어떻게 '버튼'을 사용하여 '구별'을 구별 할 수 있습니까? 실제로 버튼의 어딘가에 '버튼'이있을 가능성을 생각하면서 findbutton ("버튼")을 시도했지만 실제로는 작동하지 않았습니다. 적어도, 그것은 일관되게 작동하지 않습니다. 그리고 그것은 동일한 테스트가 두 번 테스트를 실행할 때 무작위로 동일한 버튼을 찾거나 찾지 않는 것처럼 보입니다.

답변

0

나는 일반적으로 CSS 선택기를 사용하며 클래스와 ID로 이동하는 데 사용한다.당신이

$this->getSession()->getPage()->find ('css', '.parrent1 .parrent2 .autocomplete_button '); 

을 사용할 수 있습니다처럼
당신이 알고있는이 어떤 버튼이 각 시나리오에 거 사용

+0

의견에 감사드립니다.하지만 같은 페이지에 있는지 확신 할 수 없습니다. 나는 실제로 버튼이나 부모 요소의 클래스 나 ID를 알지 못합니다. 일반적으로 javascript로 동적으로 생성되기 때문입니다. 그 동안 내 Xpath 방법이 작동하기를 원하지 않는 이유에 대해 좀 더 조사를 해본 결과 내가 아래에 게시 할 답변이 있습니다. – user3556070

0

이 문제에 좀 더 조사를 수행 한 후 당신을 도울 것입니다 생각, 내 생각 XPath는보다 쉽습니다 I 다음을 찾았습니다. xpath를 사용하여 div 주위와 span 주위를 '위로'지나가는 방식으로 텍스트 조각에 가장 가까운 버튼을 찾는 방법이 실제로 작동하고 있습니다.

작동하지 않는 것은 웹 드라이버로 사용하고있는 SAHI입니다. 즉, Behat/Mink 문제가 아니며, SAHI 특정 문제입니다.

Selenium2를 사용하여 동일한 코드를 시도했지만 완벽하게 실행됩니다.

질문 2에 대한 대답이 필요합니다. ID, 이름 또는 값과 같은 특정 매개 변수없이 findbutton()을 어떻게 사용할 수 있습니까?하지만 그 질문에 대한 답변을 별도로 구할 수 있는지 그리고 Behat 사용자 그룹은 내가 Behat/Mink 특정 문제라고 생각하기 때문에.

+0

버튼과 관련된 레이블이 있습니까? –