#python #excel #robotframework
#python #excel #robotframework
Вопрос:
Попытка включить excel.xlsx в Robot Framework, но получаю исключения: «ValueError: аргумент ‘col_num’ получил значение ‘data’, которое не может быть преобразовано в целое число». Пожалуйста, помогите!!
Код:
*** Settings ***
Library ExcelLibrary
Library OperatingSystem
Library robot.api.logger
*** Variables ***
${sFileName} ${EXECDIR}\TestData\TestSheet.xlsx # DataSheet
*** Test Cases ***
TC_01_Taking URL from Excel
Open given Excel file ${sFileName}
#Fetch the data from Excel for given Test Case and Column Name SheetName Row Column
${sURL} Get data from Excel with given column data TC_02 Browser
Log ${sURL}
*** Keywords ***
Open given Excel file
[Arguments] ${sFileName}
#Check that the given Excel Exists
${inputfileStatus} ${msg} Run Keyword And Ignore Error OperatingSystem.File Should Exist ${sFileName}
Run Keyword If "${inputfileStatus}"=="PASS" info ${sFileName} Test data file exist ELSE Fail Cannot locate the given Excel file.
Open Excel File ${sFileName}
Get data from Excel with given column
[Arguments] ${sSheetName} ${sTestCaseNo} ${sColumnName}
log ${sColumnName}
**${colCount} Read Excel Column ${sSheetName}**#Fails here
FOR ${y} IN RANGE 0 ${colCount}
${header} Read Excel Cell ${sSheetName} ${y} 0
#Check if this is the given header
Run Keyword If "${header}"=="${sColumnName}" Set Test Variable ${colNum} ${y}
END
log ${colNum}
#Get the total rows in the Sheet
${iTotalRows} ExcelLibrary.Read Excel Row ${sSheetName}
FOR ${iRowNo} IN RANGE 1 ${iTotalRows} 1
${TC_Num} Read Excel Cell ${sSheetName} 0 ${iRowNo}
#Incase TestCase No is same , fetch the data from same row and given column No
${sSearchedData} Run Keyword If "${sTestCaseNo}"=="${TC_Num}" ExcelLibrary.Read Excel Cell ${sSheetName} ${colNum}
... ${iRowNo}
Run Keyword If "${sTestCaseNo}"=="${TC_Num}" Exit For Loop
END
[Return] ${sSearchedData}
Кроме того, вот ключевое слово python внутри библиотеки ExcelLibrary.py:
from io import BytesIO
from typing import Any, Dict, Iterator, List, Optional, Tuple
import openpyxl
from openpyxl.cell import Cell
from openpyxl.worksheet.worksheet import Worksheet
def read_excel_column(self, col_num: int, row_offset: int = 0, max_num: int = 0,
sheet_name: str = None) -> List[Any]:
col_num = int(col_num)
row_offset = int(row_offset)
max_num = int(max_num)
sheet = self.get_sheet(sheet_name)
row_iter: Iterator[Tuple[Cell]] = sheet.iter_rows(min_col=col_num, max_col=col_num,
min_row=1 row_offset,
max_row=row_offset max_num)
Прилагается файл данных ‘TestSheet.xlsx «.
Ответ №1:
Ваш метод read_excel_column()
имеет 4 параметра, все со значениями по умолчанию (мы немного поговорим о «self»). Когда вы вызываете его с менее чем 4 аргументами, интерпретатор начнет передавать их в том же порядке. Это означает, что если вы вызовете его с 2 аргументами, первый перейдет к параметру «col_num», второй — к параметру «row_offset». Таким образом, когда вы его вызывали:
${colCount} Read Excel Column ${sSheetName}
, вы фактически переходите ${sSheetName}
к параметру «col_num», и — вы получаете ошибку, значение не может быть преобразовано в int.
Это легко решить — просто вызовите метод с именованными параметрами, явно указав, для какого параметра используется аргумент:
${colCount} Read Excel Column 1 sheet_name=${sSheetName}
Поэтому, когда интерпретатор python переходит к выполнению метода, он передает значение в правильный параметр.
О «self», почему я не учитывал его в количестве параметров — потому что этот 1-й используется в методах класса для автоматической передачи экземпляра класса. Приведенный вами пример кода является read_excel_column()
функцией, а не методом в классе, но я предполагаю, что ваш фактический код относится к классу (в противном случае, если это действительно автономная функция, «self» — это просто параметр, подобный любому другому, он получит переданное вами значение и будетне выдавать эту ошибку).
Комментарии:
1. Спасибо за ценный ответ. Я добавил col_num = $ {sSheetName}, но не работает, получая ту же ошибку. Я не создавал код python ‘ExcelLibrary.py ‘, но это библиотека, созданная самой командой robot framework.
2. @RN я допустил ошибку (копирования и вставки) — фактический параметр — «sheet_number», я отредактировал ответ.
3. к сожалению, обновлена строка sheet_number= $ {sSheetName}, но не работает. В переменной ‘$ {sSheetName}’, которую я передаю, данные имени листа Excel настраиваются на уровне тестового примера. Вероятно, запуск кода в редакторе python может дать четкую картину. Что вы думаете?
4. Когда вы говорите, что он не работает, что вы имеете в виду — какую ошибку он генерирует?
5. Те же исключения: ошибка значения: аргумент ‘col_num’ получил значение ‘sheet_number»= data’, которое не может быть преобразовано в целое число.