Obey the Testing Goat - Traceback
<p>So I'm going through this book called "Obey the Testing Goat" and I'm running into an issue in the sixth chapter while learning Python. It says that I should be able to run the functional_tests we've set up throughout the chapter and previous one with no errors; however, I keep getting a Traceback that I don't know how to fix.</p>

<pre><code>Traceback (most recent call last):
  File "C:\Users\YaYa\superlists\functional_tests\tests.py", line 54, in test_can_start_a_list_and_retrieve_it_later
    self.check_for_row_in_list_table('1: Buy peacock feathers')
  File "C:\Users\YaYa\superlists\functional_tests\tests.py", line 15, in check_for_row_in_list_table
    table = self.browser.find_element_by_id('id_list_table')
  File "C:\Users\YaYa\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 269, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "C:\Users\YaYa\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 752, in find_element
    'value': value})['value']
  File "C:\Users\YaYa\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 236, in execute
    self.error_handler.check_response(response)
  File "C:\Users\YaYa\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 192, in check_response
    raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"id","selector":"id_list_table"}
Stacktrace:
    at FirefoxDriver.prototype.findElementInternal_ (file:///C:/Users/YaYa/AppData/Local/Temp/tmp869pyxau/extensions/fxdriver@googlecode.com/components/driver-component.js:10770)
    at fxdriver.Timer.prototype.setTimeout/&lt;.notify (file:///C:/Users/YaYa/AppData/Local/Temp/tmp869pyxau/extensions/fxdriver@googlecode.com/components/driver-component.js:625)
</code></pre>

<p><a href="https://gist.github.com/yuyu23/8e5cce6c55e9ec3a771396048058a489" rel="nofollow">I've created a GIST in case anyone's interested in looking at the files that I've worked on throughout the chapters</a>. </p>

<p>You can also access the chapter for this book right <a href="http://www.obeythetestinggoat.com/book/chapter_06.html#_one_more_view_to_handle_adding_items_to_an_existing_list" rel="nofollow">here</a>.</p>

<p>I really don't know what the problem is (I'm not good at Python AT ALL and tried running pdb but I don't even know what half of it means) and no one that I know and that I've asked has any information on what I can do to fix it. </p>

<p>Thanks in advance!</p>

<p>EDIT: Here's the test_can_start_a_list_and_retrieve_it_later - just a note in case it's needed, but the def test_can... line number is 19.</p>

<pre><code>def test_can_start_a_list_and_retrieve_it_later(self):
    # Edith has heard about a cool new online to-do app. She goes
    # to check out its homepage
    self.browser.get(self.live_server_url)

    # She notices the page title and header mention to-do lists
    self.assertIn('To-Do', self.browser.title)
    header_text = self.browser.find_element_by_tag_name('h1').text
    self.assertIn('To-Do', header_text)

    # She is invited to enter a to-do item straight away
    inputbox = self.browser.find_element_by_id('id_new_item')
    self.assertEqual(
            inputbox.get_attribute('placeholder'),
            'Enter a to-do item'
    )

    # She types "Buy peacock feathers" into a text box (Edith's hobby
    # is tying fly-fishing lures)
    inputbox.send_keys('Buy peacock feathers')

    # When she hits enter, the page updates, and now the page lists
    # "1: Buy peacock feathers" as an item in a to-do list
    inputbox.send_keys(Keys.ENTER)
    edith_list_url = self.browser.current_url
    self.assertRegex(edith_list_url, '/lists/.+')
    self.check_for_row_in_list_table('1: Buy peacock feathers')

    # There is still a text box inviting her to add another item. She
    # enters "Use peacock feathers to make a fly" (Edith is very methodical)
    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)

    # The page updates again, and now shows both items on her list
    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')

    # Now a new user, Francis, comes along to the site.

    ##We use a new browser session to make sure that no information
    ##of Edith's is coming through from cookies etc
    self.browser.quit()
    self.browser = webdriver.Firefox()

    #Francis visits the home page. There is no sign of Edith's
    #list
    self.browser.get(self.live_server_url)
    page_text = self.browser.find_element_by_tag_name('body').text
    self.assertNotIn('Buy peacock feathers', page_text)
    self.assertNotIn('make a fly', page_text)

    #Francis starts a new list by entering a new item. He
    #is less interesting than Edith...
    inputbox = self.browser.find_element_by_id('id_new_item')
    inputbox.send_keys('Buy milk')
    inputbox.send_keys(Keys.ENTER)

    #Francis gets his own unique URL
    francis_list_url = self.browser.current_url
    self.assertRegex(francis_list_url, '/lists/.+')
    self.assertNotEqual(francis_list_url, edith_list_url)

    #Again, there is no trace of Edith's list
    page_text = self.browser.find_element_by_tag_name('body').text
    self.assertNotIn('Buy peacock feathers', page_text)
    self.assertIn('Buy milk', page_text)
    self.fail('Finish the test!')

    # Satisfied, they both go back to sleep
</code></pre>

<p>EDIT 2: Here's the check_for_row_in_list_table. Note that this starts on line 14 of the document.</p>

<pre><code>def check_for_row_in_list_table(self, row_text):
    table = self.browser.find_element_by_id('id_list_table')
    rows = table.find_elements_by_tag_name('tr')
    self.assertIn(row_text, [row.text for row in rows])
</code></pre>

<p>Found the error in my work. I was apparently missing an s in list.html</p>

<pre><code>&lt;form method="POST" action="/lists/{{ list.id }}/add_item"&gt;
</code></pre>

python traceback