IndexError masks failures from JavaScript extension keywords with *args

Abierto Apto para principiantes
#5,306 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
75/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
testing

Línea de trabajo

Empieza con _get_selector_value_from_keyword_call() en Browser/browser.py y sigue cómo asigna los valores pasados a la firma de la keyword. Reproduce el problema con la extensión de JavaScript y la prueba de Robot proporcionadas. Se considera terminado cuando el error informa del error original boom: ["a","b"] en lugar de lanzar IndexError.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

priority: high

Describe the bug
When a JavaScript extension keyword declares a parameter named args and is called with multiple positional arguments, a keyword failure can be replaced by an IndexError during Browser’s failure handling. This hides the original exception and makes the failure difficult to diagnose.

To Reproduce
Steps to reproduce the behavior:
JavaScript extension:

async function boom(args) {
  throw new Error(`boom: ${JSON.stringify(args)}`);
}

exports.Boom = boom;

Robot test:

*** Test Cases ***
Failure Should Preserve Original Error
    Boom    a    b

Expected behavior
The JavaScript keyword receives both values, but the failure handling path raises IndexError: list index out of range while inspecting the keyword arguments, instead of reporting the original boom: ["a","b"] error.

cause
The generated Python signature turns a JavaScript parameter called args into *args. When _get_selector_value_from_keyword_call() tries to match the values passed to the keyword with the keyword signature, it checks the actual values instead of the signature itself. With multiple values, it can end up looking past the end of the signature and throw an IndexError.

suggested fix
Change _get_selector_value_from_keyword_call() method to:

    def _get_selector_value_from_keyword_call(self, name, args, kwargs):
        selector = kwargs.get("selector")
        if not selector and args:
            arguments = self.get_keyword_arguments(name)
            for i, arg in enumerate(args):
                if i >= len(arguments):
                    break
                spec = arguments[i][0] if isinstance(arguments[i], tuple) else arguments[i]
                if spec.startswith("*"):
                    break
                if spec.startswith("selector"):
                    selector = arg
                    break
        return selector

Desktop (please complete the following information):

  • OS: Windows 11
  • Browser: chromium
  • Version: 151.0.7922.34
Lenguaje dominante
Python
Estrellas
662
Forks
149
Merge medio
6 h 13 min
PR fusionados (30 d)
121

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de MarketSquare/robotframework-browser

Todos los issues de MarketSquare/robotframework-browser

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.