2016-12-17 6 views
1

Я следую guide, чтобы узнать TDD с помощью python. В some point, после выполнения миграции, вывод команды python3 functional_tests.py должен быть (по книге):Selenium не может получить доступ к мертвому объекту/Ссылка на элемент устарела

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. 

Я искал поисковые запросы и искал подобные проблемы, но не нашел того, что могло бы помочь мне решить проблему.
Я использую 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

ИМХО поддержка Chrome, кажется, намного лучше. Это немного тривиально, получить chromedriver и chromium через apt (извините только debian cmds/names под рукой) и symlink chromium, чтобы понравиться/usr/bin/chrome, и вы сделаны (относительно изменения на хром). –

ответ

1

Это потому, что книга ожидает использования Selenium 2, а не Selenium 3. v3 имеет совершенно другое поведение в отношении неявных ожиданий (и довольно много ошибок в последний раз, когда я проверял), поэтому проще всего придерживаться Selenium 2 для Теперь.

Есть еще один взгляд на инструкции по установке: http://www.obeythetestinggoat.com/book/pre-requisite-installations.html

2

Ошибка возникает потому, что ранее в этой главе мы добавим редирект после запроса POST. Страница кратковременно освежает, и это может испортить селен. Если вы хотите придерживаться Selenium 3, я нашел исправление для этого в блоге для книги: http://www.obeythetestinggoat.com/how-to-get-selenium-to-wait-for-page-load-after-a-click.html.

В принципе, вы добавляете метод к классу NewVisitorTest, который позволяет ждать перезагрузки страницы, а затем продолжает тесты assert.

... 
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")