【问题标题】:Selenium freezes after waiting for element (Python)Selenium 在等待元素后冻结(Python)
【发布时间】:2013-08-14 18:30:53
【问题描述】:

我们使用 Selenium 和 django-selenium (SeleniumTestCase) 的 Python 绑定来进行 Selenium 测试。在我们测试的页面上,有几秒钟延迟后创建的 HTML 元素。所以我们想等他们再继续测试。等待本身有效,但等待调用后的每个命令都失败:

class SomeTestCase(SeleniumTestCase):
    def test_something(self):
        ... (some testing code that works)
        self.driver.wait_element_present('span.available')  # this works
        self.driver.wait_element_present('span.connected')  # this works, too
        self.driver.find_element_by_css_selector('body')  # this fails

我调试了 selenium 代码,发现“find_element_by_css_selector”在内部向 selenium 服务器发布了一个 HTTP 请求(就像每个“检查 xxx 是否存在”命令一样):

http://127.0.0.1:42735/hub/session/<session-id>/element

但是这个请求返回状态码 500 和这个响应文本:

{
    "status": 13,
    "value": {
        "message": "JSON.parse: unexpected non-digit",
        "stackTrace": [
            {
                "methodName": "Dispatcher.executeAs/<",
                "fileName": "file:///tmp/tmpnUT34U/extensions/fxdriver@googlecode.com/components/driver_component.js",
                "lineNumber": 7354
            },
            {
                "methodName": "Resource.prototype.handle",
                "fileName": "file:///tmp/tmpnUT34U/extensions/fxdriver@googlecode.com/components/driver_component.js",
                "lineNumber": 7516
            },
            {
                "methodName": "Dispatcher.prototype.dispatch",
                "fileName": "file:///tmp/tmpnUT34U/extensions/fxdriver@googlecode.com/components/driver_component.js",
                "lineNumber": 7463
            },
            {
                "methodName": "WebDriverServer/<.handle",
                "fileName": "file:///tmp/tmpnUT34U/extensions/fxdriver@googlecode.com/components/driver_component.js",
                "lineNumber": 10152
            },
            {
                "fileName": "file:///tmp/tmpnUT34U/extensions/fxdriver@googlecode.com/components/httpd.js",
                "lineNumber": 1935
            },
            {
                "methodName": "ServerHandler.prototype.handleResponse",
                "fileName": "file:///tmp/tmpnUT34U/extensions/fxdriver@googlecode.com/components/httpd.js",
                "lineNumber": 2261
            },
            {
                "methodName": "Connection.prototype.process",
                "fileName": "file:///tmp/tmpnUT34U/extensions/fxdriver@googlecode.com/components/httpd.js",
                "lineNumber": 1168
            },
            {
                "methodName": "RequestReader.prototype._handleResponse",
                "fileName": "file:///tmp/tmpnUT34U/extensions/fxdriver@googlecode.com/components/httpd.js",
                "lineNumber": 1616
            },
            {
                "methodName": "RequestReader.prototype._processBody",
                "fileName": "file:///tmp/tmpnUT34U/extensions/fxdriver@googlecode.com/components/httpd.js",
                "lineNumber": 1464
            },
            {
                "methodName": "RequestReader.prototype.onInputStreamReady",
                "fileName": "file:///tmp/tmpnUT34U/extensions/fxdriver@googlecode.com/components/httpd.js",
                "lineNumber": 1333
            }
        ]
    }
}

因此,整个测试运行会阻塞并在默认超时后中止。 根据https://code.google.com/p/selenium/wiki/JsonWireProtocol,状态 13 表示“UnknownError”,这并没有让事情更清楚;-)

有没有人也发现了这个?有没有办法解决这个问题?我真的不知道确切的原因可能是什么,我们的页面结构是干净的 html 代码。感谢您的任何建议!

【问题讨论】:

  • 方法find_element_by_css_selector 是否仅对参数'body' 失败,还是对您传入的其他值也失败?定位器应该找到哪些元素似乎有所不同?
  • 无论我们试图找到哪个元素,它都会失败。
  • @dArignac 你是如何验证“find_element_by_css_selector”内部向 selenium 服务器发布 HTTP 请求的?我在使用 selenium 时遇到了同样的问题。
  • 我通过代码调试到 selenium python 代码发布到它自己的 selenium 服务器的地方,我检查了返回的内容。由于我已经删除了调试输出,我无法告诉你我在哪里找到它,抱歉。
  • 您是否尝试过使用find_element_by_tag_namefind_element_by_xpath

标签: python selenium


【解决方案1】:

派对迟到了,但是--

wait_element_present 不是 Selenium 绑定。它来自另一个名为 MyDriver https://django-selenium.readthedocs.org/en/latest/#mydriver-class 的库中的自定义类

Selenium 显式等待不仅仅是一个简单的函数:http://selenium-python.readthedocs.org/waits.html#explicit-waits

find_element_by_css_selector 是 webdriver 的 Selenium 绑定,而 MyDriver 没有同名的方法。

要使用自定义类来运行 Selenium webdriver,您需要使用它提供的方法(或编写您自己的方法)。在这种情况下,MyDriver 有一个名为 find 的方法,它接受一个 CSS 选择器作为参数并返回元素,这完成了您想要使用 find_element_by_css_selector 执行的操作。 https://github.com/dragoon/django-selenium/blob/master/django_selenium/testcases.py

【讨论】:

    猜你喜欢
    • 2013-01-01
    • 2016-12-29
    • 2012-04-07
    • 2021-09-27
    • 2014-03-05
    • 2014-05-07
    • 1970-01-01
    • 2018-06-11
    • 2020-06-12
    相关资源
    最近更新 更多