2014-04-11 1 views
0

Chrome에서 실행할 때 원하는 값을 완벽하게 반환하는 특정 HTML 요소의 높이를 가져 오는 데 사용하는 특정 XPATH 쿼리가 있습니다. XPath 도우미 플러그인을 통해. 나는 로봇 프레임 워크브라우저에서 xpath query succesfull을 통해 속성을 가져 오지만 로봇 프레임 워크에서는 그렇지 않습니다.

Get Element Attribute//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/@height 

에서 가져 오기 요소 속성 - 키워드를 통해 동일한 쿼리를 사용할 때

//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/@height 

은 ... 나는이 XPATH에 대한 InvalidSelectorException을 얻었다.

InvalidSelectorException: Message: u'invalid selector: Unable to locate an 
element with the xpath expression `//*/div[@class="BarChart"]/*[name()="svg"]/* 
[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/` 

그래서 Robot Framework 나 Selenium은 @ 기호와 그 뒤에 오는 모든 것을 제거했습니다. 나는 그것이 탈출 - 문제라고 생각하고 @height 앞에 슬래시를 추가하고 제거했지만 성공하지 못했습니다. 또한이 쿼리의 결과를 string() - 명령에 캡슐화하려고 시도했지만 실패했습니다.

누군가 내 XPATH 쿼리가 손상되는 것을 방지하기위한 아이디어가 있습니까?

답변

2

Robot을 사용할 때 XPath 자체에 특성 축을 포함 할 수없는 것처럼 보입니다. XPath로 요소를 검색 한 다음 그 바깥에 특성 이름을 지정해야합니다.

Get Element Attribute xpath=(//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"])@height 

또는 아마 (내가 사용한 적이 로봇) :

attribute_locator이 요소 로케이터 구성 말한다

Get Element Attribute xpath=(//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"])[1]@height 

This documentation 구문이 같은 것입니다 것 같다 @ 기호 및 속성 이름 (예 : "element_id @ class")이옵니다.

위의 내용은 올바른 내용입니다.

+0

: 간단한 솔루션은 슬래쉬, 그래서 당신의 XPath는이 같이 것이라는 점을 드롭하는 것입니다

def _parse_attribute_locator(self, attribute_locator): parts = attribute_locator.rpartition('@') ... 

이 그 작업을 수행합니다 (이 글을 쓰는 ... 현재) 정확한 코드 안녕하세요 JLRishe, 정확히 내가 찾던 해결책이었습니다. Robot Framework에서 XPath 쿼리에이 접두사를 알았지 만 배치 할 필요가없는 경우가 많습니다. 대부분의 XPATH는 내가 사용하는 쿼리가 없이는 정상적으로 작동하지만,이 쿼리는 필요합니다. 어쨌든, 당신의 도움을 주셔서 감사합니다 – Tornado

+0

그냥'@'이전에'/'를 제거하면 원래 시도가 효과가있을 수 있습니다. 당신이 가진 오류 메시지는 그것도 역시 (그것은'@'before가'@ height'가 당신의 원소 선택자의 일부라고 생각합니다) 것을 제안하는 것 같습니다. – JLRishe

+0

아니, 그게 작동하지 않았다, 그건 내가 시도한 것들 중 하나였다. 게다가, 나는이/-sign을 사용한다고 말한 몇 가지 예를 온라인에서 발견했다. – Tornado

0

귀하의 관찰에서 키워드가 최종 @ 이후의 모든 것을 제거하는 것으로 보입니다. 좀 더 정확히 말하자면, @을 사용하여 요소 이름과 속성 이름을 구분하고, 마지막으로 @ 문자로 문자열을 분할하여 수행합니다.

이 시점에서 코드가 구문 분석을 수행하지 않으므로 이스케이프 처리로 문제를 해결할 수 없습니다.

//*/div[@class="BarChart"]/... and @class="bar bar1"]@height`