2016-07-25 7 views
2

저는 Rspec과 watir-webdriver를 사용하고 있습니다. 화면에서 항목이 삭제 될 때 이 아니므로 통과 테스트를 작성하는 데 어려움을 겪고 있습니다. m가 시도 : 나는 항목을 삭제하면Rspec 및 watir-webdriver; assert 요소가 없습니다.

# this method gets the specific item I want to interact with 
def get_item(title) 
    foo = @browser.div(:text, title).parent.parent 
    return foo 
end 

# This method looks at an element grid that contains all the items 
def item_grid_contents 
    grid = @browser.div(:class, 'items-grid') 
    return grid 
end 

는, 이러한 내 주장 쓸 시도한 방법의 몇 가지 :이 경우

expect(get_item(title)).not_to be_present # => fails, unable to locate element 
expect(item_grid_contents).not_to include(get_item(title)) # => fails, same error 

를, 내가 보장하기 위해 찾고 있어요 요소 에 위치 할 수 없으므로 에스. 이것을 작성하는 또 다른 방법이 있습니까?

답변

1

왜 단지 확인하지? 결국 외부 컨테이너 (부모)가 없어지면 그 내용 (자식)도 마찬가지입니다.

expect(@browser.div(text: title)).not_to be_present 

또는 (확실하지 내가 바로 여기 내 기대 구문이 ..) 루비 다시

expect(@browser.div(text: title).present?.to be_false 

작은 메모를 ... 당신이 그 방법을 중간 변수를 귀찮게하지 않음으로써 조금 청소기를 만들 수 있습니다. 실제로 묵시적으로 'return'을 제거 할 수도 있습니다 (그러나 우리 중 일부는 읽기 쉽도록하기를 좋아합니다). 또한 Ruby 코드를 작성하는 대부분의 사람들은 두 개의 들여 쓰기를 사용합니다. 당신의 위의 방법에 대한 그래서, 당신은 단지

def get_item(title) 
    return @browser.div(:text, title).parent.parent 
end 

또는

def item_grid_contents 
    @browser.div(:class, 'items-grid') 
end 
+0

고마워요. 이것이 제게 가장 쉬운 해결책이었습니다. – kmancusi

1

#parent 메서드는 Watir 요소를 만드는 Selenium 요소를 찾기 위해 javascript를 사용하기 때문입니다. 대부분의 요소들에 대해 Watir은 xpath locator를 생성하지만 느린로드로 인해 상호 작용할 때까지 존재하지 않아도됩니다. 이 자바 스크립트 호출을 사용하면 즉시 평가되므로 #exists? 또는 #present? 메소드에 응답하지 않아도 즉시 실패합니다.

이것은 현재 부모 구현이 마음에 들지 않는 훌륭한 사례입니다. 나는 그것을 강요 할 강력한 이유가 없었기 때문에 잠시 동안 이것을 바꾸기 위해 코드에 앉아 있었다. 이것이 중요한 이유입니다. 지금은

,이 당신을 위해 작동합니다 생각 : div(:text, title)가있는 경우

@browser.div(:text, title).element(xpath: './ancestor::*[2]') 
+0

하는 XPath를 사용하지 않고 할 수있는 방법이 사용할 수 있을까? – kmancusi

+0

Watir 팀이 부모 메소드의 구현을 변경하지 않는 한 /까지는 아닙니다. 내 욕망은 말 그대로 xpath로 구현하는 것입니다. xpath를 사용하는 유일한 단점은 가독성이며, 적어도이 것은 실제로 무엇을하는지 분명합니다. – titusfortner