Платформа робота с excel xlsx получает исключения «Ошибка значения: аргумент ‘col_num’ получил значение ‘data’, которое не может быть преобразовано в целое число «.

#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’, которое не может быть преобразовано в целое число.