【问题标题】:Selenium not recognizing user input in PythonSelenium 无法识别 Python 中的用户输入
【发布时间】:2015-08-15 17:16:34
【问题描述】:

我正在研究一个书籍存储库,特别是测试驱动开发的第 5 章,可以在这个存储库中找到它:https://github.com/hjwp/book-example/tree/chapter_05。当我尝试运行功能测试时,创建一个简单的 POST 表单,提交一些输入,然后检查输入是否已呈现,我收到以下错误:

======================================================================
FAIL: test_can_start_a_list_and_retrieve_it_later (__main__.NewVisitorTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "book-example-chapter_05/functional_tests.py", line 45, in test_can_start_a_list_and_retrieve_it_later
    self.check_for_row_in_list_table('1: Buy peacock feathers')
  File "book-example-chapter_05/functional_tests.py", line 18, in check_for_row_in_list_table
    self.assertIn(row_text, [row.text for row in rows])
AssertionError: '1: Buy peacock feathers' not found in ['']

---------------------------------------------------------------------

从邮件列表上的讨论看来,这可能是由于浏览器没有收到“ENTER”键。当我将行更改为inputbox.send_keys('Buy peacock feathers\n'),直接发送一个换行符时,我收到以下错误:

======================================================================
ERROR: test_can_start_a_list_and_retrieve_it_later (__main__.NewVisitorTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "book-example-chapter_05/functional_tests.py", line 44, in test_can_start_a_list_and_retrieve_it_later
    inputbox.send_keys(Keys.ENTER)
  File "/Users/r/virtualenvs/r/bin/python3venv/lib/python3.4/site-packages/selenium/webdriver/remote/webelement.py", line 322, in send_keys
    self._execute(Command.SEND_KEYS_TO_ELEMENT, {'value': typing})
  File "/Users/r/virtualenvs/r/bin/python3venv/lib/python3.4/site-packages/selenium/webdriver/remote/webelement.py", line 448, in _execute
    return self._parent.execute(command, params)
  File "/Users/r/virtualenvs/r/bin/python3venv/lib/python3.4/site-packages/selenium/webdriver/remote/webdriver.py", line 196, in execute
    self.error_handler.check_response(response)
  File "/Users/r/virtualenvs/r/bin/python3venv/lib/python3.4/site-packages/selenium/webdriver/remote/errorhandler.py", line 181, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: Element not found in the cache - perhaps the page has changed since it was looked up
Stacktrace:
    at fxdriver.cache.getElementAt (resource://fxdriver/modules/web-element-cache.js:9348)
    at Utils.getElementAt (file:///var/folders/k5/t81w4vh94rg1ps_h5tb_vbr00000gn/T/tmp0cz8wkgo/extensions/fxdriver@googlecode.com/components/command-processor.js:8942)
    at fxdriver.preconditions.visible (file:///var/folders/k5/t81w4vh94rg1ps_h5tb_vbr00000gn/T/tmp0cz8wkgo/extensions/fxdriver@googlecode.com/components/command-processor.js:9980)
    at DelayedCommand.prototype.checkPreconditions_ (file:///var/folders/k5/t81w4vh94rg1ps_h5tb_vbr00000gn/T/tmp0cz8wkgo/extensions/fxdriver@googlecode.com/components/command-processor.js:12626)
    at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/k5/t81w4vh94rg1ps_h5tb_vbr00000gn/T/tmp0cz8wkgo/extensions/fxdriver@googlecode.com/components/command-processor.js:12643)
    at fxdriver.Timer.prototype.setTimeout/<.notify (file:///var/folders/k5/t81w4vh94rg1ps_h5tb_vbr00000gn/T/tmp0cz8wkgo/extensions/fxdriver@googlecode.com/components/command-processor.js:623)

----------------------------------------------------------------------
Ran 1 test in 5.511s

所以这似乎表明 DOM 树存在错误,并且它试图找到的下一个元素(一个 id 等于 'id_list_table' 的元素)找不到。

为什么会这样?如何让 Selenium 测试添加的列表项及其在我创建的表中的存在?

【问题讨论】:

    标签: python django selenium


    【解决方案1】:

    原来 selenium runserver 命令对于每个应用程序都是唯一的——我正在从新的(正确的)存储库运行功能测试,但我没有使用新的存储库重新启动服务器,我使用的是使用我的旧存储库启动的服务器。重新启动服务器,它现在按预期工作。

    【讨论】:

      【解决方案2】:

      我认为您不想使用\n。如果你想通过 selenium 发送回车键,你会这样做:

       inputbox.send_keys('Buy peacock feathers')
       inputbox.send_keys(Keys.ENTER)
      

      \n 是换行符。这基本上意味着它结束了当前行。看看this stackoverflow answer 的详细解释。

      【讨论】:

      • 感谢您的评论。是的,我已经尝试使用您推荐的语法 - 这实际上是存储库中的原始语法。不幸的是,这导致了我原来问题中的第一条错误消息。
      • 你是直接使用github repo的代码吗?
      • 是的。我正在使用第 5 章分支中的代码。没有任何修改,它给了我发布的第一条错误消息。我已经尝试在 python 2 和 python 3 中运行它,尽管它打算在 python 3 中运行。
      • 它适用于我的 2.7。尝试用inputbox.send_keys(u'\ue007') 代替inputbox.send_keys(Keys.ENTER)?另外,您的 list_items 表是什么样的?
      • @orange1 实际上第一个错误不是错误。这是您的测试断言失败。
      【解决方案3】:

      我也遇到了这个问题。我错过了home.htmlinput 上的name=item_text

      我不知道为什么我在view 中忘记了这一点,request.POST.get('item_text', '')name 查找input

      【讨论】:

        【解决方案4】:

        我以前见过这种问题,为了解决这个问题,我通常先尝试提交,然后发送return key

        这是我的自定义包装类的摘录。 elem 将是您的输入元素。

            try:
                self.debug("Trying regular submit")
                elem.submit()
            except:
                self.debug("Regular submit failed, sending RETURN key")
                elem.send_keys(Keys.RETURN)
        

        【讨论】:

        • +1 用于使用 submit() 方法,这为我解决了 Keys.ENTER 将 \ue007 添加到输出的问题。我没有看到,为什么你会在它周围放置一个异常处理程序,特别是在捕获实际类型时使用一个包罗万象的处理程序会稍微阐明推理。
        猜你喜欢
        • 1970-01-01
        • 2013-10-12
        • 1970-01-01
        • 2020-06-04
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多