[英]I got list of tuples instead of dictionary in robot framework
我想读取一个excel文件,所以我在机器人框架中写了这些关键字:
*** Settings ***
Library ExcelLibrary
Library Collections
Resource ../Variables/ConstantVariables.robot
Resource ../Variables/ConfigVariables.robot
*** Variables ***
*** Keywords ***
Read Data From Excel
[Arguments] ${filename} ${sheetname}
open excel ${filename}
@{excel_result} = Create List
${rows} = get_row_count ${sheetname}
:FOR ${rindex} IN RANGE 1 ${rows}
\ ${ret_val} = Get Row Values ${sheetname} ${rindex}
\ Append To List ${excel_result} ${ret_val}
[Return] ${excel_result}
Get All Values of the Row
[Arguments] ${sheetname} ${rowindex}
${cols} = get_column_count ${sheetname}
${vals} = Create Dictionary
${titles} = get_row_values ${sheetname} 0
:FOR ${cindex} IN RANGE 0 ${cols}
\ ${val} = read_cell_data_by_coordinates ${sheetname} ${cindex} ${rowindex}
\ Set To Dictionary ${vals} ${titles[0]} ${val}
[Return] ${vals}
这是方案文件:
*** Settings ***
Resource ../Variables/ConstantVariables.robot
Resource ../Variables/ConfigVariables.robot
Resource ../Keywords/CommonKeywords.robot
*** Test Cases ***
Test For Loop
@{ret_val} = Read Data From Excel ${jobfilename} ${jobsheetname}
log to console ${ret_val}
这是我得到的输出:
PS D:\Abbasimazar\workspace\RobotTests\Scenarios> pybot .\scenario.robot
==============================================================================
Scenario
==============================================================================
Test For Loop .[[('A2', u't1'), ('B2', u'n1'), ('C2', u'c1')], [
('A3', u't2'), ('B3', u'n2'), ('C3', u'c2')], [('A4', u't3'), ('B4', u'n3'), ('C4', u'c3')]]
Test For Loop | PASS |
------------------------------------------------------------------------------
Scenario | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Output: D:\Abbasimazar\workspace\RobotTests\Scenarios\output.xml
Log: D:\Abbasimazar\workspace\RobotTests\Scenarios\log.html
Report: D:\Abbasimazar\workspace\RobotTests\Scenarios\report.html
但是我希望得到这个:
[{'A2': u't1', 'B2': u'n1', 'C2': u'c1'}, {'A3': u't2', 'B3': u'n2', 'C3': u'c2'}, {'A4': u't3', 'B4': u'n3', 'C4': u'c3'}]
知道我做错了什么吗?
编辑1:
正如@ ombre42所说,调用关键字时出错。 我应该换行:
${ret_val} = Get Row Values ${sheetname} ${rindex}
成:
${ret_val} = Get All Values of the Row ${sheetname} ${rindex}
但是之后我注意到了
${titles} = get_row_values ${sheetname} 0
给我这个:
==============================================================================
Scenario
==============================================================================
Test For Loop .[{('A1', u'test'): u'c1'}, {('A1', u'test'): u'c2
'}, {('A1', u'test'): u'c3'}]
Test For Loop | PASS |
------------------------------------------------------------------------------
Scenario | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
所以我写了一种新的方法来获得标题:
Get Titles From Sheet
[Arguments] ${sheetname}
${cols} = get_column_count ${sheetname}
@{titles} = Create List
:FOR ${cindex} IN RANGE 0 ${cols}
\ ${val} = read_cell_data_by_coordinates ${sheetname} ${cindex} 0
\ Append To List ${titles} ${val}
[Return] ${titles}
并将该行更改为:
${titles} = Get Titles From Sheet ${sheetname}
现在的结果是我想要的:
==============================================================================
Scenario
==============================================================================
Test For Loop .[{u'test': u't1', u'name': u'n1', u'class': u'c1'
}, {u'test': u't2', u'name': u'n2', u'class': u'c2'}, {u'test': u't3', u'name': u'n3', u'class': u'c3'}]
Test For Loop | PASS |
------------------------------------------------------------------------------
Scenario | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
从Excel读取数据会调用“ 获取行值”而不是“ 获取行的 所有值” ,这会创建字典。 提供的代码中未使用“ 获取行的所有值” 。
也许您认为实际上是使用library关键字而从Excel读取数据时却使用了user关键字。
也许这是一个OrderedDict? OrderedDicts表示形式看起来像一个元组列表:
>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> d['x'] = 1
>>> d
OrderedDict([('x', 1)])
即使它是常规的元组列表而不是OrderedDict,将它们转换为dict也很简单,因为dict构造函数可以直接获取元组列表:
>>> dict([('x', 1)])
{'x': 1}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.