테스트중인 애플리케이션이 외부 공급 업체에서 개발되었으므로 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"> </button>
및 ID 자동 생성이 아닌 같은 수의 모든 시간입니다. 클래스가 이미지를 지정하기 때문에 버튼과 연관된 텍스트가 없습니다.
질문 2 : 어떻게 '버튼'을 사용하여 '구별'을 구별 할 수 있습니까? 실제로 버튼의 어딘가에 '버튼'이있을 가능성을 생각하면서 findbutton ("버튼")을 시도했지만 실제로는 작동하지 않았습니다. 적어도, 그것은 일관되게 작동하지 않습니다. 그리고 그것은 동일한 테스트가 두 번 테스트를 실행할 때 무작위로 동일한 버튼을 찾거나 찾지 않는 것처럼 보입니다.
의견에 감사드립니다.하지만 같은 페이지에 있는지 확신 할 수 없습니다. 나는 실제로 버튼이나 부모 요소의 클래스 나 ID를 알지 못합니다. 일반적으로 javascript로 동적으로 생성되기 때문입니다. 그 동안 내 Xpath 방법이 작동하기를 원하지 않는 이유에 대해 좀 더 조사를 해본 결과 내가 아래에 게시 할 답변이 있습니다. – user3556070