意外的类型错误python

时间:2016-12-15 22:08:11

标签: python websocket

我正在尝试创建一个客户端,用于主要异步测试服务器的响应。我创建了一个基本上等待来自服务器的下一个响应的函数,如果在调用此函数时提供了requestId,它将查找提供了requestId的下一个响应。这是功能:

def getNextResponse(self, requestId = None):
    logger = logging.getLogger(__name__)
    self.acknowledge += 1
    logger.info("requestId ack for this response: {}".format(requestId))
    while(not self.response):
        pass
    self.acknowledge -= 1
    logger.info("requestId unset for this response: {}".format(requestId))
    message = json.loads(self.messagesList[len(self.messagesList)-1])

    if(requestId != None):
        while(requestId != message['body']['requestId']):
            self.acknowledge += 1
            while(not self.response):
                pass    
            self.acknowledge -= 1
            message = self.messagesList[len(self.messagesList)-1]

    self.startMonitor -= 1       
    return message['body']

我也有每个命令的辅助函数,可以发送到下面的引擎是ping命令的一个帮助函数:

 def ping(self, sessionId = None, requestId = None, version="1.0"):
    result = {
        "method": "Ping"
        }
    if(None != version):
        result['version'] = version
    if(None != sessionId):
        result['sessionId'] = sessionId
    if(None != requestId):
        result['requestId'] = requestId
    logger = logging.getLogger(__name__)
    logger.info("Message Sent: " + json.dumps(result, indent=4))
    self.startMonitor += 1
    self.ws.send(json.dumps(result))
    message = self.getNextResponse(requestId = requestId)

    return message

它基本上设置了一个json对象,它包含服务器所需的所有参数,然后将整个json消息发送到服务器。在发送之后,我调用getNextResponse来等待服务器的响应。 requestId默认设置为None,因此如果没有提供requestId,它将只查找服务器返回的下一个响应。由于其他异步命令可能会非常不一致,因此可以为命令提供唯一的requestId,以便来自服务器的响应也将包含此requestId,从而使每个响应都是唯一的。

在我的测试用例中,我使用:

生成一个随机requestId
def genRequestId(self):
    x = random.randint(10000000, 99999999)
    print x
    reqId = str(x)+"-97a2-11e6-9346-fde5d2234523"
    return reqId  

我遇到的问题是有时(似乎是随机的),当我在我的一个测试用例中调用ping时,我收到此错误:

message = self.getNextResponse(requestId = requestId)
TypeError: string indices must be integers, not str

我对这个错误很困惑,我在ping内生成的requestId应该是一个字符串,我不会以任何方式引用它。我已经尝试删除对参数的引用,如下所示:

message = self.getNextResponse(requestId)

但我仍然收到此错误。 getNextResponse函数内部的错误没有更深入,这让我相信当我尝试调用它时它来自ping函数内部。任何帮助将不胜感激!

编辑:这是错误

追踪(最近一次通话): 在test009_recTimer_Start_withAudio中输入文件“ctetest./RegressionTest/WebsocketTest\test_18_RecTimer.py”,第385行     response = client.endSession(sessionId = sessionId,requestId = requestId_2)

文件“ctetest./RegressionTest/WebsocketTest../.././CTESetupClass\WebsocketCl ient.py“,第528行,在endSession中     message = self.getNextResponse(requestId)   文件“ctetest./RegressionTest/WebsocketTest../.././CTESetupClass\WebsocketCl 包装器中的第49行“ient.py”     提升 TypeError:字符串索引必须是整数,而不是str

1 个答案:

答案 0 :(得分:0)

您的代码中有两个看起来非常相似的语句:

message = json.loads(self.messagesList[len(self.messagesList)-1])

然后再往下走:

        message = self.messagesList[len(self.messagesList)-1]

第一个会将message设置为一个json对象(可能是dict),其中第二个将message分配给一个字符串,我假设这不是意图而且是你的错误。