2016-12-17 4 views
1

파이썬으로 TDD를 배우려면 guide을 따르고 있습니다. some point에서 마이그레이션을 수행 한 후, 명령 python3 functional_tests.py의 출력은 (책에 따라)해야한다 :셀레늄이 죽은 객체에 액세스 할 수 없습니다/요소 참조가 오래되었습니다.

self.fail('Finish the test!') 
AssertionError: Finish the test! 

하지만 오류가 점점 오전 :

selenium.common.exceptions.InvalidSelectorException: Message: Given css selector expression "tr" is invalid: TypeError: can't access dead object 

을 그리고 두 번째 시도 (더 많은) 시간 이후 :

selenium.common.exceptions.StaleElementReferenceException: Message: The element reference is stale. Either the element is no longer attached to the DOM or the page has been refreshed. 

나는 인터넷 검색과 유사한 문제에 대한 SO 검색, 그러나 저 문제를 해결하는 데 도움이 수를 찾을 수 없습니다했습니다.
저는 geckodriver를 사용하여 PATH의 경로를 추가하고 있습니다.

Django==1.8.7 
selenium==3.0.2 
Mozilla Firefox 50.0.2 
(X)Ubuntu 16.04 

Chrome으로 전환해야하나요? 그것은 사소한 것이 아니라, 나에게 약간의 시간이 필요할 것이다. Firefox 또는 Selenium과 더 비슷합니까? 나는 그것이 코드와 관련 있다고 생각하지 않는다. 나는 repo for chapter 5을 복제했고, 똑같은 충돌이 일어나고있다.

+0

IMHO Chrome에 대한 지원이 훨씬 개선 된 것으로 보입니다. 그것은 일종의 사소한 일이지만 chromeriver와 chromium을 apt (유감스러운 데비안 cmds/이름을 손에 넣을 것)로 받고 symlink chromium을/usr/bin/chrome과 같이 사용하면 완료됩니다 (chromium으로 변경하는 것과 관련됨). –

답변

1

이 책은 Selenium 3이 아닌 Selenium 2를 사용하기를 기대하기 때문에 제공됩니다. v3는 암시 적 대기 (이전에 내가 확인한 버그)와 관련하여 매우 다른 동작을하기 때문에 Selenium 2를 사용하는 것이 가장 간단합니다. 지금. 우리는 POST 요청 후 리디렉션을 추가 장의 이전 때문에 http://www.obeythetestinggoat.com/book/pre-requisite-installations.html

2

오류가 발생 :

은 설치 지침에서 또 다른 보라. 페이지가 잠깐 새로 고쳐지면 Selenium이 망가질 수 있습니다. Selenium 3을 계속 사용하려면 책의 블로그 인 http://www.obeythetestinggoat.com/how-to-get-selenium-to-wait-for-page-load-after-a-click.html에 대한 수정 사항을 발견했습니다.

기본적으로 페이지가 다시로드 될 때까지 기다릴 수있는 메서드를 NewVisitorTest 클래스에 추가 한 다음 테스트를 계속합니다.

... 
from contextlib import contextmanager 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support.expected_conditions import staleness_of 

class NewVisitorTest(unittest.TestCase): 
    ... 
    @contextmanager 
    def wait_for_page_load(self, timeout=30): 
     old_page = self.browser.find_element_by_tag_name("html") 
     yield WebDriverWait(self.browser, timeout).until(
      staleness_of(old_page) 
     ) 
    ... 
    def test_can_start_list_and_retrieve_it_later(self): 
     ... 
     inputbox.send_keys("Buy peacock feathers") 
     inputbox.send_keys(Keys.ENTER) 

     with self.wait_for_page_load(timeout=10): 
      self.check_for_row_in_list_table("1: Buy peacock feathers") 

     inputbox = self.browser.find_element_by_id("id_new_item") 
     inputbox.send_keys("Use peacock feathers to make a fly") 
     inputbox.send_keys(Keys.ENTER) 

     with self.wait_for_page_load(timeout=10): 
      self.check_for_row_in_list_table("1: Buy peacock feathers") 
      self.check_for_row_in_list_table("2: Use peacock feathers to make a fly")