2

다른 요소에서 하위 요소를 쉽게 찾을 수 있습니까? (이 두 가지 항목 모두 PageFactory를 사용하여 찾았습니까?) 우리는 많은 모듈을 수용 할 수있는 컨테이너 세트를 가지고 있으며 적절한 위치에 표시하는지 확인하고자합니다.셀레늄 요소 위치

webElement.findElement(s)(WebElement webElement); 

또는 더 나은 :

webElement.contains(WebElement webElement); 
+0

나는 무엇을하려고하는지 실제로 알 수 없습니다. 예를 들어 주시겠습니까? 필자가 바라는 바에 따르면,'element.findElement (s by By)'는 여러분의 필요에 대해서조차 충분해야합니다. 나는 무엇이 잘못 되었는가? –

+0

필자는 필드의 FindBy 주석을 가져 오기 위해 다시 반사를 사용하지 않는 것을 선호합니다. 사용자 정의 PageFactory로 이미 초기화 된 두 개의 요소가 있습니다. 우리는 다양한 페이지를 생성하고 추가 할 수있는 다양한 모듈을 보유하고 있습니다. 나는 이러한 모듈을 스스로 찾아서 현재 화면의 적절한 위치에 있는지 확인하려고하므로 CMS에서 페이지가 변경 될 때마다 이러한 테스트를 각각 수정하고 싶지 않습니다. 모듈 A가 컨테이너 A 또는 B에 있지만 C가 아닌지 확인하십시오. – Scott

답변

2

I 다음을 수행 할 수있는 간단한 방법이 있을까요

webElement.findElement(s).(By by); 

:

이 API는 다음과 같은 방법을 갖고있는 것 같아요 드디어 당신이 필요로하는 것을 얻었습니다. 최선의 해결책은 다음과 같은 방식으로 이루어집니다.

public static void assertContains(WebElement outerElem, WebElement innerElem) { 
    // get borders of outer element 
    Point outerLoc = outerElem.getLocation(); 
    Dimension outerDim = outerElem.getSize(); 
    int outerLeftX = outerLoc.getX(); 
    int outerRightX = outerLeftX + outerDim.getWidth(); 
    int outerTopY = outerLoc.getY(); 
    int outerBottomY = outerTopY + outerDim.getHeight(); 

    // get borders of inner element 
    Point innerLoc = innerElem.getLocation(); 
    Dimension innerDim = innerElem.getSize(); 
    int innerLeftX = innerLoc.getX(); 
    int innerRightX = innerLeftX + innerDim.getWidth(); 
    int innerTopY = innerLoc.getY(); 
    int innerBottomY = innerTopY + innerDim.getHeight(); 

    // assures the inner borders don't cross the outer borders 
    final String errorMsg = "ughh, some error message"; 
    final boolean contains = (outerLeftX <= innerLeftX) 
      && (innerRightX <= outerRightX) 
      && (outerTopY <= innerTopY) 
      && (innerBottomY <= outerBottomY); 
    assertTrue(errorMsg, contains); 
} 

... 이러한 컨테이너가 겹치지 않는 경우에만 작동합니다. 그렇다면 innerElem.getTag()getText()으로 어둡고 와일드 한 마법을 시험해보고 바깥 쪽 텍스트에 내부 요소가 포함되어 있는지 테스트하십시오. 그것을하는 한 방법 :

public static void assertContains(WebElement outer, WebElement inner) { 
    // e.g. //div[text()='some text in inner element'] 
    final String findInner = ".//" + inner.getTagName() + "[text()='" + inner.getText() + "']"; 
    try { 
     outerElem.findElement(By.xpath(findInner)); 
    } catch (NoSuchElementException ignored) { 
     fail("Some horrible message! We are all doomed!"); 
    } 
    // passed 
} 

... 또는 이와 비슷한 것. ...

그리고 물론, 이것은 여전히 ​​추측입니다. normalize-space() 또는 contains() (또는 둘 다)이 태그에있는 태그로 인해 필요합니다. 첫 번째 방법은 오탐 (false positives)과 네거티브 (negative)가있을 수 있지만 (필자는 필자의 필요에 따라 더 좋아합니다), 두 번째 방법은 가양 성이 있어야합니다. 서로 결합하거나 무언가를 발명 할 수 있습니다 (예 : 이미 설명한대로 Reflection 사용).

또는 file a bug.

+0

필자는이 방법을 항상 좋아하지는 않지만 브라우저가 HTML을 비슷한 방식으로 렌더링하는지 결정할 수 있어야한다는 이점을 제공하지만 양날의 칼이기도하지만, 실제로 HTML은 요소의 자식 일 수 있지만 렌더링 문제로 인해 드라이버에서 뚜껑이 닫힌 결과를 얻는다면 경계 내에 있지 않을 수 있습니다. – Scott

+0

그래, 나는 우리가 실제로 갖고 싶어하는 것이 아님을 안다. /. 또한, 나는 그 답을 편집하여 미래의 독자들에게 더 유용 할 것으로 보인다. –

+0

좋아 보이는데, 나는 좀 더 깨끗하게 될 것이라고 생각하기 때문에 맞춤식 로케이터에서 작업 할 가능성이 높습니다. 또한 기능 요청으로 셀렌 Google 코드 저장소에 게시 할 예정입니다. – Scott